arkos 1.1.12-test → 1.1.13-test

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.
Files changed (133) hide show
  1. package/dist/cjs/app.js +1 -1
  2. package/dist/cjs/app.js.map +1 -1
  3. package/dist/cjs/modules/auth/auth.controller.js +53 -64
  4. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  5. package/dist/cjs/modules/auth/auth.router.js +46 -58
  6. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  7. package/dist/cjs/modules/auth/auth.service.js +75 -97
  8. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  9. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +6 -7
  10. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
  11. package/dist/cjs/modules/base/base.controller.js +30 -46
  12. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  13. package/dist/cjs/modules/base/base.middlewares.js +17 -21
  14. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  15. package/dist/cjs/modules/base/base.router.js +6 -17
  16. package/dist/cjs/modules/base/base.router.js.map +1 -1
  17. package/dist/cjs/modules/base/base.service.js +128 -116
  18. package/dist/cjs/modules/base/base.service.js.map +1 -1
  19. package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js +3 -5
  20. package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js.map +1 -1
  21. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +36 -47
  22. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  23. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +30 -40
  24. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  25. package/dist/cjs/modules/email/email.service.js +28 -39
  26. package/dist/cjs/modules/email/email.service.js.map +1 -1
  27. package/dist/cjs/modules/error-handler/error-handler.controller.js +6 -3
  28. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  29. package/dist/cjs/modules/error-handler/utils/catch-async.js +3 -12
  30. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  31. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +17 -31
  32. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  33. package/dist/cjs/modules/file-uploader/file-uploader.controller.js +18 -27
  34. package/dist/cjs/modules/file-uploader/file-uploader.controller.js.map +1 -1
  35. package/dist/cjs/modules/file-uploader/file-uploader.router.js +23 -34
  36. package/dist/cjs/modules/file-uploader/file-uploader.router.js.map +1 -1
  37. package/dist/cjs/modules/file-uploader/file-uploader.service.js +117 -131
  38. package/dist/cjs/modules/file-uploader/file-uploader.service.js.map +1 -1
  39. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js +15 -26
  40. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -1
  41. package/dist/cjs/server.js +1 -1
  42. package/dist/cjs/server.js.map +1 -1
  43. package/dist/cjs/utils/cli/build.js +9 -2
  44. package/dist/cjs/utils/cli/build.js.map +1 -1
  45. package/dist/cjs/utils/cli/dev.js +43 -48
  46. package/dist/cjs/utils/cli/dev.js.map +1 -1
  47. package/dist/cjs/utils/cli/start.js +35 -38
  48. package/dist/cjs/utils/cli/start.js.map +1 -1
  49. package/dist/cjs/utils/features/api.features.js +26 -33
  50. package/dist/cjs/utils/features/api.features.js.map +1 -1
  51. package/dist/cjs/utils/helpers/api.features.helpers.js +4 -6
  52. package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
  53. package/dist/cjs/utils/helpers/change-case.helpers.js +28 -36
  54. package/dist/cjs/utils/helpers/change-case.helpers.js.map +1 -1
  55. package/dist/cjs/utils/helpers/deepmerge.helper.js +4 -8
  56. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +1 -1
  57. package/dist/cjs/utils/helpers/global.helpers.js +2 -13
  58. package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
  59. package/dist/cjs/utils/helpers/models.helpers.js +65 -80
  60. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  61. package/dist/cjs/utils/helpers/prisma.helpers.js +23 -34
  62. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  63. package/dist/cjs/utils/validate-dto.js +6 -17
  64. package/dist/cjs/utils/validate-dto.js.map +1 -1
  65. package/dist/cjs/utils/validate-schema.js +6 -17
  66. package/dist/cjs/utils/validate-schema.js.map +1 -1
  67. package/dist/es2020/app.js +1 -1
  68. package/dist/es2020/app.js.map +1 -1
  69. package/dist/es2020/modules/auth/auth.controller.js +53 -64
  70. package/dist/es2020/modules/auth/auth.controller.js.map +1 -1
  71. package/dist/es2020/modules/auth/auth.router.js +46 -58
  72. package/dist/es2020/modules/auth/auth.router.js.map +1 -1
  73. package/dist/es2020/modules/auth/auth.service.js +75 -97
  74. package/dist/es2020/modules/auth/auth.service.js.map +1 -1
  75. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +6 -7
  76. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
  77. package/dist/es2020/modules/base/base.controller.js +30 -46
  78. package/dist/es2020/modules/base/base.controller.js.map +1 -1
  79. package/dist/es2020/modules/base/base.middlewares.js +17 -21
  80. package/dist/es2020/modules/base/base.middlewares.js.map +1 -1
  81. package/dist/es2020/modules/base/base.router.js +6 -17
  82. package/dist/es2020/modules/base/base.router.js.map +1 -1
  83. package/dist/es2020/modules/base/base.service.js +128 -116
  84. package/dist/es2020/modules/base/base.service.js.map +1 -1
  85. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js +3 -5
  86. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js.map +1 -1
  87. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +36 -47
  88. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  89. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +30 -40
  90. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  91. package/dist/es2020/modules/email/email.service.js +28 -39
  92. package/dist/es2020/modules/email/email.service.js.map +1 -1
  93. package/dist/es2020/modules/error-handler/error-handler.controller.js +6 -3
  94. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +1 -1
  95. package/dist/es2020/modules/error-handler/utils/catch-async.js +3 -12
  96. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +1 -1
  97. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +17 -31
  98. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  99. package/dist/es2020/modules/file-uploader/file-uploader.controller.js +18 -27
  100. package/dist/es2020/modules/file-uploader/file-uploader.controller.js.map +1 -1
  101. package/dist/es2020/modules/file-uploader/file-uploader.router.js +23 -34
  102. package/dist/es2020/modules/file-uploader/file-uploader.router.js.map +1 -1
  103. package/dist/es2020/modules/file-uploader/file-uploader.service.js +117 -131
  104. package/dist/es2020/modules/file-uploader/file-uploader.service.js.map +1 -1
  105. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js +15 -26
  106. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -1
  107. package/dist/es2020/server.js +1 -1
  108. package/dist/es2020/server.js.map +1 -1
  109. package/dist/es2020/utils/cli/build.js +9 -2
  110. package/dist/es2020/utils/cli/build.js.map +1 -1
  111. package/dist/es2020/utils/cli/dev.js +43 -48
  112. package/dist/es2020/utils/cli/dev.js.map +1 -1
  113. package/dist/es2020/utils/cli/start.js +35 -38
  114. package/dist/es2020/utils/cli/start.js.map +1 -1
  115. package/dist/es2020/utils/features/api.features.js +26 -33
  116. package/dist/es2020/utils/features/api.features.js.map +1 -1
  117. package/dist/es2020/utils/helpers/api.features.helpers.js +4 -6
  118. package/dist/es2020/utils/helpers/api.features.helpers.js.map +1 -1
  119. package/dist/es2020/utils/helpers/change-case.helpers.js +28 -36
  120. package/dist/es2020/utils/helpers/change-case.helpers.js.map +1 -1
  121. package/dist/es2020/utils/helpers/deepmerge.helper.js +4 -8
  122. package/dist/es2020/utils/helpers/deepmerge.helper.js.map +1 -1
  123. package/dist/es2020/utils/helpers/global.helpers.js +2 -13
  124. package/dist/es2020/utils/helpers/global.helpers.js.map +1 -1
  125. package/dist/es2020/utils/helpers/models.helpers.js +65 -80
  126. package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
  127. package/dist/es2020/utils/helpers/prisma.helpers.js +23 -34
  128. package/dist/es2020/utils/helpers/prisma.helpers.js.map +1 -1
  129. package/dist/es2020/utils/validate-dto.js +6 -17
  130. package/dist/es2020/utils/validate-dto.js.map +1 -1
  131. package/dist/es2020/utils/validate-schema.js +6 -17
  132. package/dist/es2020/utils/validate-schema.js.map +1 -1
  133. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport {\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const { middlewares, dtos, schemas } = await importPrismaModelModules(\"auth\");\n const authController = await authControllerFactory(middlewares);\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n router\n .get(\n \"/users/me\",\n authService.authenticate,\n middlewares?.beforeGetMe ?? authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe ?? sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n )\n .patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n middlewares?.beforeGetMe ?? authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe ?? sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n );\n\n router.use(\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n middlewares?.beforeLogin ?? authController.login,\n middlewares?.beforeLogin\n ? authController.login\n : middlewares?.afterLogin ?? sendResponse,\n middlewares?.beforeLogin && middlewares?.afterLogin\n ? middlewares?.afterLogin\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n middlewares?.beforeSignup ?? authController.signup,\n middlewares?.beforeSignup\n ? authController.signup\n : middlewares?.afterSignup ?? sendResponse,\n middlewares?.beforeSignup && middlewares?.afterSignup\n ? middlewares?.afterSignup\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n middlewares?.beforeUpdatePassword ?? authController.updatePassword,\n middlewares?.beforeUpdatePassword\n ? authController.updatePassword\n : middlewares?.afterUpdatePassword ?? sendResponse,\n middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword\n ? middlewares?.afterUpdatePassword\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
1
+ {"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport {\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const { middlewares, dtos, schemas } = await importPrismaModelModules(\"auth\");\n const authController = await authControllerFactory(middlewares);\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n router\n .get(\n \"/users/me\",\n authService.authenticate,\n middlewares?.beforeGetMe ?? authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe ?? sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n )\n .patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n middlewares?.beforeGetMe ?? authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe ?? sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n );\n\n router.use(\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n middlewares?.beforeLogin ?? authController.login,\n middlewares?.beforeLogin\n ? authController.login\n : middlewares?.afterLogin ?? sendResponse,\n middlewares?.beforeLogin && middlewares?.afterLogin\n ? middlewares?.afterLogin\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n middlewares?.beforeSignup ?? authController.signup,\n middlewares?.beforeSignup\n ? authController.signup\n : middlewares?.afterSignup ?? sendResponse,\n middlewares?.beforeSignup && middlewares?.afterSignup\n ? middlewares?.afterSignup\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n middlewares?.beforeUpdatePassword ?? authController.updatePassword,\n middlewares?.beforeUpdatePassword\n ? authController.updatePassword\n : middlewares?.afterUpdatePassword ?? sendResponse,\n middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword\n ? middlewares?.afterUpdatePassword\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -23,49 +14,43 @@ const arkos_env_1 = __importDefault(require("../../utils/arkos-env"));
23
14
  const prisma_helpers_1 = require("../../utils/helpers/prisma.helpers");
24
15
  class AuthService {
25
16
  constructor() {
26
- this.authenticate = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
17
+ this.authenticate = (0, catch_async_1.default)(async (req, res, next) => {
27
18
  const arkosConfig = (0, server_1.getArkosConfig)();
28
- if (!(arkosConfig === null || arkosConfig === void 0 ? void 0 : arkosConfig.authentication)) {
19
+ if (!arkosConfig?.authentication) {
29
20
  next();
30
21
  return;
31
22
  }
32
- req.user = (yield this.getAuthenticatedUser(req));
23
+ req.user = (await this.getAuthenticatedUser(req));
33
24
  next();
34
- }));
25
+ });
35
26
  }
36
27
  signJwtToken(id, expiresIn, secret) {
37
- var _a, _b, _c;
38
28
  const { authentication: configs } = (0, server_1.getArkosConfig)();
39
29
  if (process.env.NODE_ENV === "production" &&
40
- (!process.env.JWT_SECRET || !((_a = configs === null || configs === void 0 ? void 0 : configs.jwt) === null || _a === void 0 ? void 0 : _a.secret)))
30
+ (!process.env.JWT_SECRET || !configs?.jwt?.secret))
41
31
  throw new app_error_1.default("Missing JWT secret on production!", 500);
42
32
  secret =
43
33
  secret ||
44
- ((_b = configs === null || configs === void 0 ? void 0 : configs.jwt) === null || _b === void 0 ? void 0 : _b.secret) ||
34
+ configs?.jwt?.secret ||
45
35
  process.env.JWT_SECRET ||
46
36
  arkos_env_1.default.JWT_SECRET;
47
37
  expiresIn = (expiresIn ||
48
- ((_c = configs === null || configs === void 0 ? void 0 : configs.jwt) === null || _c === void 0 ? void 0 : _c.expiresIn) ||
38
+ configs?.jwt?.expiresIn ||
49
39
  process.env.JWT_EXPIRES_IN ||
50
40
  arkos_env_1.default.JWT_EXPIRES_IN);
51
41
  return jsonwebtoken_1.default.sign({ id }, secret, {
52
42
  expiresIn: expiresIn,
53
43
  });
54
44
  }
55
- isCorrectPassword(candidatePassword, userPassword) {
56
- return __awaiter(this, void 0, void 0, function* () {
57
- return yield bcryptjs_1.default.compare(candidatePassword, userPassword);
58
- });
45
+ async isCorrectPassword(candidatePassword, userPassword) {
46
+ return await bcryptjs_1.default.compare(candidatePassword, userPassword);
59
47
  }
60
- hashPassword(password) {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- return yield bcryptjs_1.default.hash(password, 12);
63
- });
48
+ async hashPassword(password) {
49
+ return await bcryptjs_1.default.hash(password, 12);
64
50
  }
65
51
  isPasswordStrong(password) {
66
- var _a, _b;
67
- const initAuthConfigs = (_a = (0, server_1.getArkosConfig)()) === null || _a === void 0 ? void 0 : _a.authentication;
68
- const strongPasswordRegex = ((_b = initAuthConfigs === null || initAuthConfigs === void 0 ? void 0 : initAuthConfigs.passwordValidation) === null || _b === void 0 ? void 0 : _b.regex) ||
52
+ const initAuthConfigs = (0, server_1.getArkosConfig)()?.authentication;
53
+ const strongPasswordRegex = initAuthConfigs?.passwordValidation?.regex ||
69
54
  /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).+$/;
70
55
  return strongPasswordRegex.test(password);
71
56
  }
