@eeplatform/core 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -11354,6 +11354,7 @@ __export(src_exports, {
11354
11354
  MOrder: () => MOrder,
11355
11355
  MOrg: () => MOrg,
11356
11356
  MPaymentMethod: () => MPaymentMethod,
11357
+ MPlantilla: () => MPlantilla,
11357
11358
  MPromoCode: () => MPromoCode,
11358
11359
  MRegion: () => MRegion,
11359
11360
  MRole: () => MRole,
@@ -11391,6 +11392,7 @@ __export(src_exports, {
11391
11392
  schemaBuilding: () => schemaBuilding,
11392
11393
  schemaBuildingUnit: () => schemaBuildingUnit,
11393
11394
  schemaDivision: () => schemaDivision,
11395
+ schemaPlantilla: () => schemaPlantilla,
11394
11396
  schemaRegion: () => schemaRegion,
11395
11397
  schemaSchool: () => schemaSchool,
11396
11398
  schemaStockCard: () => schemaStockCard,
@@ -11415,6 +11417,7 @@ __export(src_exports, {
11415
11417
  useFileController: () => useFileController,
11416
11418
  useFileRepo: () => useFileRepo,
11417
11419
  useFileService: () => useFileService,
11420
+ useGitHubService: () => useGitHubService,
11418
11421
  useInvoiceController: () => useInvoiceController,
11419
11422
  useInvoiceModel: () => useInvoiceModel,
11420
11423
  useInvoiceRepo: () => useInvoiceRepo,
@@ -11433,6 +11436,8 @@ __export(src_exports, {
11433
11436
  usePaymentModel: () => usePaymentModel,
11434
11437
  usePaymentRepo: () => usePaymentRepo,
11435
11438
  usePaypalService: () => usePaypalService,
11439
+ usePlantillaController: () => usePlantillaController,
11440
+ usePlantillaRepo: () => usePlantillaRepo,
11436
11441
  usePriceController: () => usePriceController,
11437
11442
  usePriceModel: () => usePriceModel,
11438
11443
  usePriceRepo: () => usePriceRepo,
@@ -11455,6 +11460,7 @@ __export(src_exports, {
11455
11460
  useUserController: () => useUserController,
11456
11461
  useUserRepo: () => useUserRepo,
11457
11462
  useUserService: () => useUserService,
11463
+ useUtilController: () => useUtilController,
11458
11464
  useVerificationController: () => useVerificationController,
11459
11465
  useVerificationRepo: () => useVerificationRepo,
11460
11466
  useVerificationService: () => useVerificationService,
@@ -11512,6 +11518,24 @@ function useVerificationRepo() {
11512
11518
  });
11513
11519
  });
11514
11520
  }
11521
+ async function createIndexes() {
11522
+ try {
11523
+ await collection.createIndexes([
11524
+ { key: { email: 1 } },
11525
+ { key: { type: 1 } },
11526
+ { key: { status: 1 } },
11527
+ { key: { "metadata.org": 1 } },
11528
+ { key: { email: "text" } },
11529
+ {
11530
+ key: { expiredAt: 1 },
11531
+ expireAfterSeconds: 0,
11532
+ name: "ttl_expiredAt_index"
11533
+ }
11534
+ ]);
11535
+ } catch (error) {
11536
+ throw new import_nodejs_utils2.InternalServerError("Failed to create indexes.");
11537
+ }
11538
+ }
11515
11539
  async function createIndex() {
11516
11540
  try {
11517
11541
  await collection.createIndex([
@@ -11734,9 +11758,7 @@ function useVerificationRepo() {
11734
11758
  }
11735
11759
  }
11736
11760
  return {
11737
- createIndex,
11738
- createTextIndex,
11739
- createUniqueIndex,
11761
+ createIndexes,
11740
11762
  add,
11741
11763
  getVerifications,
11742
11764
  getById,
@@ -13121,7 +13143,7 @@ function useVerificationService() {
13121
13143
  type: "user-sign-up",
13122
13144
  email,
13123
13145
  metadata,
13124
- expireAt: new Date((/* @__PURE__ */ new Date()).getTime() + 5 * 60 * 1e3).toISOString(),
13146
+ expireAt: new Date((/* @__PURE__ */ new Date()).getTime() + 5 * 60 * 1e3),
13125
13147
  // 5mins from now
13126
13148
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
13127
13149
  };
@@ -25634,7 +25656,7 @@ function useRegionService() {
25634
25656
  {
25635
25657
  id: region.toString(),
25636
25658
  name: "Admin",
25637
- type: "region",
25659
+ type: "basic-edu-ro",
25638
25660
  permissions: ["*"],
25639
25661
  status: "active",
25640
25662
  default: true
@@ -26186,7 +26208,7 @@ function useDivisionService() {
26186
26208
  {
26187
26209
  id: division.toString(),
26188
26210
  name: "Admin",
26189
- type: "division",
26211
+ type: "basic-edu-sdo",
26190
26212
  permissions: ["*"],
26191
26213
  status: "active",
26192
26214
  default: true
@@ -29150,6 +29172,686 @@ function useStockCardController() {
29150
29172
  getSuppliers
29151
29173
  };
29152
29174
  }
29175
+
29176
+ // src/services/github.service.ts
29177
+ var import_nodejs_utils80 = require("@eeplatform/nodejs-utils");
29178
+ var import_rest = require("@octokit/rest");
29179
+ var import_libsodium_wrappers = __toESM(require("libsodium-wrappers"));
29180
+ function useGitHubService() {
29181
+ function parseRepoUrl(url2) {
29182
+ const match = url2.match(/github\.com[:\/]([^\/]+)\/(.+)\.git$/);
29183
+ if (!match)
29184
+ throw new Error("Invalid GitHub repo URL");
29185
+ return { owner: match[1], repo: match[2] };
29186
+ }
29187
+ async function checkAdminPermission(owner, repo, octokit) {
29188
+ try {
29189
+ const { data: repoData } = await octokit.repos.get({ owner, repo });
29190
+ if (!repoData.permissions?.admin) {
29191
+ throw new import_nodejs_utils80.BadRequestError(
29192
+ "You do not have admin access to this repository."
29193
+ );
29194
+ }
29195
+ } catch (error) {
29196
+ if (error.status === 404) {
29197
+ throw new import_nodejs_utils80.BadRequestError(
29198
+ "Repository not found or you don't have access to it."
29199
+ );
29200
+ } else if (error.status === 401) {
29201
+ throw new import_nodejs_utils80.BadRequestError(
29202
+ "Invalid GitHub token or insufficient permissions."
29203
+ );
29204
+ } else if (error.message.includes("admin access")) {
29205
+ throw error;
29206
+ } else {
29207
+ throw new import_nodejs_utils80.BadRequestError(
29208
+ `Failed to check repository permissions: ${error.message}`
29209
+ );
29210
+ }
29211
+ }
29212
+ }
29213
+ async function setVariables(params) {
29214
+ try {
29215
+ const { githubToken, repoUrl, environment, type, keyValues } = params;
29216
+ const octokit = new import_rest.Octokit({ auth: githubToken });
29217
+ const { owner, repo } = parseRepoUrl(repoUrl);
29218
+ await checkAdminPermission(owner, repo, octokit);
29219
+ const lines = keyValues.split(/[\n\r\s\t]+/).map((l) => l.trim()).filter(Boolean);
29220
+ for (const line of lines) {
29221
+ const equalIndex = line.indexOf("=");
29222
+ if (equalIndex === -1)
29223
+ continue;
29224
+ const key = line.substring(0, equalIndex).trim();
29225
+ const value = line.substring(equalIndex + 1).trim();
29226
+ if (!key || !value)
29227
+ continue;
29228
+ if (type === "secret") {
29229
+ const { data: publicKeyRes } = await octokit.actions.getEnvironmentPublicKey({
29230
+ owner,
29231
+ repo,
29232
+ environment_name: environment
29233
+ });
29234
+ try {
29235
+ await import_libsodium_wrappers.default.ready;
29236
+ const sodium = import_libsodium_wrappers.default;
29237
+ const publicKeyBase64 = publicKeyRes.key;
29238
+ if (!publicKeyBase64) {
29239
+ throw new Error("No public key received from GitHub");
29240
+ }
29241
+ const keyBytes = new Uint8Array(
29242
+ Buffer.from(publicKeyBase64, "base64")
29243
+ );
29244
+ const valueBytes = new Uint8Array(Buffer.from(value, "utf8"));
29245
+ const encryptedBytes = sodium.crypto_box_seal(valueBytes, keyBytes);
29246
+ const encryptedValue = Buffer.from(encryptedBytes).toString("base64");
29247
+ await octokit.actions.createOrUpdateEnvironmentSecret({
29248
+ owner,
29249
+ repo,
29250
+ environment_name: environment,
29251
+ secret_name: key,
29252
+ encrypted_value: encryptedValue,
29253
+ key_id: publicKeyRes.key_id
29254
+ });
29255
+ } catch (encryptionError) {
29256
+ throw new import_nodejs_utils80.BadRequestError(
29257
+ `Failed to encrypt secret '${key}': ${encryptionError.message}`
29258
+ );
29259
+ }
29260
+ } else if (type === "env") {
29261
+ await octokit.actions.createEnvironmentVariable({
29262
+ owner,
29263
+ repo,
29264
+ environment_name: environment,
29265
+ name: key,
29266
+ value
29267
+ });
29268
+ }
29269
+ }
29270
+ return `Successfully set ${lines.length} ${type} variables/secrets in environment '${environment}'`;
29271
+ } catch (error) {
29272
+ if (error instanceof import_nodejs_utils80.AppError)
29273
+ throw error;
29274
+ if (error.status === 422) {
29275
+ throw new import_nodejs_utils80.BadRequestError(
29276
+ `GitHub API validation error: ${error.message}`
29277
+ );
29278
+ } else if (error.status === 404) {
29279
+ throw new import_nodejs_utils80.BadRequestError("Environment or repository not found.");
29280
+ } else if (error.status === 403) {
29281
+ throw new import_nodejs_utils80.BadRequestError(
29282
+ "Forbidden: Insufficient permissions or rate limit exceeded."
29283
+ );
29284
+ } else if (error.message.includes("admin access") || error.message.includes("permissions")) {
29285
+ throw error;
29286
+ } else {
29287
+ throw new import_nodejs_utils80.BadRequestError(
29288
+ `Failed to set GitHub variables: ${error.message}`
29289
+ );
29290
+ }
29291
+ }
29292
+ }
29293
+ return {
29294
+ setVariables
29295
+ };
29296
+ }
29297
+
29298
+ // src/controllers/util.controller.ts
29299
+ var import_joi40 = __toESM(require("joi"));
29300
+ var import_nodejs_utils81 = require("@eeplatform/nodejs-utils");
29301
+ function useUtilController() {
29302
+ async function healthCheck(req, res, next) {
29303
+ try {
29304
+ res.status(200).json({
29305
+ success: true,
29306
+ message: "Util service is healthy",
29307
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
29308
+ data: {
29309
+ availableEndpoints: [
29310
+ "POST /github/variables - Set GitHub environment variables or secrets"
29311
+ ],
29312
+ keyValueFormat: "KEY=value pairs separated by newlines, spaces, or tabs"
29313
+ }
29314
+ });
29315
+ } catch (error) {
29316
+ import_nodejs_utils81.logger.error("Health check failed", { error: error.message });
29317
+ next(new import_nodejs_utils81.InternalServerError("Health check failed"));
29318
+ }
29319
+ }
29320
+ async function setGitHubVariables(req, res, next) {
29321
+ try {
29322
+ const { githubToken, repoUrl, environment, type, keyValues } = req.body;
29323
+ const validation = import_joi40.default.object({
29324
+ githubToken: import_joi40.default.string().required().messages({
29325
+ "string.empty": "GitHub token is required",
29326
+ "any.required": "GitHub token is required"
29327
+ }),
29328
+ repoUrl: import_joi40.default.string().uri().required().messages({
29329
+ "string.empty": "Repository URL is required",
29330
+ "string.uri": "Repository URL must be a valid URL",
29331
+ "any.required": "Repository URL is required"
29332
+ }),
29333
+ environment: import_joi40.default.string().required().messages({
29334
+ "string.empty": "Environment name is required",
29335
+ "any.required": "Environment name is required"
29336
+ }),
29337
+ type: import_joi40.default.string().valid("env", "secret").required().messages({
29338
+ "any.only": 'Type must be either "env" or "secret"',
29339
+ "any.required": "Type is required"
29340
+ }),
29341
+ keyValues: import_joi40.default.string().required().messages({
29342
+ "string.empty": "Key-value pairs are required",
29343
+ "any.required": "Key-value pairs are required"
29344
+ })
29345
+ });
29346
+ const { error } = validation.validate({
29347
+ githubToken,
29348
+ repoUrl,
29349
+ environment,
29350
+ type,
29351
+ keyValues
29352
+ });
29353
+ if (error) {
29354
+ next(new import_nodejs_utils81.BadRequestError(error.message));
29355
+ return;
29356
+ }
29357
+ const repoUrlPattern = /github\.com[:\/]([^\/]+)\/(.+)\.git$/;
29358
+ if (!repoUrlPattern.test(repoUrl)) {
29359
+ next(
29360
+ new import_nodejs_utils81.BadRequestError(
29361
+ "Invalid GitHub repository URL format. Expected format: https://github.com/owner/repo.git"
29362
+ )
29363
+ );
29364
+ return;
29365
+ }
29366
+ const lines = keyValues.split(/[\n\r\s\t]+/).map((l) => l.trim()).filter(Boolean);
29367
+ const invalidLines = lines.filter(
29368
+ (line) => !line.includes("=") || line.indexOf("=") === -1
29369
+ );
29370
+ if (invalidLines.length > 0) {
29371
+ next(
29372
+ new import_nodejs_utils81.BadRequestError(
29373
+ "Invalid key-value format. Each pair should be in format: KEY=value. Pairs can be separated by newlines, spaces, or tabs."
29374
+ )
29375
+ );
29376
+ return;
29377
+ }
29378
+ const githubService = useGitHubService();
29379
+ const result = await githubService.setVariables({
29380
+ githubToken,
29381
+ repoUrl,
29382
+ environment,
29383
+ type,
29384
+ keyValues
29385
+ });
29386
+ import_nodejs_utils81.logger.info(`GitHub variables set successfully`, {
29387
+ repoUrl,
29388
+ environment,
29389
+ type,
29390
+ count: lines.length
29391
+ });
29392
+ res.status(200).json({
29393
+ success: true,
29394
+ message: result,
29395
+ data: {
29396
+ repoUrl,
29397
+ environment,
29398
+ type,
29399
+ variablesSet: lines.length
29400
+ }
29401
+ });
29402
+ } catch (error) {
29403
+ import_nodejs_utils81.logger.error("Failed to set GitHub variables", {
29404
+ error: error.message,
29405
+ stack: error.stack
29406
+ });
29407
+ if (error instanceof import_nodejs_utils81.AppError) {
29408
+ next(error);
29409
+ } else {
29410
+ next(
29411
+ new import_nodejs_utils81.InternalServerError(
29412
+ `Failed to set GitHub variables: ${error.message}`
29413
+ )
29414
+ );
29415
+ }
29416
+ }
29417
+ }
29418
+ return {
29419
+ healthCheck,
29420
+ setGitHubVariables
29421
+ };
29422
+ }
29423
+
29424
+ // src/models/plantilla.model.ts
29425
+ var import_nodejs_utils82 = require("@eeplatform/nodejs-utils");
29426
+ var import_joi41 = __toESM(require("joi"));
29427
+ var import_mongodb46 = require("mongodb");
29428
+ var schemaPlantilla = import_joi41.default.object({
29429
+ _id: import_joi41.default.string().hex().optional().allow(null, ""),
29430
+ itemNumber: import_joi41.default.string().required(),
29431
+ positionTitle: import_joi41.default.string().required(),
29432
+ officeAssignmentType: import_joi41.default.string().required(),
29433
+ officeAssignment: import_joi41.default.string().required(),
29434
+ status: import_joi41.default.string().required(),
29435
+ employeeId: import_joi41.default.string().hex().optional().allow(null, ""),
29436
+ createdAt: import_joi41.default.date().iso().optional().allow(null, ""),
29437
+ updatedAt: import_joi41.default.date().iso().optional().allow(null, ""),
29438
+ deletedAt: import_joi41.default.date().iso().optional().allow(null, "")
29439
+ });
29440
+ function MPlantilla(data) {
29441
+ const { error } = schemaPlantilla.validate(data);
29442
+ if (error) {
29443
+ throw new import_nodejs_utils82.BadRequestError(error.message);
29444
+ }
29445
+ if (data._id && typeof data._id === "string") {
29446
+ try {
29447
+ data._id = new import_mongodb46.ObjectId(data._id);
29448
+ } catch (error2) {
29449
+ throw new import_nodejs_utils82.BadRequestError("Invalid _id.");
29450
+ }
29451
+ }
29452
+ if (data.employeeId && typeof data.employeeId === "string") {
29453
+ try {
29454
+ data.employeeId = new import_mongodb46.ObjectId(data.employeeId);
29455
+ } catch (error2) {
29456
+ throw new import_nodejs_utils82.BadRequestError("Invalid employeeId.");
29457
+ }
29458
+ }
29459
+ return {
29460
+ _id: data._id,
29461
+ itemNumber: data.itemNumber ?? "",
29462
+ positionTitle: data.positionTitle ?? "",
29463
+ officeAssignmentType: data.officeAssignmentType ?? "",
29464
+ officeAssignment: data.officeAssignment ?? "",
29465
+ status: data.status ?? "active",
29466
+ employeeId: data.employeeId,
29467
+ createdAt: data.createdAt ? new Date(data.createdAt) : /* @__PURE__ */ new Date(),
29468
+ updatedAt: data.updatedAt ? new Date(data.updatedAt) : "",
29469
+ deletedAt: data.deletedAt ? new Date(data.deletedAt) : ""
29470
+ };
29471
+ }
29472
+
29473
+ // src/repositories/plantilla.repository.ts
29474
+ var import_nodejs_utils83 = require("@eeplatform/nodejs-utils");
29475
+ var import_mongodb47 = require("mongodb");
29476
+ function usePlantillaRepo() {
29477
+ const db = import_nodejs_utils83.useAtlas.getDb();
29478
+ if (!db) {
29479
+ throw new Error("Unable to connect to server.");
29480
+ }
29481
+ const namespace_collection = "plantillas";
29482
+ const collection = db.collection(namespace_collection);
29483
+ const { getCache, setCache, delNamespace } = (0, import_nodejs_utils83.useCache)(namespace_collection);
29484
+ async function createIndexes() {
29485
+ try {
29486
+ await collection.createIndexes([
29487
+ { key: { name: 1 }, unique: true, name: "unique_name_index" },
29488
+ { key: { school: 1 } },
29489
+ { key: { status: 1 } }
29490
+ ]);
29491
+ } catch (error) {
29492
+ throw new Error("Failed to create index on plantillas.");
29493
+ }
29494
+ }
29495
+ async function add(value, session) {
29496
+ try {
29497
+ value = MPlantilla(value);
29498
+ const res = await collection.insertOne(value, { session });
29499
+ delCachedData();
29500
+ return res.insertedId;
29501
+ } catch (error) {
29502
+ import_nodejs_utils83.logger.log({
29503
+ level: "error",
29504
+ message: error.message
29505
+ });
29506
+ if (error instanceof import_nodejs_utils83.AppError) {
29507
+ throw error;
29508
+ } else {
29509
+ const isDuplicated = error.message.includes("duplicate");
29510
+ if (isDuplicated) {
29511
+ throw new import_nodejs_utils83.BadRequestError("Plantilla already exists.");
29512
+ }
29513
+ throw new Error("Failed to create plantilla.");
29514
+ }
29515
+ }
29516
+ }
29517
+ async function updateById(_id, value, session) {
29518
+ try {
29519
+ _id = new import_mongodb47.ObjectId(_id);
29520
+ } catch (error) {
29521
+ throw new import_nodejs_utils83.BadRequestError("Invalid ID.");
29522
+ }
29523
+ value.updatedAt = /* @__PURE__ */ new Date();
29524
+ try {
29525
+ const res = await collection.updateOne(
29526
+ { _id },
29527
+ { $set: value },
29528
+ { session }
29529
+ );
29530
+ delCachedData();
29531
+ return res;
29532
+ } catch (error) {
29533
+ import_nodejs_utils83.logger.log({
29534
+ level: "error",
29535
+ message: error.message
29536
+ });
29537
+ if (error instanceof import_nodejs_utils83.AppError) {
29538
+ throw error;
29539
+ } else {
29540
+ throw new Error("Failed to update plantilla.");
29541
+ }
29542
+ }
29543
+ }
29544
+ async function getAll({
29545
+ search = "",
29546
+ page = 1,
29547
+ limit = 10,
29548
+ sort = {},
29549
+ org = "",
29550
+ status = "active"
29551
+ } = {}) {
29552
+ page = page > 0 ? page - 1 : 0;
29553
+ const query = {
29554
+ status
29555
+ };
29556
+ sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };
29557
+ if (search) {
29558
+ query.$text = { $search: search };
29559
+ }
29560
+ if (org) {
29561
+ try {
29562
+ query.org = new import_mongodb47.ObjectId(org);
29563
+ } catch (error) {
29564
+ throw new import_nodejs_utils83.BadRequestError("Invalid org ID.");
29565
+ }
29566
+ }
29567
+ const cacheParams = {
29568
+ page,
29569
+ limit,
29570
+ sort: JSON.stringify(sort)
29571
+ };
29572
+ if (search)
29573
+ cacheParams.search = search;
29574
+ if (org)
29575
+ cacheParams.org = org;
29576
+ if (status !== "active")
29577
+ cacheParams.status = status;
29578
+ const cacheKey = (0, import_nodejs_utils83.makeCacheKey)(namespace_collection, cacheParams);
29579
+ import_nodejs_utils83.logger.log({
29580
+ level: "info",
29581
+ message: `Cache key for getAll plantillas: ${cacheKey}`
29582
+ });
29583
+ try {
29584
+ const cached = await getCache(cacheKey);
29585
+ if (cached) {
29586
+ import_nodejs_utils83.logger.log({
29587
+ level: "info",
29588
+ message: `Cache hit for getAll plantillas: ${cacheKey}`
29589
+ });
29590
+ return cached;
29591
+ }
29592
+ const items = await collection.aggregate([
29593
+ { $match: query },
29594
+ { $sort: sort },
29595
+ { $skip: page * limit },
29596
+ { $limit: limit }
29597
+ ]).toArray();
29598
+ const length = await collection.countDocuments(query);
29599
+ const data = (0, import_nodejs_utils83.paginate)(items, page, limit, length);
29600
+ setCache(cacheKey, data, 600).then(() => {
29601
+ import_nodejs_utils83.logger.log({
29602
+ level: "info",
29603
+ message: `Cache set for getAll plantillas: ${cacheKey}`
29604
+ });
29605
+ }).catch((err) => {
29606
+ import_nodejs_utils83.logger.log({
29607
+ level: "error",
29608
+ message: `Failed to set cache for getAll plantillas: ${err.message}`
29609
+ });
29610
+ });
29611
+ return data;
29612
+ } catch (error) {
29613
+ import_nodejs_utils83.logger.log({ level: "error", message: `${error}` });
29614
+ throw error;
29615
+ }
29616
+ }
29617
+ async function getById(_id) {
29618
+ try {
29619
+ _id = new import_mongodb47.ObjectId(_id);
29620
+ } catch (error) {
29621
+ throw new import_nodejs_utils83.BadRequestError("Invalid ID.");
29622
+ }
29623
+ const cacheKey = (0, import_nodejs_utils83.makeCacheKey)(namespace_collection, { _id: String(_id) });
29624
+ try {
29625
+ const cached = await getCache(cacheKey);
29626
+ if (cached) {
29627
+ import_nodejs_utils83.logger.log({
29628
+ level: "info",
29629
+ message: `Cache hit for getById plantilla: ${cacheKey}`
29630
+ });
29631
+ return cached;
29632
+ }
29633
+ const result = await collection.findOne({
29634
+ _id
29635
+ });
29636
+ setCache(cacheKey, result, 300).then(() => {
29637
+ import_nodejs_utils83.logger.log({
29638
+ level: "info",
29639
+ message: `Cache set for plantilla by id: ${cacheKey}`
29640
+ });
29641
+ }).catch((err) => {
29642
+ import_nodejs_utils83.logger.log({
29643
+ level: "error",
29644
+ message: `Failed to set cache for plantilla by id: ${err.message}`
29645
+ });
29646
+ });
29647
+ return result;
29648
+ } catch (error) {
29649
+ if (error instanceof import_nodejs_utils83.AppError) {
29650
+ throw error;
29651
+ } else {
29652
+ throw new import_nodejs_utils83.InternalServerError("Failed to get plantilla.");
29653
+ }
29654
+ }
29655
+ }
29656
+ async function deleteById(_id, session) {
29657
+ try {
29658
+ _id = new import_mongodb47.ObjectId(_id);
29659
+ } catch (error) {
29660
+ throw new import_nodejs_utils83.BadRequestError("Invalid ID.");
29661
+ }
29662
+ try {
29663
+ const res = await collection.updateOne(
29664
+ { _id },
29665
+ { $set: { status: "deleted", deletedAt: /* @__PURE__ */ new Date() } }
29666
+ );
29667
+ delCachedData();
29668
+ return res;
29669
+ } catch (error) {
29670
+ import_nodejs_utils83.logger.log({
29671
+ level: "error",
29672
+ message: error.message
29673
+ });
29674
+ if (error instanceof import_nodejs_utils83.AppError) {
29675
+ throw error;
29676
+ } else {
29677
+ throw new import_nodejs_utils83.InternalServerError("Failed to delete plantilla.");
29678
+ }
29679
+ }
29680
+ }
29681
+ function delCachedData() {
29682
+ delNamespace().then(() => {
29683
+ import_nodejs_utils83.logger.log({
29684
+ level: "info",
29685
+ message: `Cache namespace cleared for ${namespace_collection}`
29686
+ });
29687
+ }).catch((err) => {
29688
+ import_nodejs_utils83.logger.log({
29689
+ level: "error",
29690
+ message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`
29691
+ });
29692
+ });
29693
+ }
29694
+ return {
29695
+ createIndexes,
29696
+ add,
29697
+ getAll,
29698
+ getById,
29699
+ updateById,
29700
+ deleteById
29701
+ };
29702
+ }
29703
+
29704
+ // src/controllers/plantilla.controller.ts
29705
+ var import_nodejs_utils84 = require("@eeplatform/nodejs-utils");
29706
+ var import_joi42 = __toESM(require("joi"));
29707
+ function usePlantillaController() {
29708
+ const {
29709
+ add: _addPlantilla,
29710
+ getAll: _getAllPlantillas,
29711
+ getById: _getPlantillaById,
29712
+ updateById: _updatePlantillaById,
29713
+ deleteById: _deletePlantillaById
29714
+ } = usePlantillaRepo();
29715
+ async function createPlantilla(req, res, next) {
29716
+ const value = req.body;
29717
+ const validation = import_joi42.default.object({
29718
+ itemNumber: import_joi42.default.string().required(),
29719
+ positionTitle: import_joi42.default.string().required(),
29720
+ officeAssignmentType: import_joi42.default.string().required(),
29721
+ officeAssignment: import_joi42.default.string().required(),
29722
+ status: import_joi42.default.string().required(),
29723
+ employeeId: import_joi42.default.string().hex().optional().allow(null, "")
29724
+ });
29725
+ const { error } = validation.validate(value);
29726
+ if (error) {
29727
+ next(new import_nodejs_utils84.BadRequestError(error.message));
29728
+ return;
29729
+ }
29730
+ try {
29731
+ const id = await _addPlantilla(value);
29732
+ res.json({ message: "Plantilla created successfully", id });
29733
+ return;
29734
+ } catch (error2) {
29735
+ next(error2);
29736
+ }
29737
+ }
29738
+ async function getAllPlantillas(req, res, next) {
29739
+ const page = typeof req.query.page === "string" ? Number(req.query.page) : 1;
29740
+ const limit = typeof req.query.limit === "string" ? Number(req.query.limit) : 10;
29741
+ const search = req.query.search ?? "";
29742
+ const org = req.query.org ?? "";
29743
+ const isPageNumber = isFinite(page);
29744
+ if (!isPageNumber) {
29745
+ next(new import_nodejs_utils84.BadRequestError("Invalid page number."));
29746
+ return;
29747
+ }
29748
+ const isLimitNumber = isFinite(limit);
29749
+ if (!isLimitNumber) {
29750
+ next(new import_nodejs_utils84.BadRequestError("Invalid limit number."));
29751
+ return;
29752
+ }
29753
+ const validation = import_joi42.default.object({
29754
+ page: import_joi42.default.number().min(1).optional().allow("", null),
29755
+ limit: import_joi42.default.number().min(1).optional().allow("", null),
29756
+ search: import_joi42.default.string().optional().allow("", null),
29757
+ org: import_joi42.default.string().optional().allow("", null)
29758
+ });
29759
+ const { error } = validation.validate({ page, limit, search, org });
29760
+ if (error) {
29761
+ next(new import_nodejs_utils84.BadRequestError(error.message));
29762
+ return;
29763
+ }
29764
+ try {
29765
+ const plantillas = await _getAllPlantillas({
29766
+ search,
29767
+ page,
29768
+ limit,
29769
+ org
29770
+ });
29771
+ res.json(plantillas);
29772
+ return;
29773
+ } catch (error2) {
29774
+ next(error2);
29775
+ }
29776
+ }
29777
+ async function getPlantillaById(req, res, next) {
29778
+ const id = req.params.id;
29779
+ const validation = import_joi42.default.object({
29780
+ id: import_joi42.default.string().hex().required()
29781
+ });
29782
+ const { error } = validation.validate({ id });
29783
+ if (error) {
29784
+ next(new import_nodejs_utils84.BadRequestError(error.message));
29785
+ return;
29786
+ }
29787
+ try {
29788
+ const plantilla = await _getPlantillaById(id);
29789
+ if (!plantilla) {
29790
+ next(new import_nodejs_utils84.BadRequestError("Plantilla not found."));
29791
+ return;
29792
+ }
29793
+ res.json(plantilla);
29794
+ return;
29795
+ } catch (error2) {
29796
+ next(error2);
29797
+ }
29798
+ }
29799
+ async function updatePlantilla(req, res, next) {
29800
+ const id = req.params.id;
29801
+ const value = req.body;
29802
+ const validation = import_joi42.default.object({
29803
+ id: import_joi42.default.string().hex().required(),
29804
+ employeeId: import_joi42.default.string().hex().optional().allow(null, ""),
29805
+ status: import_joi42.default.string().optional(),
29806
+ positionTitle: import_joi42.default.string().optional()
29807
+ });
29808
+ const { error } = validation.validate({ id, ...value });
29809
+ if (error) {
29810
+ next(new import_nodejs_utils84.BadRequestError(error.message));
29811
+ return;
29812
+ }
29813
+ try {
29814
+ const result = await _updatePlantillaById(id, value);
29815
+ if (result.matchedCount === 0) {
29816
+ next(new import_nodejs_utils84.BadRequestError("Plantilla not found."));
29817
+ return;
29818
+ }
29819
+ res.json({ message: "Plantilla updated successfully" });
29820
+ return;
29821
+ } catch (error2) {
29822
+ next(error2);
29823
+ }
29824
+ }
29825
+ async function deletePlantilla(req, res, next) {
29826
+ const id = req.params.id;
29827
+ const validation = import_joi42.default.object({
29828
+ id: import_joi42.default.string().hex().required()
29829
+ });
29830
+ const { error } = validation.validate({ id });
29831
+ if (error) {
29832
+ next(new import_nodejs_utils84.BadRequestError(error.message));
29833
+ return;
29834
+ }
29835
+ try {
29836
+ const result = await _deletePlantillaById(id);
29837
+ if (result.matchedCount === 0) {
29838
+ next(new import_nodejs_utils84.BadRequestError("Plantilla not found."));
29839
+ return;
29840
+ }
29841
+ res.json({ message: "Plantilla deleted successfully" });
29842
+ return;
29843
+ } catch (error2) {
29844
+ next(error2);
29845
+ }
29846
+ }
29847
+ return {
29848
+ createPlantilla,
29849
+ getAllPlantillas,
29850
+ getPlantillaById,
29851
+ updatePlantilla,
29852
+ deletePlantilla
29853
+ };
29854
+ }
29153
29855
  // Annotate the CommonJS export names for ESM import in node:
29154
29856
  0 && (module.exports = {
29155
29857
  ACCESS_TOKEN_EXPIRY,
@@ -29181,6 +29883,7 @@ function useStockCardController() {
29181
29883
  MOrder,
29182
29884
  MOrg,
29183
29885
  MPaymentMethod,
29886
+ MPlantilla,
29184
29887
  MPromoCode,
29185
29888
  MRegion,
29186
29889
  MRole,
@@ -29218,6 +29921,7 @@ function useStockCardController() {
29218
29921
  schemaBuilding,
29219
29922
  schemaBuildingUnit,
29220
29923
  schemaDivision,
29924
+ schemaPlantilla,
29221
29925
  schemaRegion,
29222
29926
  schemaSchool,
29223
29927
  schemaStockCard,
@@ -29242,6 +29946,7 @@ function useStockCardController() {
29242
29946
  useFileController,
29243
29947
  useFileRepo,
29244
29948
  useFileService,
29949
+ useGitHubService,
29245
29950
  useInvoiceController,
29246
29951
  useInvoiceModel,
29247
29952
  useInvoiceRepo,
@@ -29260,6 +29965,8 @@ function useStockCardController() {
29260
29965
  usePaymentModel,
29261
29966
  usePaymentRepo,
29262
29967
  usePaypalService,
29968
+ usePlantillaController,
29969
+ usePlantillaRepo,
29263
29970
  usePriceController,
29264
29971
  usePriceModel,
29265
29972
  usePriceRepo,
@@ -29282,6 +29989,7 @@ function useStockCardController() {
29282
29989
  useUserController,
29283
29990
  useUserRepo,
29284
29991
  useUserService,
29992
+ useUtilController,
29285
29993
  useVerificationController,
29286
29994
  useVerificationRepo,
29287
29995
  useVerificationService,