arkos 0.1.27-beta.1 → 0.2.0-beta.1

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 (234) hide show
  1. package/README.md +195 -199
  2. package/dist/cjs/app.js +1 -127
  3. package/dist/cjs/app.js.map +1 -1
  4. package/dist/cjs/exports/auth/index.js +6 -0
  5. package/dist/cjs/exports/auth/index.js.map +1 -0
  6. package/dist/cjs/exports/error-handler/index.js +0 -5
  7. package/dist/cjs/exports/error-handler/index.js.map +1 -1
  8. package/dist/cjs/exports/index.js +0 -18
  9. package/dist/cjs/exports/index.js.map +1 -1
  10. package/dist/cjs/exports/prisma/index.js +3 -0
  11. package/dist/cjs/exports/prisma/index.js.map +1 -0
  12. package/dist/cjs/exports/services/index.js.map +1 -1
  13. package/dist/cjs/exports/utils/change-case.js +18 -0
  14. package/dist/cjs/exports/utils/change-case.js.map +1 -0
  15. package/dist/cjs/exports/utils/index.js +1 -8
  16. package/dist/cjs/exports/utils/index.js.map +1 -1
  17. package/dist/cjs/exports/validation/index.js +1 -5
  18. package/dist/cjs/exports/validation/index.js.map +1 -1
  19. package/dist/cjs/modules/auth/__tests__/auth.controller.test.js +514 -0
  20. package/dist/cjs/modules/auth/__tests__/auth.controller.test.js.map +1 -0
  21. package/dist/cjs/modules/auth/auth.controller.js +100 -211
  22. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  23. package/dist/cjs/modules/auth/auth.router.js +57 -49
  24. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  25. package/dist/cjs/modules/auth/auth.service.js +94 -64
  26. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  27. package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js +45 -0
  28. package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js.map +1 -0
  29. package/dist/cjs/modules/auth/utils/helpers/auth.helpers.js +13 -0
  30. package/dist/cjs/modules/auth/utils/helpers/auth.helpers.js.map +1 -0
  31. package/dist/cjs/modules/base/base.controller.js +116 -244
  32. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  33. package/dist/cjs/modules/base/base.middlewares.js +18 -21
  34. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  35. package/dist/cjs/modules/base/base.router.js +42 -35
  36. package/dist/cjs/modules/base/base.router.js.map +1 -1
  37. package/dist/cjs/modules/base/base.service.js +126 -115
  38. package/dist/cjs/modules/base/base.service.js.map +1 -1
  39. package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js +478 -0
  40. package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js.map +1 -0
  41. package/dist/cjs/modules/base/utils/helpers/base.helpers.js +156 -0
  42. package/dist/cjs/modules/base/utils/helpers/base.helpers.js.map +1 -0
  43. package/dist/cjs/modules/email/email.service.js +21 -14
  44. package/dist/cjs/modules/email/email.service.js.map +1 -1
  45. package/dist/cjs/modules/error-handler/error-handler.controller.js +4 -3
  46. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  47. package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
  48. package/dist/cjs/modules/error-handler/utils/catch-async.js +16 -4
  49. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  50. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +31 -17
  51. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  52. package/dist/cjs/modules/file-uploader/file-uploader.controller.js +164 -0
  53. package/dist/cjs/modules/file-uploader/file-uploader.controller.js.map +1 -0
  54. package/dist/cjs/modules/file-uploader/file-uploader.router.js +35 -0
  55. package/dist/cjs/modules/file-uploader/file-uploader.router.js.map +1 -0
  56. package/dist/cjs/modules/file-uploader/file-uploader.service.js +17 -8
  57. package/dist/cjs/modules/file-uploader/file-uploader.service.js.map +1 -1
  58. package/dist/cjs/paths.js +1 -9
  59. package/dist/cjs/paths.js.map +1 -1
  60. package/dist/cjs/scripts/create-test.js +35 -0
  61. package/dist/cjs/scripts/create-test.js.map +1 -0
  62. package/dist/cjs/server.js +1 -43
  63. package/dist/cjs/server.js.map +1 -1
  64. package/dist/cjs/utils/arkos-env.js +1 -0
  65. package/dist/cjs/utils/arkos-env.js.map +1 -1
  66. package/dist/cjs/utils/features/api.features.js +56 -60
  67. package/dist/cjs/utils/features/api.features.js.map +1 -1
  68. package/dist/cjs/utils/features/change-case.features.js +67 -0
  69. package/dist/cjs/utils/features/change-case.features.js.map +1 -0
  70. package/dist/cjs/utils/helpers/api.features.helpers.js +2 -1
  71. package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
  72. package/dist/cjs/utils/helpers/base.controller.helpers.js +39 -0
  73. package/dist/cjs/utils/helpers/base.controller.helpers.js.map +1 -0
  74. package/dist/cjs/utils/helpers/change-case.helpers.js +185 -0
  75. package/dist/cjs/utils/helpers/change-case.helpers.js.map +1 -0
  76. package/dist/cjs/utils/helpers/deepmerge.helper.js +119 -0
  77. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +1 -0
  78. package/dist/cjs/utils/helpers/fs.helpers.js +28 -3
  79. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  80. package/dist/cjs/utils/helpers/models.helpers.js +152 -120
  81. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  82. package/dist/cjs/utils/helpers/pluralize.helpers.js +3 -0
  83. package/dist/cjs/utils/helpers/pluralize.helpers.js.map +1 -0
  84. package/dist/cjs/utils/helpers/prisma.helpers.js +20 -41
  85. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  86. package/dist/cjs/utils/helpers/query-parser.helpers.js +45 -0
  87. package/dist/cjs/utils/helpers/query-parser.helpers.js.map +1 -0
  88. package/dist/cjs/utils/helpers/text.helpers.js.map +1 -1
  89. package/dist/cjs/utils/scripts/export-prisma-types.js +33 -33
  90. package/dist/cjs/utils/scripts/export-prisma-types.js.map +1 -1
  91. package/dist/cjs/utils/scripts/generate-zod-schemas.js +107 -94
  92. package/dist/cjs/utils/scripts/generate-zod-schemas.js.map +1 -1
  93. package/dist/cjs/utils/scripts/prisma-db-push.js.map +1 -1
  94. package/dist/cjs/utils/validate-dto.js +16 -12
  95. package/dist/cjs/utils/validate-dto.js.map +1 -1
  96. package/dist/cjs/utils/validate-schema.js +26 -0
  97. package/dist/cjs/utils/validate-schema.js.map +1 -0
  98. package/dist/es2020/app.js +1 -88
  99. package/dist/es2020/app.js.map +1 -1
  100. package/dist/es2020/exports/auth/index.js +6 -0
  101. package/dist/es2020/exports/auth/index.js.map +1 -0
  102. package/dist/es2020/exports/error-handler/index.js +9 -7
  103. package/dist/es2020/exports/error-handler/index.js.map +1 -1
  104. package/dist/es2020/exports/index.js +5 -7
  105. package/dist/es2020/exports/index.js.map +1 -1
  106. package/dist/es2020/exports/prisma/index.js +3 -0
  107. package/dist/es2020/exports/prisma/index.js.map +1 -0
  108. package/dist/es2020/exports/services/index.js +52 -8
  109. package/dist/es2020/exports/services/index.js.map +1 -1
  110. package/dist/es2020/exports/utils/change-case.js +18 -0
  111. package/dist/es2020/exports/utils/change-case.js.map +1 -0
  112. package/dist/es2020/exports/utils/index.js +5 -8
  113. package/dist/es2020/exports/utils/index.js.map +1 -1
  114. package/dist/es2020/exports/validation/index.js +7 -5
  115. package/dist/es2020/exports/validation/index.js.map +1 -1
  116. package/dist/es2020/modules/auth/auth.controller.js +101 -214
  117. package/dist/es2020/modules/auth/auth.controller.js.map +1 -1
  118. package/dist/es2020/modules/auth/auth.router.js +48 -46
  119. package/dist/es2020/modules/auth/auth.router.js.map +1 -1
  120. package/dist/es2020/modules/auth/auth.service.js +64 -46
  121. package/dist/es2020/modules/auth/auth.service.js.map +1 -1
  122. package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js +13 -0
  123. package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js.map +1 -0
  124. package/dist/es2020/modules/base/base.controller.js +53 -184
  125. package/dist/es2020/modules/base/base.controller.js.map +1 -1
  126. package/dist/es2020/modules/base/base.middlewares.js +30 -23
  127. package/dist/es2020/modules/base/base.middlewares.js.map +1 -1
  128. package/dist/es2020/modules/base/base.router.js +54 -51
  129. package/dist/es2020/modules/base/base.router.js.map +1 -1
  130. package/dist/es2020/modules/base/base.service.js +72 -53
  131. package/dist/es2020/modules/base/base.service.js.map +1 -1
  132. package/dist/es2020/modules/base/utils/helpers/base.helpers.js +151 -0
  133. package/dist/es2020/modules/base/utils/helpers/base.helpers.js.map +1 -0
  134. package/dist/es2020/modules/email/email.service.js +14 -8
  135. package/dist/es2020/modules/email/email.service.js.map +1 -1
  136. package/dist/es2020/modules/error-handler/error-handler.controller.js +43 -6
  137. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +1 -1
  138. package/dist/es2020/modules/error-handler/utils/app-error.js +3 -1
  139. package/dist/es2020/modules/error-handler/utils/app-error.js.map +1 -1
  140. package/dist/es2020/modules/error-handler/utils/catch-async.js +10 -5
  141. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +1 -1
  142. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +145 -91
  143. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  144. package/dist/es2020/modules/file-uploader/file-uploader.controller.js +155 -0
  145. package/dist/es2020/modules/file-uploader/file-uploader.controller.js.map +1 -0
  146. package/dist/es2020/modules/file-uploader/file-uploader.router.js +26 -0
  147. package/dist/es2020/modules/file-uploader/file-uploader.router.js.map +1 -0
  148. package/dist/es2020/modules/file-uploader/file-uploader.service.js +33 -23
  149. package/dist/es2020/modules/file-uploader/file-uploader.service.js.map +1 -1
  150. package/dist/es2020/paths.js +1 -3
  151. package/dist/es2020/paths.js.map +1 -1
  152. package/dist/es2020/scripts/create-test.js +35 -0
  153. package/dist/es2020/scripts/create-test.js.map +1 -0
  154. package/dist/es2020/server.js +1 -38
  155. package/dist/es2020/server.js.map +1 -1
  156. package/dist/es2020/utils/arkos-env.js +4 -1
  157. package/dist/es2020/utils/arkos-env.js.map +1 -1
  158. package/dist/es2020/utils/features/api.features.js +39 -29
  159. package/dist/es2020/utils/features/api.features.js.map +1 -1
  160. package/dist/es2020/utils/features/change-case.features.js +67 -0
  161. package/dist/es2020/utils/features/change-case.features.js.map +1 -0
  162. package/dist/es2020/utils/helpers/api.features.helpers.js +6 -2
  163. package/dist/es2020/utils/helpers/api.features.helpers.js.map +1 -1
  164. package/dist/es2020/utils/helpers/base.controller.helpers.js +28 -0
  165. package/dist/es2020/utils/helpers/base.controller.helpers.js.map +1 -0
  166. package/dist/es2020/utils/helpers/change-case.helpers.js +185 -0
  167. package/dist/es2020/utils/helpers/change-case.helpers.js.map +1 -0
  168. package/dist/es2020/utils/helpers/deepmerge.helper.js +119 -0
  169. package/dist/es2020/utils/helpers/deepmerge.helper.js.map +1 -0
  170. package/dist/es2020/utils/helpers/fs.helpers.js +31 -3
  171. package/dist/es2020/utils/helpers/fs.helpers.js.map +1 -1
  172. package/dist/es2020/utils/helpers/models.helpers.js +112 -47
  173. package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
  174. package/dist/es2020/utils/helpers/pluralize.helpers.js +3 -0
  175. package/dist/es2020/utils/helpers/pluralize.helpers.js.map +1 -0
  176. package/dist/es2020/utils/helpers/prisma.helpers.js +17 -6
  177. package/dist/es2020/utils/helpers/prisma.helpers.js.map +1 -1
  178. package/dist/es2020/utils/helpers/query-parser.helpers.js +45 -0
  179. package/dist/es2020/utils/helpers/query-parser.helpers.js.map +1 -0
  180. package/dist/es2020/utils/helpers/text.helpers.js +4 -1
  181. package/dist/es2020/utils/helpers/text.helpers.js.map +1 -1
  182. package/dist/es2020/utils/scripts/export-prisma-types.js +70 -35
  183. package/dist/es2020/utils/scripts/export-prisma-types.js.map +1 -1
  184. package/dist/es2020/utils/scripts/generate-zod-schemas.js +9 -4
  185. package/dist/es2020/utils/scripts/generate-zod-schemas.js.map +1 -1
  186. package/dist/es2020/utils/scripts/prisma-db-push.js +13 -8
  187. package/dist/es2020/utils/scripts/prisma-db-push.js.map +1 -1
  188. package/dist/es2020/utils/validate-dto.js +13 -14
  189. package/dist/es2020/utils/validate-dto.js.map +1 -1
  190. package/dist/es2020/utils/validate-schema.js +15 -0
  191. package/dist/es2020/utils/validate-schema.js.map +1 -0
  192. package/dist/types/app.d.ts +2 -12
  193. package/dist/types/exports/auth/index.d.ts +3 -0
  194. package/dist/types/exports/error-handler/index.d.ts +0 -5
  195. package/dist/types/exports/index.d.ts +2 -4
  196. package/dist/types/exports/prisma/index.d.ts +2 -0
  197. package/dist/types/exports/utils/change-case.d.ts +1 -0
  198. package/dist/types/exports/utils/index.d.ts +1 -7
  199. package/dist/types/exports/validation/index.d.ts +0 -4
  200. package/dist/types/modules/auth/auth.controller.d.ts +14 -16
  201. package/dist/types/modules/auth/auth.service.d.ts +7 -6
  202. package/dist/types/modules/auth/utils/helpers/auth.helpers.d.ts +2 -0
  203. package/dist/types/modules/base/base.controller.d.ts +11 -14
  204. package/dist/types/modules/base/base.middlewares.d.ts +2 -2
  205. package/dist/types/modules/base/base.service.d.ts +1 -3
  206. package/dist/types/modules/base/utils/helpers/base.helpers.d.ts +4 -0
  207. package/dist/types/modules/error-handler/utils/catch-async.d.ts +2 -2
  208. package/dist/types/modules/file-uploader/file-uploader.controller.d.ts +3 -0
  209. package/dist/types/modules/file-uploader/file-uploader.router.d.ts +3 -0
  210. package/dist/types/scripts/create-test.d.ts +1 -0
  211. package/dist/types/server.d.ts +2 -2
  212. package/dist/types/utils/arkos-env.d.ts +1 -0
  213. package/dist/types/utils/features/change-case.features.d.ts +12 -0
  214. package/dist/types/utils/helpers/base.controller.helpers.d.ts +2 -0
  215. package/dist/types/utils/helpers/change-case.helpers.d.ts +26 -0
  216. package/dist/types/utils/helpers/deepmerge.helper.d.ts +19 -0
  217. package/dist/types/utils/helpers/fs.helpers.d.ts +1 -0
  218. package/dist/types/utils/helpers/models.helpers.d.ts +21 -9
  219. package/dist/types/utils/helpers/pluralize.helpers.d.ts +1 -0
  220. package/dist/types/utils/helpers/prisma.helpers.d.ts +2 -2
  221. package/dist/types/utils/helpers/query-parser.helpers.d.ts +11 -0
  222. package/dist/types/utils/validate-schema.d.ts +2 -0
  223. package/package.json +175 -163
  224. package/dist/cjs/modules/base/utils/base.helpers.js +0 -82
  225. package/dist/cjs/modules/base/utils/base.helpers.js.map +0 -1
  226. package/dist/cjs/package.json +0 -1
  227. package/dist/cjs/utils/permissions/index.js +0 -17
  228. package/dist/cjs/utils/permissions/index.js.map +0 -1
  229. package/dist/es2020/modules/base/utils/base.helpers.js +0 -79
  230. package/dist/es2020/modules/base/utils/base.helpers.js.map +0 -1
  231. package/dist/es2020/utils/permissions/index.js +0 -14
  232. package/dist/es2020/utils/permissions/index.js.map +0 -1
  233. package/dist/types/modules/base/utils/base.helpers.d.ts +0 -4
  234. package/dist/types/utils/permissions/index.d.ts +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.controller.test.js","sourceRoot":"","sources":["../../../../../src/modules/auth/__tests__/auth.controller.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect, vi, beforeEach, afterEach } from \"vitest\";\nimport {\n authControllerFactory,\n defaultExcludedUserFields,\n} from \"../auth.controller\";\nimport authService from \"../auth.service\";\nimport { getBaseServices } from \"../../base/base.service\";\nimport { getPrismaInstance } from \"../../../utils/helpers/prisma.helpers\";\nimport { importPrismaModelModules } from \"../../../utils/helpers/models.helpers\";\nimport { getInitConfigs } from \"../../../server\";\n\nvi.mock(\"bcrypt\", () => ({\n default: {\n compare: vi.fn(),\n hash: vi.fn(),\n },\n}));\n\n// Mock dependencies\nvi.mock(\"../auth.service\", () => ({\n default: {\n isCorrectPassword: vi.fn(),\n signJwtToken: vi.fn(),\n isPasswordStrong: vi.fn(),\n hashPassword: vi.fn(),\n authenticate: vi.fn(),\n handleAuthenticationControl: vi.fn(),\n handleActionAccessControl: vi.fn(),\n },\n}));\n\nvi.mock(\"../../base/base.service\", () => ({\n getBaseServices: vi.fn(),\n}));\n\nvi.mock(\"../../../utils/helpers/prisma.helpers\", () => ({\n getPrismaInstance: vi.fn(),\n}));\n\n// In your auth.controller.test.ts file, update your mock for models.helpers.ts\n\nvi.mock(\"../../../utils/helpers/models.helpers\", () => ({\n importPrismaModelModules: vi.fn(),\n getPrismaModelRelations: vi.fn(),\n getModels: vi.fn(() => []),\n getModelUniqueFields: vi.fn(() => []),\n models: [],\n prismaModelRelationFields: {},\n}));\n\nvi.mock(\"../../../server\", () => ({\n getInitConfigs: vi.fn(),\n close: vi.fn(),\n}));\n\ndescribe(\"Auth Controller Factory\", () => {\n let req: any;\n let res: any;\n let next: any;\n let mockPrisma: any;\n let authController: any;\n let userService: any;\n\n beforeEach(async () => {\n // Reset mocks\n vi.resetAllMocks();\n\n // Setup mocks\n userService = {\n findOne: vi.fn(),\n createOne: vi.fn(),\n };\n\n mockPrisma = {\n user: {\n findUnique: vi.fn(),\n update: vi.fn(),\n },\n };\n\n // Setup mock implementations\n (getBaseServices as any).mockReturnValue({\n user: userService,\n });\n\n (getPrismaInstance as any).mockReturnValue(mockPrisma);\n (importPrismaModelModules as any).mockResolvedValue({\n prismaQueryOptions: {\n queryOptions: {},\n findOne: {},\n },\n });\n\n (getInitConfigs as any).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"both\",\n },\n },\n });\n\n // Create request, response, and next function mocks\n req = {\n user: {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n active: true,\n },\n body: {},\n query: {},\n secure: false,\n headers: {},\n };\n\n res = {\n status: vi.fn().mockReturnThis(),\n json: vi.fn(),\n cookie: vi.fn(),\n send: vi.fn(),\n };\n\n next = vi.fn();\n\n // Create the auth controller\n authController = await authControllerFactory();\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n describe(\"getMe\", () => {\n it(\"should get the current user and return it\", async () => {\n // Setup\n userService.findOne.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n });\n\n // Execute\n await authController.getMe(req, res, next);\n\n // Verify\n expect(userService.findOne).toHaveBeenCalledWith(\n { id: \"user-id-123\" },\n expect.any(String)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith(req.user);\n });\n\n it(\"should remove excluded fields from the user object\", async () => {\n // Setup\n const fullUser = {\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n password: \"hashedPassword\",\n passwordChangedAt: new Date(),\n active: true,\n };\n\n req.user = { ...fullUser };\n userService.findOne.mockResolvedValueOnce(fullUser);\n\n // Execute\n await authController.getMe(req, res, next);\n\n // Verify\n Object.keys(defaultExcludedUserFields).forEach((field) => {\n expect(req.user[field]).toBeUndefined();\n });\n });\n\n it(\"should call next middleware when afterGetMe is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterGetMe: true,\n });\n\n userService.findOne.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n });\n\n // Execute\n await controllerWithMiddleware.getMe(req, res, next);\n\n // Verify\n expect(req.responseData).toBeDefined();\n expect(req.responseStatus).toBe(200);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"logout\", () => {\n it(\"should clear the access token cookie and return 204\", async () => {\n // Execute\n await authController.logout(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"no-token\",\n expect.objectContaining({\n httpOnly: true,\n })\n );\n expect(res.status).toHaveBeenCalledWith(204);\n expect(res.json).toHaveBeenCalled();\n });\n\n it(\"should call next middleware when afterLogout is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterLogout: true,\n });\n\n // Execute\n await controllerWithMiddleware.logout(req, res, next);\n\n // Verify\n expect(req.responseData).toBeNull();\n expect(req.responseStatus).toBe(204);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"login\", () => {\n it(\"should return 400 if username or password is missing\", async () => {\n // Setup\n req.body = { username: \"testuser\" }; // Missing password\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"username and password\"),\n })\n );\n });\n\n it(\"should use default username field from config when not specified in query\", async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.signJwtToken as any).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(mockPrisma.user.findUnique).toHaveBeenCalledWith({\n where: { username: \"testuser\" },\n });\n });\n\n it(\"should use username field from query parameter when provided\", async () => {\n // Setup\n req.query.usernameField = \"email\";\n req.body = { email: \"test@example.com\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n email: \"test@example.com\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.signJwtToken as any).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(mockPrisma.user.findUnique).toHaveBeenCalledWith({\n where: { email: \"test@example.com\" },\n });\n });\n\n it(\"should return 401 if user is not found\", async () => {\n // Setup\n req.body = { username: \"nonexistentuser\", password: \"Password123\" };\n mockPrisma.user.findUnique.mockResolvedValueOnce(null);\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 401,\n message: expect.stringContaining(\"Incorrect username or password\"),\n })\n );\n });\n\n it(\"should return 401 if password is incorrect\", async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"WrongPassword123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(false);\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 401,\n message: expect.stringContaining(\"Incorrect username or password\"),\n })\n );\n });\n\n it('should set cookie and return token in response when config is \"both\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.signJwtToken as any).mockReturnValue(\"jwt-token-123\");\n\n (getInitConfigs as any).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"both\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"jwt-token-123\",\n expect.any(Object)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n accessToken: \"jwt-token-123\",\n });\n });\n\n it('should only set cookie when config is \"cookie-only\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.signJwtToken as any).mockReturnValue(\"jwt-token-123\");\n\n (getInitConfigs as any).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"cookie-only\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"jwt-token-123\",\n expect.any(Object)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.send).toHaveBeenCalled();\n expect(res.json).not.toHaveBeenCalled();\n });\n\n it('should only return token in response when config is \"response-only\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.signJwtToken as any).mockReturnValue(\"jwt-token-123\");\n\n (getInitConfigs as any).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"response-only\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).not.toHaveBeenCalled();\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n accessToken: \"jwt-token-123\",\n });\n });\n\n it(\"should call next middleware when afterLogin is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterLogin: true,\n });\n\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.signJwtToken as any).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await controllerWithMiddleware.login(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({ accessToken: \"jwt-token-123\" });\n expect(req.responseStatus).toBe(200);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"signup\", () => {\n it(\"should create a new user and return 201\", async () => {\n // Setup\n req.body = {\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"Password123\",\n };\n\n const createdUser = {\n id: \"new-user-id\",\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"hashedPassword\",\n active: true,\n };\n\n userService.createOne.mockResolvedValueOnce({ ...createdUser });\n\n // Execute\n await authController.signup(req, res, next);\n\n // Verify\n expect(userService.createOne).toHaveBeenCalledWith(req.body);\n expect(res.status).toHaveBeenCalledWith(201);\n\n // Check that excluded fields are removed\n const responseUser = res.json.mock.calls[0][0].data;\n Object.keys(defaultExcludedUserFields).forEach((field) => {\n expect(responseUser[field]).toBeUndefined();\n });\n });\n\n it(\"should call next middleware when afterSignup is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterSignup: true,\n });\n\n req.body = {\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"Password123\",\n };\n\n const createdUser = {\n id: \"new-user-id\",\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"hashedPassword\",\n };\n\n userService.createOne.mockResolvedValueOnce({ ...createdUser });\n\n // Execute\n await controllerWithMiddleware.signup(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({ data: createdUser });\n expect(req.responseStatus).toBe(201);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"updatePassword\", () => {\n it(\"should return 400 if currentPassword or newPassword is missing\", async () => {\n // Setup - missing newPassword\n req.body = { currentPassword: \"CurrentPassword123\" };\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\n \"currentPassword and newPassword are required\"\n ),\n })\n );\n });\n\n it(\"should return 404 if user is not found or inactive\", async () => {\n // Setup\n req.user = null;\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 404,\n message: expect.stringContaining(\"User not found\"),\n })\n );\n });\n\n it(\"should return 423 if user is not verified\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: false,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 423,\n message: expect.stringContaining(\"verify your account\"),\n })\n );\n });\n\n it(\"should return 400 if current password is incorrect\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"WrongPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(false);\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"Current password is incorrect\"),\n })\n );\n });\n\n it(\"should return 400 if new password is not strong enough\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"weakpassword\",\n };\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as any).mockReturnValue(false);\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"Password must contain\"),\n })\n );\n });\n\n it(\"should update password and return 200 on success\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as any).mockReturnValue(true);\n (authService.hashPassword as any).mockResolvedValueOnce(\n \"newHashedPassword\"\n );\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(mockPrisma.user.update).toHaveBeenCalledWith({\n where: { id: \"user-id-123\" },\n data: {\n password: \"newHashedPassword\",\n passwordChangedAt: expect.any(Date),\n },\n });\n\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n });\n\n it(\"should call next middleware when afterUpdatePassword is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterUpdatePassword: true,\n });\n\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as any).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as any).mockReturnValue(true);\n (authService.hashPassword as any).mockResolvedValueOnce(\n \"newHashedPassword123\"\n );\n\n // Execute\n await controllerWithMiddleware.updatePassword(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n expect(req.responseStatus).toBe(200);\n expect(req.additionalData).toEqual({\n user: req.user,\n });\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n});\n"]}