@@ -76,32 +61,28 @@ class AuthService {
76
61
  }
77
62
  return false;
78
63
  }
79
- verifyJwtToken(token, secret) {
80
- return __awaiter(this, void 0, void 0, function* () {
81
- var _a, _b;
82
- const { authentication: configs } = (0, server_1.getArkosConfig)();
83
- if (process.env.NODE_ENV === "production" &&
84
- !process.env.JWT_SECRET &&
85
- !((_a = configs === null || configs === void 0 ? void 0 : configs.jwt) === null || _a === void 0 ? void 0 : _a.secret))
86
- throw new app_error_1.default("Missing JWT secret!", 500);
87
- secret =
88
- secret ||
89
- ((_b = configs === null || configs === void 0 ? void 0 : configs.jwt) === null || _b === void 0 ? void 0 : _b.secret) ||
90
- process.env.JWT_SECRET ||
91
- arkos_env_1.default.JWT_SECRET;
92
- return new Promise((resolve, reject) => {
93
- jsonwebtoken_1.default.verify(token, secret, (err, decoded) => {
94
- if (err)
95
- reject(err);
96
- else
97
- resolve(decoded);
98
- });
64
+ async verifyJwtToken(token, secret) {
65
+ const { authentication: configs } = (0, server_1.getArkosConfig)();
66
+ if (process.env.NODE_ENV === "production" &&
67
+ !process.env.JWT_SECRET &&
68
+ !configs?.jwt?.secret)
69
+ throw new app_error_1.default("Missing JWT secret!", 500);
70
+ secret =
71
+ secret ||
72
+ configs?.jwt?.secret ||
73
+ process.env.JWT_SECRET ||
74
+ arkos_env_1.default.JWT_SECRET;
75
+ return new Promise((resolve, reject) => {
76
+ jsonwebtoken_1.default.verify(token, secret, (err, decoded) => {
77
+ if (err)
78
+ reject(err);
79
+ else
80
+ resolve(decoded);
99
81
  });
100
82
  });
101
83
  }
102
84
  handleAccessControl(action, resourceName, accessControl) {
103
- return (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
104
- var _a, _b;
85
+ return (0, catch_async_1.default)(async (req, res, next) => {
105
86
  if (req.user) {
106
87
  const user = req.user;
107
88
  const prisma = (0, prisma_helpers_1.getPrismaInstance)();
@@ -110,8 +91,8 @@ class AuthService {
110
91
  next();
111
92
  return;
112
93
  }
113
- if (((_a = configs === null || configs === void 0 ? void 0 : configs.authentication) === null || _a === void 0 ? void 0 : _a.mode) === "dynamic") {
114
- const matchingRole = yield prisma.userRole.findFirst({
94
+ if (configs?.authentication?.mode === "dynamic") {
95
+ const matchingRole = await prisma.userRole.findFirst({
115
96
  where: {
116
97
  userId: req.user.id,
117
98
  roles: {
@@ -132,13 +113,13 @@ class AuthService {
132
113
  if (!matchingRole)
133
114
  return next(new app_error_1.default("You do not have permission to perfom this action", 403));
134
115
  }
135
- else if (((_b = configs === null || configs === void 0 ? void 0 : configs.authentication) === null || _b === void 0 ? void 0 : _b.mode) === "static") {
116
+ else if (configs?.authentication?.mode === "static") {
136
117
  let authorizedRoles = [];
137
118
  if (Array.isArray(accessControl))
138
119
  authorizedRoles = accessControl;
139
120
  else if (accessControl[action])
140
121
  authorizedRoles = accessControl[action] || [];
141
- const userRoles = Array.isArray(user === null || user === void 0 ? void 0 : user.roles)
122
+ const userRoles = Array.isArray(user?.roles)
142
123
  ? user.roles
143
124
  : [user.role];
144
125
  const hasPermission = userRoles.some((role) => authorizedRoles.includes(role));
@@ -148,51 +129,48 @@ class AuthService {
148
129
  }
149
130
  }
150
131
  next();
151
- }));
132
+ });
152
133
  }
153
- getAuthenticatedUser(req) {
154
- return __awaiter(this, void 0, void 0, function* () {
155
- var _a, _b, _c, _d, _e, _f, _g;
156
- const arkosConfig = (0, server_1.getArkosConfig)();
157
- if (!(arkosConfig === null || arkosConfig === void 0 ? void 0 : arkosConfig.authentication))
158
- return null;
159
- const prisma = (0, prisma_helpers_1.getPrismaInstance)();
160
- let token;
161
- if (((_a = req === null || req === void 0 ? void 0 : req.headers) === null || _a === void 0 ? void 0 : _a.authorization) &&
162
- ((_b = req === null || req === void 0 ? void 0 : req.headers) === null || _b === void 0 ? void 0 : _b.authorization.startsWith("Bearer"))) {
163
- token = (_c = req === null || req === void 0 ? void 0 : req.headers) === null || _c === void 0 ? void 0 : _c.authorization.split(" ")[1];
164
- }
165
- else if (((_d = req === null || req === void 0 ? void 0 : req.cookies) === null || _d === void 0 ? void 0 : _d.arkos_access_token) !== "no-token" && req.cookies) {
166
- token = (_e = req === null || req === void 0 ? void 0 : req.cookies) === null || _e === void 0 ? void 0 : _e.arkos_access_token;
167
- }
168
- if (!token)
169
- throw new app_error_1.default("You are not logged in! please log in to get access", 401);
170
- let decoded;
171
- try {
172
- decoded = yield this.verifyJwtToken(token);
173
- }
174
- catch (err) {
175
- throw new app_error_1.default("Your auth token is invalid, please login again.", 401);
176
- }
177
- if (!(decoded === null || decoded === void 0 ? void 0 : decoded.id))
178
- throw new app_error_1.default("Your auth token is invalid, please login again.", 401);
179
- const user = yield prisma.user.findUnique({
180
- where: { id: String(decoded.id) },
181
- select: {
182
- id: true,
183
- passwordChangedAt: true,
184
- isActive: true,
185
- deletedSelfAccountAt: true,
186
- isSuperUser: true,
187
- },
188
- });
189
- if (!user)
190
- throw new app_error_1.default("The user belonging to this token does no longer exists", 401);
191
- if (this.userChangedPasswordAfter(user, decoded.iat) &&
192
- !((_g = (_f = req.path) === null || _f === void 0 ? void 0 : _f.includes) === null || _g === void 0 ? void 0 : _g.call(_f, "logout")))
193
- throw new app_error_1.default("User recently changed password! Please log in again.", 401);
194
- return user;
134
+ async getAuthenticatedUser(req) {
135
+ const arkosConfig = (0, server_1.getArkosConfig)();
136
+ if (!arkosConfig?.authentication)
137
+ return null;
138
+ const prisma = (0, prisma_helpers_1.getPrismaInstance)();
139
+ let token;
140
+ if (req?.headers?.authorization &&
141
+ req?.headers?.authorization.startsWith("Bearer")) {
142
+ token = req?.headers?.authorization.split(" ")[1];
143
+ }
144
+ else if (req?.cookies?.arkos_access_token !== "no-token" && req.cookies) {
145
+ token = req?.cookies?.arkos_access_token;
146
+ }
147
+ if (!token)
148
+ throw new app_error_1.default("You are not logged in! please log in to get access", 401);
149
+ let decoded;
150
+ try {
151
+ decoded = await this.verifyJwtToken(token);
152
+ }
153
+ catch (err) {
154
+ throw new app_error_1.default("Your auth token is invalid, please login again.", 401);
155
+ }
156
+ if (!decoded?.id)
157
+ throw new app_error_1.default("Your auth token is invalid, please login again.", 401);
158
+ const user = await prisma.user.findUnique({
159
+ where: { id: String(decoded.id) },
160
+ select: {
161
+ id: true,
162
+ passwordChangedAt: true,
163
+ isActive: true,
164
+ deletedSelfAccountAt: true,
165
+ isSuperUser: true,
166
+ },
195
167
  });
168
+ if (!user)
169
+ throw new app_error_1.default("The user belonging to this token does no longer exists", 401);
170
+ if (this.userChangedPasswordAfter(user, decoded.iat) &&
171
+ !req.path?.includes?.("logout"))
172
+ throw new app_error_1.default("User recently changed password! Please log in again.", 401);
173
+ return user;
196
174
  }
197
175
  handleAuthenticationControl(action, authenticationControl) {
198
176
  if (authenticationControl && typeof authenticationControl === "object") {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt, { SignOptions } from \"jsonwebtoken\";\nimport bcrypt from \"bcryptjs\";\nimport { User } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { callNext } from \"../base/base.middlewares\";\nimport { getArkosConfig } from \"../../server\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../types\";\nimport {\n AuthConfigs,\n AuthJwtPayload,\n AccessAction,\n AccessControlConfig,\n AuthenticationControlConfig,\n} from \"../../types/auth\";\nimport { MsDuration } from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nexport class AuthService {\n /**\n * Signs a JWT token for the user.\n *\n * @param {number | string} id - The unique identifier of the user to generate the token for.\n * @param {string | number} [expiresIn] - The expiration time for the token. Defaults to environment variable `JWT_EXPIRES_IN`.\n * @param {string} [secret] - The secret key used to sign the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {string} The signed JWT token.\n */\n signJwtToken(\n id: number | string,\n expiresIn?: MsDuration | number,\n secret?: string\n ): string {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n (!process.env.JWT_SECRET || !configs?.jwt?.secret)\n )\n throw new AppError(\"Missing JWT secret on production!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n expiresIn = (expiresIn ||\n configs?.jwt?.expiresIn ||\n process.env.JWT_EXPIRES_IN ||\n arkosEnv.JWT_EXPIRES_IN) as keyof SignOptions[\"expiresIn\"];\n\n return jwt.sign({ id }, secret, {\n expiresIn: expiresIn as MsDuration,\n });\n }\n\n /**\n * Compares a candidate password with the stored user password to check if they match.\n *\n * @param {string} candidatePassword - The password provided by the user during login.\n * @param {string} userPassword - The password stored in the database.\n * @returns {Promise<boolean>} Returns true if the passwords match, otherwise false.\n */\n async isCorrectPassword(\n candidatePassword: string,\n userPassword: string\n ): Promise<boolean> {\n return await bcrypt.compare(candidatePassword, userPassword);\n }\n\n /**\n * Hashes a plain text password using bcrypt.\n *\n * @param {string} password - The password to be hashed.\n * @returns {Promise<string>} Returns the hashed password.\n */\n async hashPassword(password: string): Promise<string> {\n return await bcrypt.hash(password, 12);\n }\n\n /**\n * Checks if a password is strong, requiring uppercase, lowercase, and numeric characters as the default.\n *\n * **NB**: You must pay attention when using custom validation with zod or class-validator, try to use the same regex always.\n *\n * **Note**: You can define it when calling arkos.init()\n * ```ts\n * arkos.init({\n * authentication: {\n * passwordValidation:{ regex: /your-desired-regex/, message: 'password must contain...'}\n * }\n * })\n * ```\n *\n * @param {string} password - The password to check.\n * @returns {boolean} Returns true if the password meets the strength criteria, otherwise false.\n */\n public isPasswordStrong(password: string): boolean {\n const initAuthConfigs = getArkosConfig()?.authentication;\n\n const strongPasswordRegex =\n initAuthConfigs?.passwordValidation?.regex ||\n /^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).+$/;\n return strongPasswordRegex.test(password);\n }\n\n /**\n * Checks if a user has changed their password after the JWT was issued.\n *\n * @param {User} user - The user object containing the passwordChangedAt field.\n * @param {number} JWTTimestamp - The timestamp when the JWT was issued.\n * @returns {boolean} Returns true if the user changed their password after the JWT was issued, otherwise false.\n */\n userChangedPasswordAfter(user: User, JWTTimestamp: number): boolean {\n if (user.passwordChangedAt) {\n const convertedTimestamp = parseInt(\n String(user.passwordChangedAt.getTime() / 1000),\n 10\n );\n\n return JWTTimestamp < convertedTimestamp;\n }\n return false;\n }\n\n /**\n * Verifies the authenticity of a JWT token.\n *\n * @param {string} token - The JWT token to verify.\n * @param {string} [secret] - The secret key used to verify the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {Promise<AuthJwtPayload>} Returns the decoded JWT payload if the token is valid.\n * @throws {Error} Throws an error if the token is invalid or expired.\n */\n async verifyJwtToken(\n token: string,\n secret?: string\n ): Promise<AuthJwtPayload> {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\"Missing JWT secret!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n return new Promise((resolve, reject) => {\n jwt.verify(token, secret, (err, decoded) => {\n if (err) reject(err);\n else resolve(decoded as AuthJwtPayload);\n });\n });\n }\n\n /**\n * Middleware function to handle access control based on user roles and permissions.\n *\n * @param {AccessAction} action - The action being performed (e.g., create, update, delete, view).\n * @param {string} resourceName - The resource name that the action is being performed on (e.g., \"User\", \"Post\").\n * @param {AccessControlConfig} accessControl - The access control configuration.\n * @returns {ArkosRequestHandler} The middleware function that checks if the user has permission to perform the action.\n */\n handleAccessControl(\n action: AccessAction,\n resourceName: string,\n accessControl: AccessControlConfig\n ): ArkosRequestHandler {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (req.user) {\n const user = req.user as any;\n const prisma = getPrismaInstance();\n const configs = getArkosConfig();\n\n if (user.isSuperUser) {\n next();\n return;\n }\n\n if (configs?.authentication?.mode === \"dynamic\") {\n const matchingRole = await prisma.userRole.findFirst({\n where: {\n userId: req.user.id,\n roles: {\n some: {\n role: {\n permissions: {\n some: {\n resource: resourceName,\n action: action,\n },\n },\n },\n },\n },\n },\n select: { id: true },\n });\n\n if (!matchingRole)\n return next(\n new AppError(\n \"You do not have permission to perfom this action\",\n 403\n )\n );\n } else if (configs?.authentication?.mode === \"static\") {\n let authorizedRoles: string[] = [];\n\n if (Array.isArray(accessControl)) authorizedRoles = accessControl;\n else if (accessControl[action])\n authorizedRoles = accessControl[action] || [];\n\n const userRoles = Array.isArray(user?.roles)\n ? user.roles\n : [user.role];\n const hasPermission = userRoles.some((role: string) =>\n authorizedRoles.includes(role)\n );\n\n if (!hasPermission) {\n return next(\n new AppError(\n \"You do not have permission to perform this action\",\n 403\n )\n );\n }\n }\n }\n\n next();\n }\n );\n }\n\n /**\n * Processes the cookies or authoriation token and returns the user.\n * @param req\n * @returns {Promise<User | null>} - if authentication is turned off in arkosConfig it returns null\n * @throws {AppError} Throws an error if the token is invalid or the user is not logged in.\n */\n async getAuthenticatedUser(req: ArkosRequest): Promise<User | null> {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) return null;\n\n const prisma = getPrismaInstance();\n\n let token: string | undefined;\n\n if (\n req?.headers?.authorization &&\n req?.headers?.authorization.startsWith(\"Bearer\")\n ) {\n token = req?.headers?.authorization.split(\" \")[1];\n } else if (req?.cookies?.arkos_access_token !== \"no-token\" && req.cookies) {\n token = req?.cookies?.arkos_access_token;\n }\n\n if (!token)\n throw new AppError(\n \"You are not logged in! please log in to get access\",\n 401\n );\n\n let decoded: AuthJwtPayload | undefined;\n try {\n decoded = await this.verifyJwtToken(token);\n } catch (err) {\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401\n );\n }\n\n if (!decoded?.id)\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401\n );\n\n const user: any | null = await (prisma as any).user.findUnique({\n where: { id: String(decoded.id) },\n select: {\n id: true,\n passwordChangedAt: true,\n isActive: true,\n deletedSelfAccountAt: true,\n isSuperUser: true,\n },\n });\n\n if (!user)\n throw new AppError(\n \"The user belonging to this token does no longer exists\",\n 401\n );\n\n if (\n this.userChangedPasswordAfter(user, decoded.iat!) &&\n !req.path?.includes?.(\"logout\")\n )\n throw new AppError(\n \"User recently changed password! Please log in again.\",\n 401\n );\n\n return user;\n }\n\n /**\n * Middleware function to authenticate the user based on the JWT token.\n *\n * @param {ArkosRequest} req - The request object.\n * @param {ArkosResponse} res - The response object.\n * @param {ArkosNextFunction} next - The next middleware function to be called.\n * @returns {void}\n */\n authenticate = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) {\n next();\n return;\n }\n\n req.user = (await this.getAuthenticatedUser(req)) as User;\n next();\n }\n );\n\n /**\n * Handles authentication control by checking the `authenticationControl` configuration in the `authConfigs`.\n *\n * @param {ControllerActions} action - The action being performed (e.g., create, update, delete, view).\n * @param {AuthenticationControlConfig} authenticationControl - The authentication configuration object.\n * @returns {ArkosRequestHandler} The middleware function that checks if authentication is required.\n */\n handleAuthenticationControl(\n action: AccessAction,\n authenticationControl: AuthenticationControlConfig | undefined\n ): ArkosRequestHandler {\n if (authenticationControl && typeof authenticationControl === \"object\") {\n if (authenticationControl[action] === false) return callNext;\n else if (authenticationControl[action] === true) return this.authenticate;\n } else return this.authenticate;\n\n return this.authenticate;\n }\n}\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nconst authService = new AuthService();\n\nexport default authService;\n"]}
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAgD;AAChD,wDAA8B;AAE9B,qFAA4D;AAC5D,iFAAwD;AACxD,+DAAoD;AACpD,yCAA8C;AAC9C,sEAA6C;AAC7C,uEAAuE;AAmBvE,MAAa,WAAW;IAAxB;QAsTE,iBAAY,GAAG,IAAA,qBAAU,EACvB,KAAK,EAAE,GAAiB,EAAE,GAAkB,EAAE,IAAuB,EAAE,EAAE;YACvE,MAAM,WAAW,GAAG,IAAA,uBAAc,GAAE,CAAC;YACrC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC;gBACjC,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAS,CAAC;YAC1D,IAAI,EAAE,CAAC;QACT,CAAC,CACF,CAAC;IAoBJ,CAAC;IA5UC,YAAY,CACV,EAAmB,EACnB,SAA+B,EAC/B,MAAe;QAEf,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,IAAA,uBAAc,GAAE,CAAC;QAErD,IACE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACrC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;YAElD,MAAM,IAAI,mBAAQ,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;QAE/D,MAAM;YACJ,MAAM;gBACN,OAAO,EAAE,GAAG,EAAE,MAAM;gBACpB,OAAO,CAAC,GAAG,CAAC,UAAU;gBACtB,mBAAQ,CAAC,UAAU,CAAC;QAEtB,SAAS,GAAG,CAAC,SAAS;YACpB,OAAO,EAAE,GAAG,EAAE,SAAS;YACvB,OAAO,CAAC,GAAG,CAAC,cAAc;YAC1B,mBAAQ,CAAC,cAAc,CAAmC,CAAC;QAE7D,OAAO,sBAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;YAC9B,SAAS,EAAE,SAAuB;SACnC,CAAC,CAAC;IACL,CAAC;IASD,KAAK,CAAC,iBAAiB,CACrB,iBAAyB,EACzB,YAAoB;QAEpB,OAAO,MAAM,kBAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;IAQD,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,MAAM,kBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAmBM,gBAAgB,CAAC,QAAgB;QACtC,MAAM,eAAe,GAAG,IAAA,uBAAc,GAAE,EAAE,cAAc,CAAC;QAEzD,MAAM,mBAAmB,GACvB,eAAe,EAAE,kBAAkB,EAAE,KAAK;YAC1C,oCAAoC,CAAC;QACvC,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IASD,wBAAwB,CAAC,IAAU,EAAE,YAAoB;QACvD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,MAAM,kBAAkB,GAAG,QAAQ,CACjC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAC/C,EAAE,CACH,CAAC;YAEF,OAAO,YAAY,GAAG,kBAAkB,CAAC;QAC3C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAUD,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,MAAe;QAEf,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,IAAA,uBAAc,GAAE,CAAC;QAErD,IACE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACrC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;YACvB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM;YAErB,MAAM,IAAI,mBAAQ,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAEjD,MAAM;YACJ,MAAM;gBACN,OAAO,EAAE,GAAG,EAAE,MAAM;gBACpB,OAAO,CAAC,GAAG,CAAC,UAAU;gBACtB,mBAAQ,CAAC,UAAU,CAAC;QAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;gBACzC,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,CAAC,OAAyB,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAUD,mBAAmB,CACjB,MAAoB,EACpB,YAAoB,EACpB,aAAkC;QAElC,OAAO,IAAA,qBAAU,EACf,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,IAAI,GAAG,GAAG,CAAC,IAAW,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAA,uBAAc,GAAE,CAAC;gBAEjC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,IAAI,EAAE,CAAC;oBACP,OAAO;gBACT,CAAC;gBAED,IAAI,OAAO,EAAE,cAAc,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBAChD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;wBACnD,KAAK,EAAE;4BACL,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;4BACnB,KAAK,EAAE;gCACL,IAAI,EAAE;oCACJ,IAAI,EAAE;wCACJ,WAAW,EAAE;4CACX,IAAI,EAAE;gDACJ,QAAQ,EAAE,YAAY;gDACtB,MAAM,EAAE,MAAM;6CACf;yCACF;qCACF;iCACF;6BACF;yBACF;wBACD,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;qBACrB,CAAC,CAAC;oBAEH,IAAI,CAAC,YAAY;wBACf,OAAO,IAAI,CACT,IAAI,mBAAQ,CACV,kDAAkD,EAClD,GAAG,CACJ,CACF,CAAC;gBACN,CAAC;qBAAM,IAAI,OAAO,EAAE,cAAc,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACtD,IAAI,eAAe,GAAa,EAAE,CAAC;oBAEnC,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;wBAAE,eAAe,GAAG,aAAa,CAAC;yBAC7D,IAAI,aAAa,CAAC,MAAM,CAAC;wBAC5B,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAEhD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;wBAC1C,CAAC,CAAC,IAAI,CAAC,KAAK;wBACZ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CACpD,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC/B,CAAC;oBAEF,IAAI,CAAC,aAAa,EAAE,CAAC;wBACnB,OAAO,IAAI,CACT,IAAI,mBAAQ,CACV,mDAAmD,EACnD,GAAG,CACJ,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,EAAE,CAAC;QACT,CAAC,CACF,CAAC;IACJ,CAAC;IAQD,KAAK,CAAC,oBAAoB,CAAC,GAAiB;QAC1C,MAAM,WAAW,GAAG,IAAA,uBAAc,GAAE,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,cAAc;YAAE,OAAO,IAAI,CAAC;QAE9C,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;QAEnC,IAAI,KAAyB,CAAC;QAE9B,IACE,GAAG,EAAE,OAAO,EAAE,aAAa;YAC3B,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,EAChD,CAAC;YACD,KAAK,GAAG,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,GAAG,EAAE,OAAO,EAAE,kBAAkB,KAAK,UAAU,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC1E,KAAK,GAAG,GAAG,EAAE,OAAO,EAAE,kBAAkB,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,KAAK;YACR,MAAM,IAAI,mBAAQ,CAChB,oDAAoD,EACpD,GAAG,CACJ,CAAC;QAEJ,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,mBAAQ,CAChB,iDAAiD,EACjD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,EAAE;YACd,MAAM,IAAI,mBAAQ,CAChB,iDAAiD,EACjD,GAAG,CACJ,CAAC;QAEJ,MAAM,IAAI,GAAe,MAAO,MAAc,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7D,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACjC,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI;gBACR,iBAAiB,EAAE,IAAI;gBACvB,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,IAAI;gBAC1B,WAAW,EAAE,IAAI;aAClB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI;YACP,MAAM,IAAI,mBAAQ,CAChB,wDAAwD,EACxD,GAAG,CACJ,CAAC;QAEJ,IACE,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAI,CAAC;YACjD,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC;YAE/B,MAAM,IAAI,mBAAQ,CAChB,sDAAsD,EACtD,GAAG,CACJ,CAAC;QAEJ,OAAO,IAAI,CAAC;IACd,CAAC;IA8BD,2BAA2B,CACzB,MAAoB,EACpB,qBAA8D;QAE9D,IAAI,qBAAqB,IAAI,OAAO,qBAAqB,KAAK,QAAQ,EAAE,CAAC;YACvE,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,KAAK;gBAAE,OAAO,2BAAQ,CAAC;iBACxD,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAC5E,CAAC;;YAAM,OAAO,IAAI,CAAC,YAAY,CAAC;QAEhC,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AArVD,kCAqVC;AAKD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,kBAAe,WAAW,CAAC","sourcesContent":["import jwt, { SignOptions } from \"jsonwebtoken\";\nimport bcrypt from \"bcryptjs\";\nimport { User } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { callNext } from \"../base/base.middlewares\";\nimport { getArkosConfig } from \"../../server\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../types\";\nimport {\n AuthConfigs,\n AuthJwtPayload,\n AccessAction,\n AccessControlConfig,\n AuthenticationControlConfig,\n} from \"../../types/auth\";\nimport { MsDuration } from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nexport class AuthService {\n /**\n * Signs a JWT token for the user.\n *\n * @param {number | string} id - The unique identifier of the user to generate the token for.\n * @param {string | number} [expiresIn] - The expiration time for the token. Defaults to environment variable `JWT_EXPIRES_IN`.\n * @param {string} [secret] - The secret key used to sign the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {string} The signed JWT token.\n */\n signJwtToken(\n id: number | string,\n expiresIn?: MsDuration | number,\n secret?: string\n ): string {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n (!process.env.JWT_SECRET || !configs?.jwt?.secret)\n )\n throw new AppError(\"Missing JWT secret on production!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n expiresIn = (expiresIn ||\n configs?.jwt?.expiresIn ||\n process.env.JWT_EXPIRES_IN ||\n arkosEnv.JWT_EXPIRES_IN) as keyof SignOptions[\"expiresIn\"];\n\n return jwt.sign({ id }, secret, {\n expiresIn: expiresIn as MsDuration,\n });\n }\n\n /**\n * Compares a candidate password with the stored user password to check if they match.\n *\n * @param {string} candidatePassword - The password provided by the user during login.\n * @param {string} userPassword - The password stored in the database.\n * @returns {Promise<boolean>} Returns true if the passwords match, otherwise false.\n */\n async isCorrectPassword(\n candidatePassword: string,\n userPassword: string\n ): Promise<boolean> {\n return await bcrypt.compare(candidatePassword, userPassword);\n }\n\n /**\n * Hashes a plain text password using bcrypt.\n *\n * @param {string} password - The password to be hashed.\n * @returns {Promise<string>} Returns the hashed password.\n */\n async hashPassword(password: string): Promise<string> {\n return await bcrypt.hash(password, 12);\n }\n\n /**\n * Checks if a password is strong, requiring uppercase, lowercase, and numeric characters as the default.\n *\n * **NB**: You must pay attention when using custom validation with zod or class-validator, try to use the same regex always.\n *\n * **Note**: You can define it when calling arkos.init()\n * ```ts\n * arkos.init({\n * authentication: {\n * passwordValidation:{ regex: /your-desired-regex/, message: 'password must contain...'}\n * }\n * })\n * ```\n *\n * @param {string} password - The password to check.\n * @returns {boolean} Returns true if the password meets the strength criteria, otherwise false.\n */\n public isPasswordStrong(password: string): boolean {\n const initAuthConfigs = getArkosConfig()?.authentication;\n\n const strongPasswordRegex =\n initAuthConfigs?.passwordValidation?.regex ||\n /^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).+$/;\n return strongPasswordRegex.test(password);\n }\n\n /**\n * Checks if a user has changed their password after the JWT was issued.\n *\n * @param {User} user - The user object containing the passwordChangedAt field.\n * @param {number} JWTTimestamp - The timestamp when the JWT was issued.\n * @returns {boolean} Returns true if the user changed their password after the JWT was issued, otherwise false.\n */\n userChangedPasswordAfter(user: User, JWTTimestamp: number): boolean {\n if (user.passwordChangedAt) {\n const convertedTimestamp = parseInt(\n String(user.passwordChangedAt.getTime() / 1000),\n 10\n );\n\n return JWTTimestamp < convertedTimestamp;\n }\n return false;\n }\n\n /**\n * Verifies the authenticity of a JWT token.\n *\n * @param {string} token - The JWT token to verify.\n * @param {string} [secret] - The secret key used to verify the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {Promise<AuthJwtPayload>} Returns the decoded JWT payload if the token is valid.\n * @throws {Error} Throws an error if the token is invalid or expired.\n */\n async verifyJwtToken(\n token: string,\n secret?: string\n ): Promise<AuthJwtPayload> {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\"Missing JWT secret!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n return new Promise((resolve, reject) => {\n jwt.verify(token, secret, (err, decoded) => {\n if (err) reject(err);\n else resolve(decoded as AuthJwtPayload);\n });\n });\n }\n\n /**\n * Middleware function to handle access control based on user roles and permissions.\n *\n * @param {AccessAction} action - The action being performed (e.g., create, update, delete, view).\n * @param {string} resourceName - The resource name that the action is being performed on (e.g., \"User\", \"Post\").\n * @param {AccessControlConfig} accessControl - The access control configuration.\n * @returns {ArkosRequestHandler} The middleware function that checks if the user has permission to perform the action.\n */\n handleAccessControl(\n action: AccessAction,\n resourceName: string,\n accessControl: AccessControlConfig\n ): ArkosRequestHandler {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (req.user) {\n const user = req.user as any;\n const prisma = getPrismaInstance();\n const configs = getArkosConfig();\n\n if (user.isSuperUser) {\n next();\n return;\n }\n\n if (configs?.authentication?.mode === \"dynamic\") {\n const matchingRole = await prisma.userRole.findFirst({\n where: {\n userId: req.user.id,\n roles: {\n some: {\n role: {\n permissions: {\n some: {\n resource: resourceName,\n action: action,\n },\n },\n },\n },\n },\n },\n select: { id: true },\n });\n\n if (!matchingRole)\n return next(\n new AppError(\n \"You do not have permission to perfom this action\",\n 403\n )\n );\n } else if (configs?.authentication?.mode === \"static\") {\n let authorizedRoles: string[] = [];\n\n if (Array.isArray(accessControl)) authorizedRoles = accessControl;\n else if (accessControl[action])\n authorizedRoles = accessControl[action] || [];\n\n const userRoles = Array.isArray(user?.roles)\n ? user.roles\n : [user.role];\n const hasPermission = userRoles.some((role: string) =>\n authorizedRoles.includes(role)\n );\n\n if (!hasPermission) {\n return next(\n new AppError(\n \"You do not have permission to perform this action\",\n 403\n )\n );\n }\n }\n }\n\n next();\n }\n );\n }\n\n /**\n * Processes the cookies or authoriation token and returns the user.\n * @param req\n * @returns {Promise<User | null>} - if authentication is turned off in arkosConfig it returns null\n * @throws {AppError} Throws an error if the token is invalid or the user is not logged in.\n */\n async getAuthenticatedUser(req: ArkosRequest): Promise<User | null> {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) return null;\n\n const prisma = getPrismaInstance();\n\n let token: string | undefined;\n\n if (\n req?.headers?.authorization &&\n req?.headers?.authorization.startsWith(\"Bearer\")\n ) {\n token = req?.headers?.authorization.split(\" \")[1];\n } else if (req?.cookies?.arkos_access_token !== \"no-token\" && req.cookies) {\n token = req?.cookies?.arkos_access_token;\n }\n\n if (!token)\n throw new AppError(\n \"You are not logged in! please log in to get access\",\n 401\n );\n\n let decoded: AuthJwtPayload | undefined;\n try {\n decoded = await this.verifyJwtToken(token);\n } catch (err) {\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401\n );\n }\n\n if (!decoded?.id)\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401\n );\n\n const user: any | null = await (prisma as any).user.findUnique({\n where: { id: String(decoded.id) },\n select: {\n id: true,\n passwordChangedAt: true,\n isActive: true,\n deletedSelfAccountAt: true,\n isSuperUser: true,\n },\n });\n\n if (!user)\n throw new AppError(\n \"The user belonging to this token does no longer exists\",\n 401\n );\n\n if (\n this.userChangedPasswordAfter(user, decoded.iat!) &&\n !req.path?.includes?.(\"logout\")\n )\n throw new AppError(\n \"User recently changed password! Please log in again.\",\n 401\n );\n\n return user;\n }\n\n /**\n * Middleware function to authenticate the user based on the JWT token.\n *\n * @param {ArkosRequest} req - The request object.\n * @param {ArkosResponse} res - The response object.\n * @param {ArkosNextFunction} next - The next middleware function to be called.\n * @returns {void}\n */\n authenticate = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) {\n next();\n return;\n }\n\n req.user = (await this.getAuthenticatedUser(req)) as User;\n next();\n }\n );\n\n /**\n * Handles authentication control by checking the `authenticationControl` configuration in the `authConfigs`.\n *\n * @param {ControllerActions} action - The action being performed (e.g., create, update, delete, view).\n * @param {AuthenticationControlConfig} authenticationControl - The authentication configuration object.\n * @returns {ArkosRequestHandler} The middleware function that checks if authentication is required.\n */\n handleAuthenticationControl(\n action: AccessAction,\n authenticationControl: AuthenticationControlConfig | undefined\n ): ArkosRequestHandler {\n if (authenticationControl && typeof authenticationControl === \"object\") {\n if (authenticationControl[action] === false) return callNext;\n else if (authenticationControl[action] === true) return this.authenticate;\n } else return this.authenticate;\n\n return this.authenticate;\n }\n}\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nconst authService = new AuthService();\n\nexport default authService;\n"]}
@@ -8,15 +8,14 @@ exports.toMs = toMs;
8
8
  const server_1 = require("../../../../server");
9
9
  const app_error_1 = __importDefault(require("../../../error-handler/utils/app-error"));
10
10
  const determineUsernameField = (req) => {
11
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
12
- const authConfigs = (_a = (0, server_1.getArkosConfig)()) === null || _a === void 0 ? void 0 : _a.authentication;
13
- if (((_b = req.query) === null || _b === void 0 ? void 0 : _b.usernameField) &&
14
- typeof ((_c = req.query) === null || _c === void 0 ? void 0 : _c.usernameField) === "string" &&
15
- ((_f = (_e = (_d = authConfigs === null || authConfigs === void 0 ? void 0 : authConfigs.login) === null || _d === void 0 ? void 0 : _d.allowedUsernames) === null || _e === void 0 ? void 0 : _e.includes) === null || _f === void 0 ? void 0 : _f.call(_e, req.query.usernameField)))
11
+ const authConfigs = (0, server_1.getArkosConfig)()?.authentication;
12
+ if (req.query?.usernameField &&
13
+ typeof req.query?.usernameField === "string" &&
14
+ authConfigs?.login?.allowedUsernames?.includes?.(req.query.usernameField))
16
15
  return req.query.usernameField;
17
- else if ((_g = req.query) === null || _g === void 0 ? void 0 : _g.usernameField)
16
+ else if (req.query?.usernameField)
18
17
  throw new app_error_1.default("Invalid usernameField parameter, it is not allowed!", 400);
19
- return ((_j = (_h = authConfigs === null || authConfigs === void 0 ? void 0 : authConfigs.login) === null || _h === void 0 ? void 0 : _h.allowedUsernames) === null || _j === void 0 ? void 0 : _j[0]) || "username";
18
+ return authConfigs?.login?.allowedUsernames?.[0] || "username";
20
19
  };
21
20
  exports.determineUsernameField = determineUsernameField;
22
21
  const createPrismaWhereClause = (path, value) => {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.controller.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/auth/utils/helpers/auth.controller.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { getArkosConfig } from \"../../../../server\";\nimport { ArkosRequest } from \"../../../../types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\n\n/**\n * Determines the username field to use for authentication and supports nested paths\n * Priority:\n * 1. req.query.usernameField\n * 2. config setting\n * 3. default \"username\"\n *\n * Supports dot notation for nested fields and array queries (e.g., \"profile.nickname\", \"phones.some.number\")\n *\n * @param req - The request object\n * @returns The field name to use for username identification\n */\nexport const determineUsernameField = (req: ArkosRequest): string => {\n const authConfigs = getArkosConfig()?.authentication;\n\n if (\n req.query?.usernameField &&\n typeof req.query?.usernameField === \"string\" &&\n authConfigs?.login?.allowedUsernames?.includes?.(req.query.usernameField)\n )\n return req.query.usernameField;\n else if (req.query?.usernameField)\n throw new AppError(\n \"Invalid usernameField parameter, it is not allowed!\",\n 400\n );\n\n return authConfigs?.login?.allowedUsernames?.[0] || \"username\";\n};\n\n/**\n * Creates a Prisma-compatible where clause from a path using dot notation\n * Handles nested objects and array queries with \"some\" operator\n * Example: createPrismaWhereClause(\"profile.nickname\", \"john\") or createPrismaWhereClause(\"phones.some.number\", \"1234567890\")\n *\n * @param path - The dot notation path (e.g., \"profile.nickname\" or \"phones.some.number\")\n * @param value - The value to search for\n * @returns A nested object suitable for Prisma's where clause\n */\nexport const createPrismaWhereClause = (\n path: string,\n value: any\n): Record<string, any> => {\n if (!path) return {};\n\n const parts = path.split(\".\");\n const whereClause: Record<string, any> = {};\n\n // Handle simple field case\n if (parts.length === 1) {\n whereClause[parts[0]] = value;\n return whereClause;\n }\n\n // Handle nested fields\n let current = whereClause;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n current[part] = {};\n current = current[part];\n }\n\n current[parts[parts.length - 1]] = value;\n\n return whereClause;\n};\n\n/**\n * Access a value from a simple object based on a dot notation path\n * The object will only contain a single property that matches the last part of the path\n * Example: getNestedValue({nickname: \"john\"}, \"profile.nickname\") => \"john\"\n *\n * @param obj - The object containing the value (simple key-value pair)\n * @param path - The dot notation path (only the last part is used to access the object)\n * @returns The value from the object if the key matches the last part of the path, or undefined\n */\nexport const getNestedValue = (obj: any, path: string): any => {\n if (!obj || !path) return undefined;\n\n const properties = path.split(\".\");\n const lastProperty = properties[properties.length - 1];\n\n // If the last property exists in the object, return its value\n if (lastProperty in obj) {\n return obj[lastProperty];\n }\n\n return undefined;\n};\n\n/**\n * MsDuration type allows specific units for durations\n *\n * **For example**: 90d, 10ms, 50s.\n *\n * **Available metrics**: ms, s, m, h, d, w, y.\n * */\nexport type MsDuration =\n | number\n | `${number}`\n | `${number}${\"ms\" | \"s\" | \"m\" | \"h\" | \"d\" | \"w\" | \"y\"}`; // Short format (e.g., \"1y\")\n\n// Normalize function to convert long units to short ones\nfunction normalizeDuration(input: string): string {\n return input\n .toLowerCase()\n .replace(/years?|yr|year/g, \"y\")\n .replace(/minutes?|min/g, \"m\")\n .replace(/seconds?|sec|secs/g, \"s\")\n .replace(/hours?|hr/g, \"h\")\n .replace(/days?/g, \"d\")\n .replace(/weeks?/g, \"w\")\n .replace(/milliseconds?/g, \"ms\");\n}\n\nexport function toMs(input: number | MsDuration): number {\n if (typeof input === \"number\") return input * 1000; // If it's a number, assume it's in seconds\n\n // Normalize the string input\n const normalizedInput = normalizeDuration(input.trim());\n\n // Type assertion: we assert that normalizedInput will now match the MsDuration format\n const regex = /^(\\d+(?:\\.\\d+)?)(ms|s|m|h|d|w|y)$/i;\n const match = normalizedInput.match(regex);\n\n if (!match) throw new Error(`Invalid time format: ${input}`);\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase() as\n | \"ms\"\n | \"s\"\n | \"m\"\n | \"h\"\n | \"d\"\n | \"w\"\n | \"y\";\n\n const multipliers: Record<\"ms\" | \"s\" | \"m\" | \"h\" | \"d\" | \"w\" | \"y\", number> =\n {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n y: 31557600000, // 365.25 days in ms\n };\n\n return value * multipliers[unit];\n}\n"]}
1
+ {"version":3,"file":"auth.controller.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/auth/utils/helpers/auth.controller.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { getArkosConfig } from \"../../../../server\";\nimport { ArkosRequest } from \"../../../../types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\n\n/**\n * Determines the username field to use for authentication and supports nested paths\n * Priority:\n * 1. req.query.usernameField\n * 2. config setting\n * 3. default \"username\"\n *\n * Supports dot notation for nested fields and array queries (e.g., \"profile.nickname\", \"phones.some.number\")\n *\n * @param req - The request object\n * @returns The field name to use for username identification\n */\nexport const determineUsernameField = (req: ArkosRequest): string => {\n const authConfigs = getArkosConfig()?.authentication;\n\n if (\n req.query?.usernameField &&\n typeof req.query?.usernameField === \"string\" &&\n authConfigs?.login?.allowedUsernames?.includes?.(req.query.usernameField)\n )\n return req.query.usernameField;\n else if (req.query?.usernameField)\n throw new AppError(\n \"Invalid usernameField parameter, it is not allowed!\",\n 400\n );\n\n return authConfigs?.login?.allowedUsernames?.[0] || \"username\";\n};\n\n/**\n * Creates a Prisma-compatible where clause from a path using dot notation\n * Handles nested objects and array queries with \"some\" operator\n * Example: createPrismaWhereClause(\"profile.nickname\", \"john\") or createPrismaWhereClause(\"phones.some.number\", \"1234567890\")\n *\n * @param path - The dot notation path (e.g., \"profile.nickname\" or \"phones.some.number\")\n * @param value - The value to search for\n * @returns A nested object suitable for Prisma's where clause\n */\nexport const createPrismaWhereClause = (\n path: string,\n value: any\n): Record<string, any> => {\n if (!path) return {};\n\n const parts = path.split(\".\");\n const whereClause: Record<string, any> = {};\n\n // Handle simple field case\n if (parts.length === 1) {\n whereClause[parts[0]] = value;\n return whereClause;\n }\n\n // Handle nested fields\n let current = whereClause;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n current[part] = {};\n current = current[part];\n }\n\n current[parts[parts.length - 1]] = value;\n\n return whereClause;\n};\n\n/**\n * Access a value from a simple object based on a dot notation path\n * The object will only contain a single property that matches the last part of the path\n * Example: getNestedValue({nickname: \"john\"}, \"profile.nickname\") => \"john\"\n *\n * @param obj - The object containing the value (simple key-value pair)\n * @param path - The dot notation path (only the last part is used to access the object)\n * @returns The value from the object if the key matches the last part of the path, or undefined\n */\nexport const getNestedValue = (obj: any, path: string): any => {\n if (!obj || !path) return undefined;\n\n const properties = path.split(\".\");\n const lastProperty = properties[properties.length - 1];\n\n // If the last property exists in the object, return its value\n if (lastProperty in obj) {\n return obj[lastProperty];\n }\n\n return undefined;\n};\n\n/**\n * MsDuration type allows specific units for durations\n *\n * **For example**: 90d, 10ms, 50s.\n *\n * **Available metrics**: ms, s, m, h, d, w, y.\n * */\nexport type MsDuration =\n | number\n | `${number}`\n | `${number}${\"ms\" | \"s\" | \"m\" | \"h\" | \"d\" | \"w\" | \"y\"}`; // Short format (e.g., \"1y\")\n\n// Normalize function to convert long units to short ones\nfunction normalizeDuration(input: string): string {\n return input\n .toLowerCase()\n .replace(/years?|yr|year/g, \"y\")\n .replace(/minutes?|min/g, \"m\")\n .replace(/seconds?|sec|secs/g, \"s\")\n .replace(/hours?|hr/g, \"h\")\n .replace(/days?/g, \"d\")\n .replace(/weeks?/g, \"w\")\n .replace(/milliseconds?/g, \"ms\");\n}\n\nexport function toMs(input: number | MsDuration): number {\n if (typeof input === \"number\") return input * 1000; // If it's a number, assume it's in seconds\n\n // Normalize the string input\n const normalizedInput = normalizeDuration(input.trim());\n\n // Type assertion: we assert that normalizedInput will now match the MsDuration format\n const regex = /^(\\d+(?:\\.\\d+)?)(ms|s|m|h|d|w|y)$/i;\n const match = normalizedInput.match(regex);\n\n if (!match) throw new Error(`Invalid time format: ${input}`);\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase() as\n | \"ms\"\n | \"s\"\n | \"m\"\n | \"h\"\n | \"d\"\n | \"w\"\n | \"y\";\n\n const multipliers: Record<\"ms\" | \"s\" | \"m\" | \"h\" | \"d\" | \"w\" | \"y\", number> =\n {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n y: 31557600000, // 365.25 days in ms\n };\n\n return value * multipliers[unit];\n}\n"]}
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -23,29 +14,26 @@ const models_helpers_1 = require("../../utils/helpers/models.helpers");
23
14
  const base_controller_helpers_1 = require("./utils/helpers/base.controller.helpers");
24
15
  class BaseController {
25
16
  constructor(modelName) {
26
- var _a;
27
- this.createOne = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
28
- var _a;
29
- const data = yield this.baseService.createOne(req.body, (_a = req.query) === null || _a === void 0 ? void 0 : _a.prismaQueryOptions);
17
+ this.createOne = (0, catch_async_1.default)(async (req, res, next) => {
18
+ const data = await this.baseService.createOne(req.body, req.query?.prismaQueryOptions);
30
19
  if (this.middlewares.afterCreateOne) {
31
20
  req.responseData = { data };
32
21
  req.responseStatus = 201;
33
22
  return next();
34
23
  }
35
24
  res.status(201).json({ data });
36
- }));
37
- this.createMany = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
38
- const { data, total } = yield this.baseService.createMany(req.body);
25
+ });
26
+ this.createMany = (0, catch_async_1.default)(async (req, res, next) => {
27
+ const { data, total } = await this.baseService.createMany(req.body);
39
28
  if (this.middlewares.afterCreateMany) {
40
29
  req.responseData = { total, results: data.length, data };
41
30
  req.responseStatus = 201;
42
31
  return next();
43
32
  }
44
33
  res.status(201).json({ total, results: data.length, data });
45
- }));
46
- this.findMany = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
47
- var _a;
48
- const features = new api_features_1.default(req, this.modelName, (_a = this.baseService.relationFields) === null || _a === void 0 ? void 0 : _a.singular.reduce((acc, curr) => {
34
+ });
35
+ this.findMany = (0, catch_async_1.default)(async (req, res, next) => {
36
+ const features = new api_features_1.default(req, this.modelName, this.baseService.relationFields?.singular.reduce((acc, curr) => {
49
37
  acc[curr.name] = true;
50
38
  return acc;
51
39
  }, {}))
@@ -53,78 +41,74 @@ class BaseController {
53
41
  .sort()
54
42
  .limitFields()
55
43
  .paginate();
56
- const { data, total } = yield this.baseService.findMany(features.filters);
44
+ const { data, total } = await this.baseService.findMany(features.filters);
57
45
  if (this.middlewares.afterFindMany) {
58
46
  req.responseData = { total, results: data.length, data };
59
47
  req.responseStatus = 200;
60
48
  return next();
61
49
  }
62
50
  res.status(200).json({ total, results: data.length, data });
63
- }));
64
- this.findOne = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
65
- var _a;
66
- const data = yield this.baseService.findOne(req.params, (_a = req.query) === null || _a === void 0 ? void 0 : _a.prismaQueryOptions);
51
+ });
52
+ this.findOne = (0, catch_async_1.default)(async (req, res, next) => {
53
+ const data = await this.baseService.findOne(req.params, req.query?.prismaQueryOptions);
67
54
  if (this.middlewares.afterFindOne) {
68
55
  req.responseData = { data };
69
56
  req.responseStatus = 200;
70
57
  return next();
71
58
  }
72
59
  res.status(200).json({ data });
73
- }));
74
- this.updateOne = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
75
- var _a;
76
- const data = yield this.baseService.updateOne(req.params, req.body, (_a = req.query) === null || _a === void 0 ? void 0 : _a.prismaQueryOptions);
60
+ });
61
+ this.updateOne = (0, catch_async_1.default)(async (req, res, next) => {
62
+ const data = await this.baseService.updateOne(req.params, req.body, req.query?.prismaQueryOptions);
77
63
  if (this.middlewares.afterUpdateOne) {
78
64
  req.responseData = { data };
79
65
  req.responseStatus = 200;
80
66
  return next();
81
67
  }
82
68
  res.status(200).json({ data });
83
- }));
84
- this.updateMany = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
85
- var _a;
69
+ });
70
+ this.updateMany = (0, catch_async_1.default)(async (req, res, next) => {
86
71
  if (!Object.keys(req.query).some((key) => key !== "prismaQueryOptions")) {
87
72
  return next(new app_error_1.default("Filter criteria not provided for bulk update.", 400));
88
73
  }
89
- req.query.filterMode = ((_a = req.query) === null || _a === void 0 ? void 0 : _a.filterMode) || "AND";
74
+ req.query.filterMode = req.query?.filterMode || "AND";
90
75
  const features = new api_features_1.default(req, this.modelName).filter().sort();
91
76
  delete features.filters.include;
92
- const { data, total } = yield this.baseService.updateMany(features.filters, req.body);
77
+ const { data, total } = await this.baseService.updateMany(features.filters, req.body);
93
78
  if (this.middlewares.afterUpdateMany) {
94
79
  req.responseData = { total, results: data.length, data };
95
80
  req.responseStatus = 200;
96
81
  return next();
97
82
  }
98
83
  res.status(200).json({ total, results: data.length, data });
99
- }));
100
- this.deleteOne = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
101
- yield this.baseService.deleteOne(req.params);
84
+ });
85
+ this.deleteOne = (0, catch_async_1.default)(async (req, res, next) => {
86
+ await this.baseService.deleteOne(req.params);
102
87
  if (this.middlewares.afterDeleteOne) {
103
88
  req.responseData = { id: String(req.params.id) };
104
89
  req.responseStatus = 204;
105
90
  return next();
106
91
  }
107
92
  res.status(204).send();
108
- }));
109
- this.deleteMany = (0, catch_async_1.default)((req, res, next) => __awaiter(this, void 0, void 0, function* () {
110
- var _a;
93
+ });
94
+ this.deleteMany = (0, catch_async_1.default)(async (req, res, next) => {
111
95
  if (!Object.keys(req.query).some((key) => key !== "prismaQueryOptions")) {
112
96
  return next(new app_error_1.default("Filter criteria not provided for bulk deletion.", 400));
113
97
  }
114
- req.query.filterMode = ((_a = req.query) === null || _a === void 0 ? void 0 : _a.filterMode) || "AND";
98
+ req.query.filterMode = req.query?.filterMode || "AND";
115
99
  const features = new api_features_1.default(req, this.modelName).filter().sort();
116
100
  delete features.filters.include;
117
- const { data, total } = yield this.baseService.deleteMany(features.filters);
101
+ const { data, total } = await this.baseService.deleteMany(features.filters);
118
102
  if (this.middlewares.afterDeleteMany) {
119
103
  req.responseData = { total, results: data.length, data };
120
104
  req.responseStatus = 200;
121
105
  return next();
122
106
  }
123
107
  res.status(200).json({ total, results: data.length, data });
124
- }));
108
+ });
125
109
  this.modelName = modelName;
126
110
  this.baseService = new base_service_1.BaseService(modelName);
127
- this.middlewares = ((_a = (0, models_helpers_1.getModelModules)(modelName)) === null || _a === void 0 ? void 0 : _a.middlewares) || {};
111
+ this.middlewares = (0, models_helpers_1.getModelModules)(modelName)?.middlewares || {};
128
112
  }
129
113
  }
130
114
  exports.BaseController = BaseController;
@@ -132,10 +116,10 @@ function getAvalibleRoutes(req, res, next) {
132
116
  const routes = (0, base_controller_helpers_1.getAppRoutes)();
133
117
  res.json(routes);
134
118
  }
135
- exports.getAvailableResources = (0, catch_async_1.default)((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
119
+ exports.getAvailableResources = (0, catch_async_1.default)(async (req, res, next) => {
136
120
  const models = (0, models_helpers_1.getModels)();
137
121
  res.status(200).json({
138
122
  data: [...models.map((model) => (0, change_case_helpers_1.kebabCase)(model)), "file-upload"],
139
123
  });
140
- }));
124
+ });
141
125
  //# sourceMappingURL=base.controller.js.map