@@ -1,288 +1,177 @@
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
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
5
14
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.authControllerFactory = exports.excludedUserFields = void 0;
15
+ exports.authControllerFactory = exports.defaultExcludedUserFields = void 0;
7
16
  const catch_async_1 = __importDefault(require("../error-handler/utils/catch-async"));
8
17
  const app_error_1 = __importDefault(require("../error-handler/utils/app-error"));
9
18
  const auth_service_1 = __importDefault(require("./auth.service"));
10
19
  const base_service_1 = require("../base/base.service");
11
- const app_1 = require("../../app");
12
- exports.excludedUserFields = {
20
+ const prisma_helpers_1 = require("../../utils/helpers/prisma.helpers");
21
+ const models_helpers_1 = require("../../utils/helpers/models.helpers");
22
+ const deepmerge_helper_1 = __importDefault(require("../../utils/helpers/deepmerge.helper"));
23
+ const arkos_env_1 = __importDefault(require("../../utils/arkos-env"));
24
+ const server_1 = require("../../server");
25
+ const auth_helpers_1 = require("./utils/helpers/auth.helpers");
26
+ exports.defaultExcludedUserFields = {
13
27
  password: false,
14
28
  passwordChangedAt: false,
15
- passwordResetOtp: false,
16
- passwordResetOtpExpiresAt: false,
17
- verificationOtp: false,
18
- verificationOptExpiresAt: false,
29
+ passwordResetToken: false,
30
+ passwordResetTokenExpiresAt: false,
31
+ verificationToken: false,
32
+ verificationTokenExpiresAt: false,
19
33
  isVerified: false,
20
34
  deletedSelfAccount: false,
21
35
  active: false,
22
36
  };
23
- const authControllerFactory = (middlewares = {}) => {
37
+ const authControllerFactory = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (middlewares = {}) {
24
38
  const baseServices = (0, base_service_1.getBaseServices)();
39
+ let prismaQueryOptions = {};
40
+ const userModules = yield (0, models_helpers_1.importPrismaModelModules)("user");
41
+ if (userModules)
42
+ prismaQueryOptions = (userModules === null || userModules === void 0 ? void 0 : userModules.prismaQueryOptions) || {};
43
+ const stringifiedQueryOptions = JSON.stringify((0, deepmerge_helper_1.default)((prismaQueryOptions === null || prismaQueryOptions === void 0 ? void 0 : prismaQueryOptions.queryOptions) || {}, (prismaQueryOptions === null || prismaQueryOptions === void 0 ? void 0 : prismaQueryOptions.findOne) || {}) || {});
25
44
  return {
26
- getMe: (0, catch_async_1.default)(async (req, res, next) => {
27
- const user = await baseServices["user"].findOne({
28
- where: { id: req.user.id },
45
+ getMe: (0, catch_async_1.default)((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
46
+ const user = yield baseServices["user"].findOne({ id: req.user.id }, stringifiedQueryOptions);
47
+ Object.keys(exports.defaultExcludedUserFields).forEach((key) => {
48
+ if (req.user)
49
+ delete req.user[key];
29
50
  });
30
- Object.keys(exports.excludedUserFields).forEach((key) => {
51
+ if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterGetMe) {
52
+ req.responseData = user;
53
+ req.responseStatus = 200;
54
+ return next();
55
+ }
56
+ res.status(200).json({ data: req.user });
57
+ })),
58
+ updateMe: (0, catch_async_1.default)((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
59
+ const user = yield baseServices["user"].updateOne({ id: req.user.id }, req.body, stringifiedQueryOptions);
60
+ Object.keys(exports.defaultExcludedUserFields).forEach((key) => {
31
61
  if (req.user)
32
62
  delete req.user[key];
33
63
  });
34
- if (middlewares?.afterGetMe) {
64
+ if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterGetMe) {
35
65
  req.responseData = user;
36
66
  req.responseStatus = 200;
37
67
  return next();
38
68
  }
39
- res.status(200).json(req.user);
40
- }),
41
- logout: (0, catch_async_1.default)(async (req, res, next) => {
69
+ res.status(200).json({ data: req.user });
70
+ })),
71
+ logout: (0, catch_async_1.default)((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
42
72
  res.cookie("arkos_access_token", "no-token", {
43
73
  expires: new Date(Date.now() + 10 * 1000),
44
74
  httpOnly: true,
45
75
  });
46
- if (middlewares?.afterLogout) {
76
+ if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterLogout) {
47
77
  req.responseData = null;
48
78
  req.responseStatus = 204;
49
79
  return next();
50
80
  }
51
81
  res.status(204).json();
52
- }),
53
- login: (0, catch_async_1.default)(async (req, res, next) => {
54
- const { email, password } = req.body;
55
- if (!email || !password) {
56
- return next(new app_error_1.default("Please provide an email and a password", 400));
82
+ })),
83
+ login: (0, catch_async_1.default)((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
84
+ var _a, _b, _c;
85
+ const initAuthConfigs = (_a = (0, server_1.getInitConfigs)()) === null || _a === void 0 ? void 0 : _a.authentication;
86
+ const usernameField = (0, auth_helpers_1.determineUsernameField)(req);
87
+ const usernameValue = req.body[usernameField];
88
+ const { password } = req.body;
89
+ if (!usernameValue || !password) {
90
+ return next(new app_error_1.default(`Please provide ${usernameField} and password`, 400));
57
91
  }
58
- const user = await app_1.prisma.user.findUnique({
59
- where: { email },
92
+ const prisma = (0, prisma_helpers_1.getPrismaInstance)();
93
+ const whereClause = {};
94
+ whereClause[usernameField] = usernameValue;
95
+ const user = yield prisma.user.findUnique({
96
+ where: whereClause,
60
97
  });
61
98
  if (!user ||
62
- !(await auth_service_1.default.isCorrectPassword(password, user.password))) {
63
- return next(new app_error_1.default("Incorrect email or password", 401));
99
+ !(yield auth_service_1.default.isCorrectPassword(password, user.password))) {
100
+ return next(new app_error_1.default(`Incorrect ${usernameField} or password`, 401));
64
101
  }
65
- if (!user.isVerified)
66
- return next(new app_error_1.default("You must verifiy your email in order to proceed!", 423));
67
102
  const token = auth_service_1.default.signJwtToken(user.id);
68
103
  const cookieOptions = {
69
104
  expires: new Date(Date.now() +
70
- Number(process.env.JWT_COOKIE_EXPIRES_IN) * 24 * 60 * 60 * 1000),
105
+ Number(process.env.JWT_COOKIE_EXPIRES_IN ||
106
+ arkos_env_1.default.JWT_COOKIE_EXPIRES_IN) *
107
+ 24 *
108
+ 60 *
109
+ 60 *
110
+ 1000),
71
111
  httpOnly: true,
72
112
  secure: req.secure || req.headers["x-forwarded-proto"] === "https",
73
- sameSite: process.env.JWT_SECURE != "false" ? "lax" : "none",
113
+ sameSite: process.env.JWT_SECURE !== "false" ? "lax" : "none",
74
114
  };
75
115
  if (process.env.NODE_ENV === "production" &&
76
- process.env.JWT_SECURE != "false")
116
+ process.env.JWT_SECURE !== "false")
77
117
  cookieOptions.secure = true;
78
- res.cookie("arkos_access_token", token, cookieOptions);
79
- if (middlewares?.afterLogin) {
80
- req.responseData = { token };
118
+ if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterLogin) {
119
+ req.responseData = { accessToken: token };
81
120
  req.responseStatus = 200;
82
121
  return next();
83
122
  }
84
- res.status(200).send();
85
- }),
86
- signup: (0, catch_async_1.default)(async (req, res, next) => {
123
+ if (((_b = initAuthConfigs === null || initAuthConfigs === void 0 ? void 0 : initAuthConfigs.login) === null || _b === void 0 ? void 0 : _b.sendAccessTokenThrough) === "response-only") {
124
+ res.status(200).json({ accessToken: token });
125
+ }
126
+ else if (((_c = initAuthConfigs === null || initAuthConfigs === void 0 ? void 0 : initAuthConfigs.login) === null || _c === void 0 ? void 0 : _c.sendAccessTokenThrough) === "cookie-only") {
127
+ res.cookie("arkos_access_token", token, cookieOptions);
128
+ res.status(200).send();
129
+ }
130
+ else {
131
+ res.cookie("arkos_access_token", token, cookieOptions);
132
+ res.status(200).json({ accessToken: token });
133
+ }
134
+ })),
135
+ signup: (0, catch_async_1.default)((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
87
136
  const userService = baseServices["user"];
88
- const user = await userService.createOne(req.body);
89
- if (middlewares?.afterSignup) {
137
+ const user = yield userService.createOne(req.body, stringifiedQueryOptions);
138
+ if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterSignup) {
90
139
  req.responseData = { data: user };
91
140
  req.responseStatus = 201;
92
141
  return next();
93
142
  }
94
- Object.keys(exports.excludedUserFields).forEach((key) => {
143
+ Object.keys(exports.defaultExcludedUserFields).forEach((key) => {
95
144
  delete user[key];
96
145
  });
97
146
  res.status(201).json({ data: user });
98
- }),
99
- verifyEmail: (0, catch_async_1.default)(async (req, res, next) => {
100
- const { otp, email } = req.body;
101
- if (!email || !otp) {
102
- return next(new app_error_1.default("Email and otp are required", 400, {
103
- error: "Missing parameters",
104
- }));
105
- }
106
- const user = await app_1.prisma.user.findUnique({
107
- where: { email },
108
- });
109
- if (!user) {
110
- return next(new app_error_1.default("No account found with this email.", 400, {
111
- error: "user_not_found",
112
- }));
113
- }
114
- if (user.isVerified)
115
- return next(new app_error_1.default("Your email is already verified.", 400, {
116
- error: "already_verified",
117
- }));
118
- if (user.verificationOtp !== otp)
119
- return next(new app_error_1.default("The OTP is incorrect.", 400, {
120
- error: "invalid_otp",
121
- }));
122
- if (user.verificationOptExpiresAt &&
123
- new Date() > user.verificationOptExpiresAt)
124
- return next(new app_error_1.default("The OTP has expired. Please request a new one.", 400, {
125
- error: "expired_otp",
126
- }));
127
- await app_1.prisma.user.update({
128
- where: { email },
129
- data: {
130
- isVerified: true,
131
- verificationOtp: null,
132
- verificationOptExpiresAt: null,
133
- },
134
- });
135
- if (middlewares?.afterVerifyEmail) {
136
- req.additionalData = {
137
- user,
138
- };
139
- req.responseData = {
140
- message: "Email verified successfully.",
141
- };
142
- req.responseStatus = 200;
143
- return next();
144
- }
145
- res.status(200).json({
146
- message: "Email verified successfully.",
147
- });
148
- }),
149
- forgotPassword: (0, catch_async_1.default)(async (req, res, next) => {
150
- if (!req.body.email)
151
- return next(new app_error_1.default("Email is required in order to trigger forgot password", 400));
152
- const user = await app_1.prisma.user.findUnique({
153
- where: {
154
- email: req.body.email,
155
- },
156
- });
157
- if (!user ||
158
- user?.active === false ||
159
- user?.deletedSelfAccount === true)
160
- return next(new app_error_1.default("User not found!", 404));
161
- if (!user.isVerified)
162
- return next(new app_error_1.default("You need to verify your account to proceed", 423, {
163
- error: "email_verification_required",
164
- }));
165
- if (user.passwordResetOtpExpiresAt) {
166
- const now = new Date();
167
- const lastOtpRequestedAt = new Date(new Date(user.passwordResetOtpExpiresAt).getTime() - 15 * 60 * 1000);
168
- const timeElapsed = (now.getTime() - lastOtpRequestedAt.getTime()) / 1000;
169
- const minInterval = 2 * 60;
170
- if (timeElapsed < minInterval)
171
- return next(new app_error_1.default(`Please wait ${Math.ceil(minInterval - timeElapsed)} seconds before requesting a new OTP.`, 429, {
172
- remainingTime: Math.ceil(minInterval - timeElapsed),
173
- }));
174
- }
175
- const resetOtp = Math.floor(100000 + Math.random() * 900000).toString();
176
- const resetOtpExpiresAt = new Date(Date.now() + 15 * 60 * 1000);
177
- await app_1.prisma.user.update({
178
- where: {
179
- id: user.id,
180
- },
181
- data: {
182
- passwordResetOtp: resetOtp,
183
- passwordResetOtpExpiresAt: resetOtpExpiresAt,
184
- },
185
- });
186
- if (middlewares?.afterForgotPassword) {
187
- req.additionalData = {
188
- user,
189
- resetOtp,
190
- };
191
- req.responseData = {
192
- status: "success",
193
- message: "OTP code sent successfully!",
194
- };
195
- req.responseStatus = 200;
196
- return next();
197
- }
198
- res.status(200).json({
199
- status: "success",
200
- message: "OTP code sent successfully!",
201
- });
202
- }),
203
- resetPassword: (0, catch_async_1.default)(async (req, res, next) => {
204
- const { email, otp, newPassword } = req.body;
205
- if (!otp || !email || !newPassword)
206
- return next(new app_error_1.default("email, otp and newPassword are required to reset password", 400));
207
- if (!auth_service_1.default.isPasswordStrong(newPassword))
208
- return next(new app_error_1.default("Password must contain at least one uppercase letter, one lowercase letter, and one number", 400));
209
- const user = await app_1.prisma.user.findUnique({
210
- where: { email },
211
- });
212
- if (!user?.passwordResetOtp)
213
- return next(new app_error_1.default("You must request an otp in order to reset password!", 400, {
214
- error: "no_requested_otp",
215
- }));
216
- if (await auth_service_1.default.isCorrectPassword(newPassword, user?.password))
217
- return next(new app_error_1.default("New password must not be the same as last one!", 400, {
218
- error: "new_password_equals_last_password",
219
- }));
220
- if (!user ||
221
- user?.active === false ||
222
- user?.deletedSelfAccount === true)
223
- return next(new app_error_1.default("User not found!", 404));
224
- if (!user.isVerified)
225
- return next(new app_error_1.default("You need to verify your account to proceed", 423, {
226
- error: "email_verification_required",
227
- }));
228
- if (!user.passwordResetOtp || !user.passwordResetOtpExpiresAt)
229
- return next(new app_error_1.default("Invalid or expired OTP.", 400));
230
- const now = new Date();
231
- if (now > new Date(user.passwordResetOtpExpiresAt))
232
- return next(new app_error_1.default("OTP expired. Please request a new one.", 400));
233
- if (user.passwordResetOtp != otp)
234
- return next(new app_error_1.default("Invalid OTP. Please try again.", 400));
235
- await app_1.prisma.user.update({
236
- where: { id: user.id },
237
- data: {
238
- password: await auth_service_1.default.hashPassword(newPassword),
239
- passwordResetOtp: null,
240
- passwordResetOtpExpiresAt: null,
241
- passwordChangedAt: new Date(),
242
- },
243
- });
244
- if (middlewares?.afterResetPassword) {
245
- req.additionalData = {
246
- user,
247
- };
248
- req.responseData = {
249
- status: "success",
250
- message: "Password reset successfully!",
251
- };
252
- req.responseStatus = 200;
253
- return next();
254
- }
255
- res.status(200).json({
256
- status: "success",
257
- message: "Password reset successfully!",
258
- });
259
- }),
260
- updatePassword: (0, catch_async_1.default)(async (req, res, next) => {
147
+ })),
148
+ updatePassword: (0, catch_async_1.default)((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
261
149
  const { currentPassword, newPassword } = req.body;
262
150
  if (!currentPassword || !newPassword)
263
151
  return next(new app_error_1.default("currentPassword and newPassword are required", 400));
264
152
  const user = req.user;
265
153
  if (!user ||
266
- user?.active === false ||
267
- user?.deletedSelfAccount === true)
154
+ (user === null || user === void 0 ? void 0 : user.active) === false ||
155
+ (user === null || user === void 0 ? void 0 : user.deletedSelfAccount) === true)
268
156
  return next(new app_error_1.default("User not found!", 404));
269
157
  if (!user.isVerified)
270
158
  return next(new app_error_1.default("You need to verify your account to proceed", 423, {
271
159
  error: "email_verification_required",
272
160
  }));
273
- const isPasswordCorrect = await auth_service_1.default.isCorrectPassword(String(currentPassword), String(user.password));
161
+ const isPasswordCorrect = yield auth_service_1.default.isCorrectPassword(String(currentPassword), String(user.password));
274
162
  if (!isPasswordCorrect)
275
163
  return next(new app_error_1.default("Current password is incorrect.", 400));
276
164
  if (!auth_service_1.default.isPasswordStrong(String(newPassword)))
277
165
  return next(new app_error_1.default("Password must contain at least one uppercase letter, one lowercase letter, and one number", 400));
278
- await app_1.prisma.user.update({
166
+ const prisma = (0, prisma_helpers_1.getPrismaInstance)();
167
+ yield prisma.user.update({
279
168
  where: { id: user.id },
280
169
  data: {
281
- password: await auth_service_1.default.hashPassword(newPassword),
170
+ password: yield auth_service_1.default.hashPassword(newPassword),
282
171
  passwordChangedAt: new Date(),
283
172
  },
284
173
  });
285
- if (middlewares?.afterUpdatePassword) {
174
+ if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterUpdatePassword) {
286
175
  req.additionalData = {
287
176
  user,
288
177
  };
@@ -297,8 +186,8 @@ const authControllerFactory = (middlewares = {}) => {
297
186
  status: "success",
298
187
  message: "Password updated successfully!",
299
188
  });
300
- }),
189
+ })),
301
190
  };
302
- };
191
+ });
303
192
  exports.authControllerFactory = authControllerFactory;
304
193
  //# sourceMappingURL=auth.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import catchAsync from \"../error-handler/utils/catch-async\";\r\nimport AppError from \"../error-handler/utils/app-error\";\r\nimport { CookieOptions, NextFunction, Request, Response } from \"express\";\r\nimport authService from \"./auth.service\";\r\nimport { getBaseServices } from \"../base/base.service\";\r\nimport { User } from \"../../types\";\r\nimport { prisma } from \"../../app\";\r\n\r\nexport const excludedUserFields = {\r\n password: false,\r\n passwordChangedAt: false,\r\n passwordResetOtp: false,\r\n passwordResetOtpExpiresAt: false,\r\n verificationOtp: false,\r\n verificationOptExpiresAt: false,\r\n isVerified: false,\r\n deletedSelfAccount: false,\r\n active: false,\r\n};\r\n\r\nexport const authControllerFactory = (middlewares: any = {}) => {\r\n const baseServices = getBaseServices();\r\n\r\n return {\r\n getMe: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n const user = await baseServices[\"user\"].findOne({\r\n where: { id: req.user!.id },\r\n });\r\n\r\n Object.keys(excludedUserFields).forEach((key) => {\r\n if (req.user) delete req.user[key as keyof User];\r\n });\r\n\r\n if (middlewares?.afterGetMe) {\r\n (req as any).responseData = user;\r\n (req as any).responseStatus = 200;\r\n return next();\r\n }\r\n\r\n res.status(200).json(req.user);\r\n }\r\n ),\r\n\r\n logout: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n res.cookie(\"arkos_access_token\", \"no-token\", {\r\n expires: new Date(Date.now() + 10 * 1000),\r\n httpOnly: true,\r\n });\r\n\r\n if (middlewares?.afterLogout) {\r\n (req as any).responseData = null;\r\n (req as any).responseStatus = 204;\r\n return next();\r\n }\r\n\r\n res.status(204).json();\r\n }\r\n ),\r\n\r\n login: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n const { email, password } = req.body;\r\n\r\n if (!email || !password) {\r\n return next(\r\n new AppError(\"Please provide an email and a password\", 400)\r\n );\r\n }\r\n\r\n const user = await (prisma as any).user.findUnique({\r\n where: { email },\r\n });\r\n\r\n if (\r\n !user ||\r\n !(await authService.isCorrectPassword(password, user.password))\r\n ) {\r\n return next(new AppError(\"Incorrect email or password\", 401));\r\n }\r\n\r\n if (!user.isVerified)\r\n return next(\r\n new AppError(\r\n \"You must verifiy your email in order to proceed!\",\r\n 423\r\n )\r\n );\r\n\r\n const token = authService.signJwtToken(user.id!);\r\n\r\n const cookieOptions: CookieOptions = {\r\n expires: new Date(\r\n Date.now() +\r\n Number(process.env.JWT_COOKIE_EXPIRES_IN) * 24 * 60 * 60 * 1000\r\n ),\r\n httpOnly: true,\r\n secure: req.secure || req.headers[\"x-forwarded-proto\"] === \"https\",\r\n sameSite: process.env.JWT_SECURE != \"false\" ? \"lax\" : \"none\",\r\n };\r\n\r\n if (\r\n process.env.NODE_ENV === \"production\" &&\r\n process.env.JWT_SECURE != \"false\"\r\n )\r\n cookieOptions.secure = true;\r\n\r\n res.cookie(\"arkos_access_token\", token, cookieOptions);\r\n\r\n if (middlewares?.afterLogin) {\r\n (req as any).responseData = { token };\r\n (req as any).responseStatus = 200;\r\n return next();\r\n }\r\n\r\n res.status(200).send();\r\n }\r\n ),\r\n\r\n signup: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n const userService = baseServices[\"user\"];\r\n\r\n const user = await userService.createOne(req.body);\r\n\r\n if (middlewares?.afterSignup) {\r\n (req as any).responseData = { data: user };\r\n (req as any).responseStatus = 201;\r\n return next();\r\n }\r\n\r\n Object.keys(excludedUserFields).forEach((key) => {\r\n delete user[key as keyof User];\r\n });\r\n\r\n res.status(201).json({ data: user });\r\n }\r\n ),\r\n\r\n verifyEmail: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n const { otp, email } = req.body;\r\n\r\n // Check if email and OTP are provided\r\n if (!email || !otp) {\r\n return next(\r\n new AppError(\"Email and otp are required\", 400, {\r\n error: \"Missing parameters\",\r\n })\r\n );\r\n }\r\n\r\n const user = await (prisma as any).user.findUnique({\r\n where: { email },\r\n });\r\n\r\n if (!user) {\r\n return next(\r\n new AppError(\"No account found with this email.\", 400, {\r\n error: \"user_not_found\",\r\n })\r\n );\r\n }\r\n\r\n if (user.isVerified)\r\n return next(\r\n new AppError(\"Your email is already verified.\", 400, {\r\n error: \"already_verified\",\r\n })\r\n );\r\n\r\n if (user.verificationOtp !== otp)\r\n return next(\r\n new AppError(\"The OTP is incorrect.\", 400, {\r\n error: \"invalid_otp\",\r\n })\r\n );\r\n\r\n if (\r\n user.verificationOptExpiresAt &&\r\n new Date() > user.verificationOptExpiresAt\r\n )\r\n return next(\r\n new AppError(\r\n \"The OTP has expired. Please request a new one.\",\r\n 400,\r\n {\r\n error: \"expired_otp\",\r\n }\r\n )\r\n );\r\n\r\n await (prisma as any).user.update({\r\n where: { email },\r\n data: {\r\n isVerified: true,\r\n verificationOtp: null,\r\n verificationOptExpiresAt: null,\r\n },\r\n });\r\n\r\n if (middlewares?.afterVerifyEmail) {\r\n (req as any).additionalData = {\r\n user,\r\n };\r\n (req as any).responseData = {\r\n message: \"Email verified successfully.\",\r\n };\r\n (req as any).responseStatus = 200;\r\n return next();\r\n }\r\n\r\n res.status(200).json({\r\n message: \"Email verified successfully.\",\r\n });\r\n }\r\n ),\r\n\r\n forgotPassword: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n if (!req.body.email)\r\n return next(\r\n new AppError(\r\n \"Email is required in order to trigger forgot password\",\r\n 400\r\n )\r\n );\r\n\r\n const user = await (prisma as any).user.findUnique({\r\n where: {\r\n email: req.body.email,\r\n },\r\n });\r\n\r\n if (\r\n !user ||\r\n user?.active === false ||\r\n user?.deletedSelfAccount === true\r\n )\r\n return next(new AppError(\"User not found!\", 404));\r\n\r\n if (!user.isVerified)\r\n return next(\r\n new AppError(\"You need to verify your account to proceed\", 423, {\r\n error: \"email_verification_required\",\r\n })\r\n );\r\n\r\n // Verifica se um OTP foi solicitado recentemente\r\n if (user.passwordResetOtpExpiresAt) {\r\n const now = new Date();\r\n const lastOtpRequestedAt = new Date(\r\n new Date(user.passwordResetOtpExpiresAt).getTime() - 15 * 60 * 1000\r\n );\r\n const timeElapsed =\r\n (now.getTime() - lastOtpRequestedAt.getTime()) / 1000;\r\n const minInterval = 2 * 60; // 2 minutos em segundos\r\n\r\n if (timeElapsed < minInterval)\r\n return next(\r\n new AppError(\r\n `Please wait ${Math.ceil(\r\n minInterval - timeElapsed\r\n )} seconds before requesting a new OTP.`,\r\n 429,\r\n {\r\n remainingTime: Math.ceil(minInterval - timeElapsed),\r\n }\r\n )\r\n );\r\n }\r\n\r\n const resetOtp = Math.floor(100000 + Math.random() * 900000).toString();\r\n const resetOtpExpiresAt = new Date(Date.now() + 15 * 60 * 1000);\r\n\r\n await (prisma as any).user.update({\r\n where: {\r\n id: user.id,\r\n },\r\n data: {\r\n passwordResetOtp: resetOtp,\r\n passwordResetOtpExpiresAt: resetOtpExpiresAt,\r\n },\r\n });\r\n\r\n if (middlewares?.afterForgotPassword) {\r\n (req as any).additionalData = {\r\n user,\r\n resetOtp,\r\n };\r\n (req as any).responseData = {\r\n status: \"success\",\r\n message: \"OTP code sent successfully!\",\r\n };\r\n (req as any).responseStatus = 200;\r\n return next();\r\n }\r\n\r\n res.status(200).json({\r\n status: \"success\",\r\n message: \"OTP code sent successfully!\",\r\n });\r\n }\r\n ),\r\n\r\n resetPassword: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n const { email, otp, newPassword } = req.body;\r\n\r\n if (!otp || !email || !newPassword)\r\n return next(\r\n new AppError(\r\n \"email, otp and newPassword are required to reset password\",\r\n 400\r\n )\r\n );\r\n\r\n if (!authService.isPasswordStrong(newPassword))\r\n return next(\r\n new AppError(\r\n \"Password must contain at least one uppercase letter, one lowercase letter, and one number\",\r\n 400\r\n )\r\n );\r\n\r\n const user = await (prisma as any).user.findUnique({\r\n where: { email },\r\n });\r\n\r\n if (!user?.passwordResetOtp)\r\n return next(\r\n new AppError(\r\n \"You must request an otp in order to reset password!\",\r\n 400,\r\n {\r\n error: \"no_requested_otp\",\r\n }\r\n )\r\n );\r\n\r\n if (await authService.isCorrectPassword(newPassword, user?.password!))\r\n return next(\r\n new AppError(\r\n \"New password must not be the same as last one!\",\r\n 400,\r\n {\r\n error: \"new_password_equals_last_password\",\r\n }\r\n )\r\n );\r\n\r\n if (\r\n !user ||\r\n user?.active === false ||\r\n user?.deletedSelfAccount === true\r\n )\r\n return next(new AppError(\"User not found!\", 404));\r\n\r\n if (!user.isVerified)\r\n return next(\r\n new AppError(\"You need to verify your account to proceed\", 423, {\r\n error: \"email_verification_required\",\r\n })\r\n );\r\n\r\n if (!user.passwordResetOtp || !user.passwordResetOtpExpiresAt)\r\n return next(new AppError(\"Invalid or expired OTP.\", 400));\r\n\r\n const now = new Date();\r\n if (now > new Date(user.passwordResetOtpExpiresAt))\r\n return next(\r\n new AppError(\"OTP expired. Please request a new one.\", 400)\r\n );\r\n\r\n if (user.passwordResetOtp != otp)\r\n return next(new AppError(\"Invalid OTP. Please try again.\", 400));\r\n\r\n await (prisma as any).user.update({\r\n where: { id: user.id },\r\n data: {\r\n password: await authService.hashPassword(newPassword),\r\n passwordResetOtp: null,\r\n passwordResetOtpExpiresAt: null,\r\n passwordChangedAt: new Date(),\r\n },\r\n });\r\n\r\n if (middlewares?.afterResetPassword) {\r\n (req as any).additionalData = {\r\n user,\r\n };\r\n (req as any).responseData = {\r\n status: \"success\",\r\n message: \"Password reset successfully!\",\r\n };\r\n (req as any).responseStatus = 200;\r\n return next();\r\n }\r\n\r\n res.status(200).json({\r\n status: \"success\",\r\n message: \"Password reset successfully!\",\r\n });\r\n }\r\n ),\r\n\r\n updatePassword: catchAsync(\r\n async (req: Request, res: Response, next: NextFunction) => {\r\n const { currentPassword, newPassword } = req.body;\r\n\r\n if (!currentPassword || !newPassword)\r\n return next(\r\n new AppError(\"currentPassword and newPassword are required\", 400)\r\n );\r\n\r\n const user = req.user;\r\n\r\n if (\r\n !user ||\r\n user?.active === false ||\r\n user?.deletedSelfAccount === true\r\n )\r\n return next(new AppError(\"User not found!\", 404));\r\n\r\n if (!user.isVerified)\r\n return next(\r\n new AppError(\"You need to verify your account to proceed\", 423, {\r\n error: \"email_verification_required\",\r\n })\r\n );\r\n\r\n // Check if the current password is correct\r\n const isPasswordCorrect = await authService.isCorrectPassword(\r\n String(currentPassword),\r\n String(user.password)\r\n );\r\n\r\n if (!isPasswordCorrect)\r\n return next(new AppError(\"Current password is incorrect.\", 400));\r\n\r\n // Check password strength (optional but recommended)\r\n if (!authService.isPasswordStrong(String(newPassword)))\r\n return next(\r\n new AppError(\r\n \"Password must contain at least one uppercase letter, one lowercase letter, and one number\",\r\n 400\r\n )\r\n );\r\n\r\n // Update the password\r\n await (prisma as any).user.update({\r\n where: { id: user.id },\r\n data: {\r\n password: await authService.hashPassword(newPassword),\r\n passwordChangedAt: new Date(),\r\n },\r\n });\r\n\r\n if (middlewares?.afterUpdatePassword) {\r\n (req as any).additionalData = {\r\n user,\r\n };\r\n (req as any).responseData = {\r\n status: \"success\",\r\n message: \"Password updated successfully!\",\r\n };\r\n (req as any).responseStatus = 200;\r\n return next();\r\n }\r\n\r\n res.status(200).json({\r\n status: \"success\",\r\n message: \"Password updated successfully!\",\r\n });\r\n }\r\n ),\r\n };\r\n};\r\n"]}
1
+ {"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { CookieOptions } from \"express\";\nimport { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport authService from \"./auth.service\";\nimport { getBaseServices } from \"../base/base.service\";\nimport { User } from \"../../types\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getInitConfigs } from \"../../server\";\nimport { determineUsernameField } from \"./utils/helpers/auth.helpers\";\nimport { InitConfigsAuthenticationOptions } from \"../../types/app\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: false,\n passwordChangedAt: false,\n passwordResetToken: false,\n passwordResetTokenExpiresAt: false,\n verificationToken: false,\n verificationTokenExpiresAt: false,\n isVerified: false,\n deletedSelfAccount: false,\n active: false,\n};\n\n/**\n * Factory function to create authentication controller with configurable middlewares\n *\n * @param middlewares - Optional middleware functions to execute after controller actions\n * @returns An object containing all authentication controller methods\n */\nexport const authControllerFactory = async (middlewares: any = {}) => {\n const baseServices = getBaseServices();\n let prismaQueryOptions: Record<string, any> = {};\n\n const userModules = await importPrismaModelModules(\"user\");\n if (userModules) prismaQueryOptions = userModules?.prismaQueryOptions || {};\n\n const stringifiedQueryOptions = JSON.stringify(\n deepmerge(\n prismaQueryOptions?.queryOptions || {},\n prismaQueryOptions?.findOne || {}\n ) || {}\n );\n\n return {\n /**\n * Retrieves the current authenticated user's information\n */\n getMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await baseServices[\"user\"].findOne(\n { id: req.user!.id },\n stringifiedQueryOptions\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (req.user) delete req.user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = user;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: req.user });\n }\n ),\n\n /**\n * Updates the current authenticated user's information\n */\n updateMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await baseServices[\"user\"].updateOne(\n { id: req.user!.id },\n req.body,\n stringifiedQueryOptions\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (req.user) delete req.user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = user;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: req.user });\n }\n ),\n\n /**\n * Logs out the current user by invalidating their access token cookie\n */\n logout: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n res.cookie(\"arkos_access_token\", \"no-token\", {\n expires: new Date(Date.now() + 10 * 1000),\n httpOnly: true,\n });\n\n if (middlewares?.afterLogout) {\n req.responseData = null;\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).json();\n }\n ),\n\n /**\n * Authenticates a user using configurable username field and password\n * Username field can be specified in query parameter or config\n */\n login: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const initAuthConfigs = getInitConfigs()\n ?.authentication as InitConfigsAuthenticationOptions;\n const usernameField = determineUsernameField(req);\n\n const usernameValue = req.body[usernameField];\n const { password } = req.body;\n\n if (!usernameValue || !password) {\n return next(\n new AppError(`Please provide ${usernameField} and password`, 400)\n );\n }\n\n const prisma = getPrismaInstance();\n\n // Create dynamic where clause based on username field\n const whereClause: any = {};\n whereClause[usernameField] = usernameValue;\n\n const user = await (prisma as any).user.findUnique({\n where: whereClause,\n });\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(\n new AppError(`Incorrect ${usernameField} or password`, 401)\n );\n }\n\n const token = authService.signJwtToken(user.id!);\n\n const cookieOptions: CookieOptions = {\n expires: new Date(\n Date.now() +\n Number(\n process.env.JWT_COOKIE_EXPIRES_IN ||\n arkosEnv.JWT_COOKIE_EXPIRES_IN\n ) *\n 24 *\n 60 *\n 60 *\n 1000\n ),\n httpOnly: true,\n secure: req.secure || req.headers[\"x-forwarded-proto\"] === \"https\",\n sameSite: process.env.JWT_SECURE !== \"false\" ? \"lax\" : \"none\",\n };\n\n if (\n process.env.NODE_ENV === \"production\" &&\n process.env.JWT_SECURE !== \"false\"\n )\n cookieOptions.secure = true;\n\n if (middlewares?.afterLogin) {\n req.responseData = { accessToken: token };\n req.responseStatus = 200;\n return next();\n }\n\n if (\n initAuthConfigs?.login?.sendAccessTokenThrough === \"response-only\"\n ) {\n res.status(200).json({ accessToken: token });\n } else if (\n initAuthConfigs?.login?.sendAccessTokenThrough === \"cookie-only\"\n ) {\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n res.status(200).send();\n } else {\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n res.status(200).json({ accessToken: token });\n }\n }\n ),\n\n /**\n * Creates a new user account\n */\n signup: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const userService = baseServices[\"user\"];\n\n const user = await userService.createOne(\n req.body,\n stringifiedQueryOptions\n );\n\n if (middlewares?.afterSignup) {\n req.responseData = { data: user };\n req.responseStatus = 201;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete user[key as keyof User];\n });\n\n res.status(201).json({ data: user });\n }\n ),\n\n /**\n * Updates the password of the authenticated user\n */\n updatePassword: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const { currentPassword, newPassword } = req.body;\n\n if (!currentPassword || !newPassword)\n return next(\n new AppError(\"currentPassword and newPassword are required\", 400)\n );\n\n const user = req.user;\n\n if (\n !user ||\n user?.active === false ||\n user?.deletedSelfAccount === true\n )\n return next(new AppError(\"User not found!\", 404));\n\n if (!user.isVerified)\n return next(\n new AppError(\"You need to verify your account to proceed\", 423, {\n error: \"email_verification_required\",\n })\n );\n\n // Check if the current password is correct\n const isPasswordCorrect = await authService.isCorrectPassword(\n String(currentPassword),\n String(user.password)\n );\n\n if (!isPasswordCorrect)\n return next(new AppError(\"Current password is incorrect.\", 400));\n\n // Check password strength (optional but recommended)\n if (!authService.isPasswordStrong(String(newPassword)))\n return next(\n new AppError(\n \"Password must contain at least one uppercase letter, one lowercase letter, and one number\",\n 400\n )\n );\n\n const prisma = getPrismaInstance();\n\n // Update the password\n await (prisma as any).user.update({\n where: { id: user.id },\n data: {\n password: await authService.hashPassword(newPassword),\n passwordChangedAt: new Date(),\n },\n });\n\n if (middlewares?.afterUpdatePassword) {\n (req as any).additionalData = {\n user,\n };\n req.responseData = {\n status: \"success\",\n message: \"Password updated successfully!\",\n };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n }\n ),\n };\n};\n"]}