arkos 1.2.14-test → 1.2.14-test.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 (413) hide show
  1. package/README.md +22 -14
  2. package/cli.js +2 -11
  3. package/dist/cjs/app.js +1 -1
  4. package/dist/cjs/app.js.map +1 -1
  5. package/dist/cjs/exports/auth/index.js +1 -6
  6. package/dist/cjs/exports/controllers/index.js +1 -11
  7. package/dist/cjs/exports/error-handler/index.js +1 -11
  8. package/dist/cjs/exports/index.js +1 -12
  9. package/dist/cjs/exports/middlewares/index.js +1 -7
  10. package/dist/cjs/exports/prisma/index.js +1 -6
  11. package/dist/cjs/exports/services/index.js +1 -49
  12. package/dist/cjs/exports/utils/index.js +1 -44
  13. package/dist/cjs/exports/validation/index.js +1 -11
  14. package/dist/cjs/modules/auth/auth.controller.js +1 -194
  15. package/dist/cjs/modules/auth/auth.router.js +1 -124
  16. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  17. package/dist/cjs/modules/auth/auth.service.js +1 -192
  18. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  19. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +1 -83
  20. package/dist/cjs/modules/base/base.controller.js +1 -159
  21. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  22. package/dist/cjs/modules/base/base.middlewares.js +1 -92
  23. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  24. package/dist/cjs/modules/base/base.router.js +1 -24
  25. package/dist/cjs/modules/base/base.router.js.map +1 -1
  26. package/dist/cjs/modules/base/base.service.js +1 -128
  27. package/dist/cjs/modules/base/base.service.js.map +1 -1
  28. package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js +1 -82
  29. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +1 -50
  30. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +1 -167
  31. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  32. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +1 -171
  33. package/dist/cjs/modules/email/email.service.js +1 -104
  34. package/dist/cjs/modules/error-handler/error-handler.controller.js +4 -144
  35. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  36. package/dist/cjs/modules/error-handler/utils/app-error.js +1 -17
  37. package/dist/cjs/modules/error-handler/utils/catch-async.js +1 -12
  38. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  39. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +3 -195
  40. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  41. package/dist/cjs/modules/file-upload/file-upload.controller.js +1 -271
  42. package/dist/cjs/modules/file-upload/file-upload.router.js +1 -56
  43. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  44. package/dist/cjs/modules/file-upload/file-upload.service.js +1 -322
  45. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +1 -90
  46. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  47. package/dist/cjs/modules/swagger/swagger.router.js +1 -141
  48. package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
  49. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -0
  50. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
  51. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -0
  52. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
  53. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
  54. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
  55. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +1 -0
  56. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
  57. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +1 -0
  58. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
  59. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +1 -0
  60. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
  61. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +1 -0
  62. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +1 -0
  63. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +1 -0
  64. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
  65. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +1 -0
  66. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
  67. package/dist/cjs/package.json +3 -0
  68. package/dist/cjs/server.js +4 -2
  69. package/dist/cjs/server.js.map +1 -1
  70. package/dist/cjs/types/arkos-config.js +1 -3
  71. package/dist/cjs/types/arkos-config.js.map +1 -1
  72. package/dist/cjs/types/auth.js +1 -3
  73. package/dist/cjs/types/index.js +1 -11
  74. package/dist/cjs/types/router-config.js +1 -3
  75. package/dist/cjs/utils/arkos-env.js +1 -9
  76. package/dist/cjs/utils/cli/build.js +6 -229
  77. package/dist/cjs/utils/cli/build.js.map +1 -1
  78. package/dist/cjs/utils/cli/dev.js +5 -271
  79. package/dist/cjs/utils/cli/dev.js.map +1 -1
  80. package/dist/cjs/utils/cli/generate.js +12 -189
  81. package/dist/cjs/utils/cli/generate.js.map +1 -1
  82. package/dist/cjs/utils/cli/index.js +1 -81
  83. package/dist/cjs/utils/cli/start.js +5 -93
  84. package/dist/cjs/utils/cli/start.js.map +1 -1
  85. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -26
  86. package/dist/cjs/utils/cli/utils/cli.helpers.js.map +1 -1
  87. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +5 -20
  88. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +6 -15
  89. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +71 -133
  90. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
  91. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +24 -46
  92. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
  93. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js +12 -32
  94. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
  95. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js +7 -27
  96. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
  97. package/dist/cjs/utils/cli/utils/template-generators.js +2 -28
  98. package/dist/cjs/utils/dotenv.helpers.js +1 -43
  99. package/dist/cjs/utils/features/api.features.js +1 -161
  100. package/dist/cjs/utils/features/api.features.js.map +1 -1
  101. package/dist/cjs/utils/features/change-case.features.js +1 -67
  102. package/dist/cjs/utils/helpers/api.features.helpers.js +1 -106
  103. package/dist/cjs/utils/helpers/change-case.helpers.js +1 -177
  104. package/dist/cjs/utils/helpers/deepmerge.helper.js +1 -115
  105. package/dist/cjs/utils/helpers/fs.helpers.js +1 -54
  106. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  107. package/dist/cjs/utils/helpers/global.helpers.js +1 -40
  108. package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
  109. package/dist/cjs/utils/helpers/models.helpers.js +11 -325
  110. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  111. package/dist/cjs/utils/helpers/prisma.helpers.js +1 -49
  112. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  113. package/dist/cjs/utils/helpers/query-parser.helpers.js +1 -45
  114. package/dist/cjs/utils/helpers/routers.helpers.js +1 -0
  115. package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -0
  116. package/dist/cjs/utils/helpers/text.helpers.js +1 -28
  117. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js +1 -0
  118. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
  119. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +1 -0
  120. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -0
  121. package/dist/cjs/utils/prisma/prisma-schema-parser.js +3 -0
  122. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -0
  123. package/dist/cjs/utils/prisma/types.js +1 -0
  124. package/dist/cjs/utils/prisma/types.js.map +1 -0
  125. package/dist/cjs/utils/sheu.js +1 -0
  126. package/dist/cjs/utils/sheu.js.map +1 -0
  127. package/dist/cjs/utils/validate-dto.js +1 -17
  128. package/dist/cjs/utils/validate-schema.js +1 -15
  129. package/dist/esm/app.js +1 -0
  130. package/dist/esm/app.js.map +1 -0
  131. package/dist/esm/exports/auth/index.js +1 -0
  132. package/dist/esm/exports/controllers/index.js +1 -0
  133. package/dist/esm/exports/error-handler/index.js +1 -0
  134. package/dist/esm/exports/index.js +1 -0
  135. package/dist/esm/exports/middlewares/index.js +1 -0
  136. package/dist/esm/exports/prisma/index.js +1 -0
  137. package/dist/esm/exports/services/index.js +1 -0
  138. package/dist/esm/exports/utils/index.js +1 -0
  139. package/dist/esm/exports/validation/index.js +1 -0
  140. package/dist/esm/modules/auth/auth.controller.js +1 -0
  141. package/dist/esm/modules/auth/auth.router.js +1 -0
  142. package/dist/esm/modules/auth/auth.router.js.map +1 -0
  143. package/dist/esm/modules/auth/auth.service.js +1 -0
  144. package/dist/esm/modules/auth/auth.service.js.map +1 -0
  145. package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +1 -0
  146. package/dist/esm/modules/base/base.controller.js +1 -0
  147. package/dist/esm/modules/base/base.controller.js.map +1 -0
  148. package/dist/esm/modules/base/base.middlewares.js +1 -0
  149. package/dist/esm/modules/base/base.middlewares.js.map +1 -0
  150. package/dist/esm/modules/base/base.router.js +1 -0
  151. package/dist/esm/modules/base/base.router.js.map +1 -0
  152. package/dist/esm/modules/base/base.service.js +1 -0
  153. package/dist/{es2020 → esm}/modules/base/base.service.js.map +1 -1
  154. package/dist/esm/modules/base/utils/helpers/base.controller.helpers.js +1 -0
  155. package/dist/esm/modules/base/utils/helpers/base.middlewares.helpers.js +1 -0
  156. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +1 -0
  157. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -0
  158. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +1 -0
  159. package/dist/esm/modules/email/email.service.js +1 -0
  160. package/dist/esm/modules/error-handler/error-handler.controller.js +4 -0
  161. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -0
  162. package/dist/esm/modules/error-handler/utils/app-error.js +1 -0
  163. package/dist/esm/modules/error-handler/utils/catch-async.js +1 -0
  164. package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -0
  165. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +3 -0
  166. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -0
  167. package/dist/esm/modules/file-upload/file-upload.controller.js +1 -0
  168. package/dist/esm/modules/file-upload/file-upload.router.js +1 -0
  169. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -0
  170. package/dist/esm/modules/file-upload/file-upload.service.js +1 -0
  171. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +1 -0
  172. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -0
  173. package/dist/esm/modules/swagger/swagger.router.js +1 -0
  174. package/dist/esm/modules/swagger/swagger.router.js.map +1 -0
  175. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -0
  176. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
  177. package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -0
  178. package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
  179. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
  180. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
  181. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +1 -0
  182. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
  183. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +1 -0
  184. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
  185. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +1 -0
  186. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
  187. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +1 -0
  188. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +1 -0
  189. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +1 -0
  190. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
  191. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +1 -0
  192. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
  193. package/dist/esm/package.json +3 -0
  194. package/dist/esm/server.js +5 -0
  195. package/dist/esm/server.js.map +1 -0
  196. package/dist/esm/types/arkos-config.js +1 -0
  197. package/dist/esm/types/arkos-config.js.map +1 -0
  198. package/dist/esm/types/auth.js +1 -0
  199. package/dist/esm/types/index.js +1 -0
  200. package/dist/esm/types/router-config.js +1 -0
  201. package/dist/esm/utils/arkos-env.js +1 -0
  202. package/dist/esm/utils/cli/build.js +6 -0
  203. package/dist/esm/utils/cli/build.js.map +1 -0
  204. package/dist/esm/utils/cli/dev.js +5 -0
  205. package/dist/esm/utils/cli/dev.js.map +1 -0
  206. package/dist/esm/utils/cli/generate.js +12 -0
  207. package/dist/{es2020 → esm}/utils/cli/generate.js.map +1 -1
  208. package/dist/esm/utils/cli/index.js +1 -0
  209. package/dist/esm/utils/cli/start.js +5 -0
  210. package/dist/esm/utils/cli/start.js.map +1 -0
  211. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -0
  212. package/dist/esm/utils/cli/utils/cli.helpers.js.map +1 -0
  213. package/dist/esm/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +21 -0
  214. package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +12 -0
  215. package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js +206 -0
  216. package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -0
  217. package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +36 -0
  218. package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -0
  219. package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js +18 -0
  220. package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -0
  221. package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js +15 -0
  222. package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
  223. package/dist/esm/utils/cli/utils/template-generators.js +2 -0
  224. package/dist/esm/utils/dotenv.helpers.js +1 -0
  225. package/dist/esm/utils/features/api.features.js +1 -0
  226. package/dist/esm/utils/features/api.features.js.map +1 -0
  227. package/dist/esm/utils/features/change-case.features.js +1 -0
  228. package/dist/esm/utils/helpers/api.features.helpers.js +1 -0
  229. package/dist/esm/utils/helpers/change-case.helpers.js +1 -0
  230. package/dist/esm/utils/helpers/deepmerge.helper.js +1 -0
  231. package/dist/esm/utils/helpers/fs.helpers.js +1 -0
  232. package/dist/esm/utils/helpers/fs.helpers.js.map +1 -0
  233. package/dist/esm/utils/helpers/global.helpers.js +1 -0
  234. package/dist/esm/utils/helpers/global.helpers.js.map +1 -0
  235. package/dist/esm/utils/helpers/models.helpers.js +11 -0
  236. package/dist/esm/utils/helpers/models.helpers.js.map +1 -0
  237. package/dist/esm/utils/helpers/prisma.helpers.js +1 -0
  238. package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -0
  239. package/dist/esm/utils/helpers/query-parser.helpers.js +1 -0
  240. package/dist/esm/utils/helpers/routers.helpers.js +1 -0
  241. package/dist/esm/utils/helpers/routers.helpers.js.map +1 -0
  242. package/dist/esm/utils/helpers/text.helpers.js +1 -0
  243. package/dist/esm/utils/prisma/enhaced-prisma-json-schema-generator.js +1 -0
  244. package/dist/esm/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
  245. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +1 -0
  246. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -0
  247. package/dist/esm/utils/prisma/prisma-schema-parser.js +3 -0
  248. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -0
  249. package/dist/esm/utils/prisma/types.js +1 -0
  250. package/dist/esm/utils/prisma/types.js.map +1 -0
  251. package/dist/esm/utils/sheu.js +1 -0
  252. package/dist/esm/utils/sheu.js.map +1 -0
  253. package/dist/esm/utils/validate-dto.js +1 -0
  254. package/dist/esm/utils/validate-schema.js +1 -0
  255. package/dist/types/modules/base/base.middlewares.d.ts +4 -4
  256. package/dist/types/modules/base/base.service.d.ts +1 -1
  257. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +4 -1
  258. package/dist/types/modules/error-handler/utils/catch-async.d.ts +1 -0
  259. package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +4 -0
  260. package/dist/types/modules/file-upload/file-upload.router.d.ts +1 -1
  261. package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +2 -1
  262. package/dist/types/modules/swagger/swagger.router.d.ts +1 -1
  263. package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +3 -0
  264. package/dist/types/modules/swagger/utils/helpers/get-system-json-schema-paths.d.ts +2 -0
  265. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +1 -0
  266. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +2 -0
  267. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.d.ts +1 -0
  268. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.d.ts +3 -0
  269. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.d.ts +3 -0
  270. package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +34 -0
  271. package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +7 -0
  272. package/dist/types/server.d.ts +3 -0
  273. package/dist/types/types/arkos-config.d.ts +10 -5
  274. package/dist/types/utils/cli/utils/cli.helpers.d.ts +1 -1
  275. package/dist/types/utils/features/api.features.d.ts +1 -0
  276. package/dist/types/utils/helpers/global.helpers.d.ts +6 -1
  277. package/dist/types/utils/helpers/models.helpers.d.ts +31 -5
  278. package/dist/types/utils/helpers/routers.helpers.d.ts +2 -0
  279. package/dist/types/utils/prisma/enhaced-prisma-json-schema-generator.d.ts +34 -0
  280. package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +10 -0
  281. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +18 -0
  282. package/dist/types/utils/prisma/types.d.ts +48 -0
  283. package/dist/types/utils/sheu.d.ts +70 -0
  284. package/package.json +34 -35
  285. package/dist/es2020/app.js +0 -1
  286. package/dist/es2020/app.js.map +0 -1
  287. package/dist/es2020/exports/auth/index.js +0 -2
  288. package/dist/es2020/exports/controllers/index.js +0 -4
  289. package/dist/es2020/exports/error-handler/index.js +0 -4
  290. package/dist/es2020/exports/index.js +0 -8
  291. package/dist/es2020/exports/middlewares/index.js +0 -2
  292. package/dist/es2020/exports/prisma/index.js +0 -3
  293. package/dist/es2020/exports/services/index.js +0 -9
  294. package/dist/es2020/exports/utils/index.js +0 -4
  295. package/dist/es2020/exports/validation/index.js +0 -4
  296. package/dist/es2020/modules/auth/auth.controller.js +0 -187
  297. package/dist/es2020/modules/auth/auth.router.js +0 -118
  298. package/dist/es2020/modules/auth/auth.router.js.map +0 -1
  299. package/dist/es2020/modules/auth/auth.service.js +0 -185
  300. package/dist/es2020/modules/auth/auth.service.js.map +0 -1
  301. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +0 -73
  302. package/dist/es2020/modules/base/base.controller.js +0 -151
  303. package/dist/es2020/modules/base/base.controller.js.map +0 -1
  304. package/dist/es2020/modules/base/base.middlewares.js +0 -81
  305. package/dist/es2020/modules/base/base.middlewares.js.map +0 -1
  306. package/dist/es2020/modules/base/base.router.js +0 -17
  307. package/dist/es2020/modules/base/base.router.js.map +0 -1
  308. package/dist/es2020/modules/base/base.service.js +0 -120
  309. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js +0 -77
  310. package/dist/es2020/modules/base/utils/helpers/base.middlewares.helpers.js +0 -44
  311. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +0 -161
  312. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
  313. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +0 -165
  314. package/dist/es2020/modules/email/email.service.js +0 -97
  315. package/dist/es2020/modules/error-handler/error-handler.controller.js +0 -105
  316. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +0 -1
  317. package/dist/es2020/modules/error-handler/utils/app-error.js +0 -15
  318. package/dist/es2020/modules/error-handler/utils/catch-async.js +0 -10
  319. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +0 -1
  320. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +0 -155
  321. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
  322. package/dist/es2020/modules/file-upload/file-upload.controller.js +0 -266
  323. package/dist/es2020/modules/file-upload/file-upload.router.js +0 -50
  324. package/dist/es2020/modules/file-upload/file-upload.router.js.map +0 -1
  325. package/dist/es2020/modules/file-upload/file-upload.service.js +0 -314
  326. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -81
  327. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
  328. package/dist/es2020/modules/swagger/swagger.router.js +0 -135
  329. package/dist/es2020/modules/swagger/swagger.router.js.map +0 -1
  330. package/dist/es2020/server.js +0 -3
  331. package/dist/es2020/server.js.map +0 -1
  332. package/dist/es2020/types/arkos-config.js +0 -2
  333. package/dist/es2020/types/arkos-config.js.map +0 -1
  334. package/dist/es2020/types/auth.js +0 -2
  335. package/dist/es2020/types/index.js +0 -8
  336. package/dist/es2020/types/router-config.js +0 -2
  337. package/dist/es2020/utils/arkos-env.js +0 -7
  338. package/dist/es2020/utils/cli/build.js +0 -223
  339. package/dist/es2020/utils/cli/build.js.map +0 -1
  340. package/dist/es2020/utils/cli/dev.js +0 -264
  341. package/dist/es2020/utils/cli/dev.js.map +0 -1
  342. package/dist/es2020/utils/cli/generate.js +0 -183
  343. package/dist/es2020/utils/cli/index.js +0 -74
  344. package/dist/es2020/utils/cli/start.js +0 -86
  345. package/dist/es2020/utils/cli/start.js.map +0 -1
  346. package/dist/es2020/utils/cli/utils/cli.helpers.js +0 -18
  347. package/dist/es2020/utils/cli/utils/cli.helpers.js.map +0 -1
  348. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +0 -33
  349. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -18
  350. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js +0 -265
  351. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +0 -1
  352. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +0 -55
  353. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +0 -1
  354. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js +0 -32
  355. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js.map +0 -1
  356. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-service-template.js +0 -32
  357. package/dist/es2020/utils/cli/utils/template-generators.js +0 -25
  358. package/dist/es2020/utils/dotenv.helpers.js +0 -37
  359. package/dist/es2020/utils/features/api.features.js +0 -154
  360. package/dist/es2020/utils/features/api.features.js.map +0 -1
  361. package/dist/es2020/utils/features/change-case.features.js +0 -31
  362. package/dist/es2020/utils/helpers/api.features.helpers.js +0 -103
  363. package/dist/es2020/utils/helpers/change-case.helpers.js +0 -161
  364. package/dist/es2020/utils/helpers/deepmerge.helper.js +0 -113
  365. package/dist/es2020/utils/helpers/fs.helpers.js +0 -45
  366. package/dist/es2020/utils/helpers/fs.helpers.js.map +0 -1
  367. package/dist/es2020/utils/helpers/global.helpers.js +0 -4
  368. package/dist/es2020/utils/helpers/global.helpers.js.map +0 -1
  369. package/dist/es2020/utils/helpers/models.helpers.js +0 -276
  370. package/dist/es2020/utils/helpers/models.helpers.js.map +0 -1
  371. package/dist/es2020/utils/helpers/prisma.helpers.js +0 -41
  372. package/dist/es2020/utils/helpers/prisma.helpers.js.map +0 -1
  373. package/dist/es2020/utils/helpers/query-parser.helpers.js +0 -40
  374. package/dist/es2020/utils/helpers/text.helpers.js +0 -22
  375. package/dist/es2020/utils/validate-dto.js +0 -11
  376. package/dist/es2020/utils/validate-schema.js +0 -9
  377. /package/dist/{es2020 → esm}/exports/auth/index.js.map +0 -0
  378. /package/dist/{es2020 → esm}/exports/controllers/index.js.map +0 -0
  379. /package/dist/{es2020 → esm}/exports/error-handler/index.js.map +0 -0
  380. /package/dist/{es2020 → esm}/exports/index.js.map +0 -0
  381. /package/dist/{es2020 → esm}/exports/middlewares/index.js.map +0 -0
  382. /package/dist/{es2020 → esm}/exports/prisma/index.js.map +0 -0
  383. /package/dist/{es2020 → esm}/exports/services/index.js.map +0 -0
  384. /package/dist/{es2020 → esm}/exports/utils/index.js.map +0 -0
  385. /package/dist/{es2020 → esm}/exports/validation/index.js.map +0 -0
  386. /package/dist/{es2020 → esm}/modules/auth/auth.controller.js.map +0 -0
  387. /package/dist/{es2020 → esm}/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -0
  388. /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.controller.helpers.js.map +0 -0
  389. /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -0
  390. /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.service.helpers.js.map +0 -0
  391. /package/dist/{es2020 → esm}/modules/email/email.service.js.map +0 -0
  392. /package/dist/{es2020 → esm}/modules/error-handler/utils/app-error.js.map +0 -0
  393. /package/dist/{es2020 → esm}/modules/file-upload/file-upload.controller.js.map +0 -0
  394. /package/dist/{es2020 → esm}/modules/file-upload/file-upload.service.js.map +0 -0
  395. /package/dist/{es2020 → esm}/paths.js +0 -0
  396. /package/dist/{es2020 → esm}/paths.js.map +0 -0
  397. /package/dist/{es2020 → esm}/types/auth.js.map +0 -0
  398. /package/dist/{es2020 → esm}/types/index.js.map +0 -0
  399. /package/dist/{es2020 → esm}/types/router-config.js.map +0 -0
  400. /package/dist/{es2020 → esm}/utils/arkos-env.js.map +0 -0
  401. /package/dist/{es2020 → esm}/utils/cli/index.js.map +0 -0
  402. /package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js.map +0 -0
  403. /package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -0
  404. /package/dist/{es2020 → esm}/utils/cli/utils/template-generators.js.map +0 -0
  405. /package/dist/{es2020 → esm}/utils/dotenv.helpers.js.map +0 -0
  406. /package/dist/{es2020 → esm}/utils/features/change-case.features.js.map +0 -0
  407. /package/dist/{es2020 → esm}/utils/helpers/api.features.helpers.js.map +0 -0
  408. /package/dist/{es2020 → esm}/utils/helpers/change-case.helpers.js.map +0 -0
  409. /package/dist/{es2020 → esm}/utils/helpers/deepmerge.helper.js.map +0 -0
  410. /package/dist/{es2020 → esm}/utils/helpers/query-parser.helpers.js.map +0 -0
  411. /package/dist/{es2020 → esm}/utils/helpers/text.helpers.js.map +0 -0
  412. /package/dist/{es2020 → esm}/utils/validate-dto.js.map +0 -0
  413. /package/dist/{es2020 → esm}/utils/validate-schema.js.map +0 -0
@@ -1,185 +0,0 @@
1
- import jwt from "jsonwebtoken";
2
- import bcrypt from "bcryptjs";
3
- import catchAsync from "../error-handler/utils/catch-async";
4
- import AppError from "../error-handler/utils/app-error";
5
- import { callNext } from "../base/base.middlewares";
6
- import { getArkosConfig } from "../../server";
7
- import arkosEnv from "../../utils/arkos-env";
8
- import { getPrismaInstance } from "../../utils/helpers/prisma.helpers";
9
- export class AuthService {
10
- constructor() {
11
- this.authenticate = catchAsync(async (req, res, next) => {
12
- const arkosConfig = getArkosConfig();
13
- if (!arkosConfig?.authentication) {
14
- next();
15
- return;
16
- }
17
- req.user = (await this.getAuthenticatedUser(req));
18
- next();
19
- });
20
- }
21
- signJwtToken(id, expiresIn, secret) {
22
- const { authentication: configs } = getArkosConfig();
23
- if (process.env.NODE_ENV === "production" &&
24
- !process.env.JWT_SECRET &&
25
- !configs?.jwt?.secret)
26
- throw new AppError("Missing JWT secret on production!", 500, {}, "MissingJWTOnProduction");
27
- secret =
28
- secret ||
29
- configs?.jwt?.secret ||
30
- process.env.JWT_SECRET ||
31
- arkosEnv.JWT_SECRET;
32
- expiresIn = (expiresIn ||
33
- configs?.jwt?.expiresIn ||
34
- process.env.JWT_EXPIRES_IN ||
35
- arkosEnv.JWT_EXPIRES_IN);
36
- return jwt.sign({ id }, secret, {
37
- expiresIn: expiresIn,
38
- });
39
- }
40
- isPasswordHashed(password) {
41
- return !Number.isNaN(bcrypt.getRounds(password) * 1);
42
- }
43
- async isCorrectPassword(candidatePassword, userPassword) {
44
- return await bcrypt.compare(candidatePassword, userPassword);
45
- }
46
- async hashPassword(password) {
47
- return await bcrypt.hash(password, 12);
48
- }
49
- isPasswordStrong(password) {
50
- const initAuthConfigs = getArkosConfig()?.authentication;
51
- const strongPasswordRegex = initAuthConfigs?.passwordValidation?.regex ||
52
- /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).+$/;
53
- return strongPasswordRegex.test(password);
54
- }
55
- userChangedPasswordAfter(user, JWTTimestamp) {
56
- if (user.passwordChangedAt) {
57
- const convertedTimestamp = parseInt(String(user.passwordChangedAt.getTime() / 1000), 10);
58
- return JWTTimestamp < convertedTimestamp;
59
- }
60
- return false;
61
- }
62
- async verifyJwtToken(token, secret) {
63
- const { authentication: configs } = getArkosConfig();
64
- if (process.env.NODE_ENV === "production" &&
65
- !process.env.JWT_SECRET &&
66
- !configs?.jwt?.secret)
67
- throw new AppError("Missing JWT secret!", 500);
68
- secret =
69
- secret ||
70
- configs?.jwt?.secret ||
71
- process.env.JWT_SECRET ||
72
- arkosEnv.JWT_SECRET;
73
- return new Promise((resolve, reject) => {
74
- jwt.verify(token, secret, (err, decoded) => {
75
- if (err)
76
- reject(err);
77
- else
78
- resolve(decoded);
79
- });
80
- });
81
- }
82
- handleAccessControl(action, resourceName, accessControl) {
83
- return catchAsync(async (req, res, next) => {
84
- if (req.user) {
85
- const user = req.user;
86
- const prisma = getPrismaInstance();
87
- const configs = getArkosConfig();
88
- if (user.isSuperUser) {
89
- next();
90
- return;
91
- }
92
- if (configs?.authentication?.mode === "dynamic") {
93
- const matchingRole = await prisma.userRole.findFirst({
94
- where: {
95
- userId: req.user.id,
96
- role: {
97
- permissions: {
98
- some: {
99
- resource: resourceName,
100
- action: action,
101
- },
102
- },
103
- },
104
- },
105
- select: { id: true },
106
- });
107
- if (!matchingRole)
108
- return next(new AppError("You do not have permission to perfom this action", 403));
109
- }
110
- else if (configs?.authentication?.mode === "static") {
111
- let authorizedRoles = [];
112
- if (!accessControl)
113
- return next(new AppError("You do not have permission to perform this action", 403));
114
- if (Array.isArray(accessControl))
115
- authorizedRoles = accessControl;
116
- else if (accessControl[action])
117
- authorizedRoles = accessControl[action] || [];
118
- const userRoles = Array.isArray(user?.roles)
119
- ? user.roles
120
- : [user.role];
121
- const hasPermission = userRoles.some((role) => authorizedRoles.includes(role));
122
- if (!hasPermission) {
123
- return next(new AppError("You do not have permission to perform this action", 403));
124
- }
125
- }
126
- }
127
- next();
128
- });
129
- }
130
- async getAuthenticatedUser(req) {
131
- const arkosConfig = getArkosConfig();
132
- if (!arkosConfig?.authentication)
133
- return null;
134
- const prisma = getPrismaInstance();
135
- let token;
136
- if (req?.headers?.authorization &&
137
- req?.headers?.authorization.startsWith("Bearer")) {
138
- token = req?.headers?.authorization.split(" ")[1];
139
- }
140
- else if (req?.cookies?.arkos_access_token !== "no-token" && req.cookies) {
141
- token = req?.cookies?.arkos_access_token;
142
- }
143
- if (!token)
144
- throw new AppError("You are not logged in! please log in to get access", 401, {}, "LoginRequired");
145
- let decoded;
146
- try {
147
- decoded = await this.verifyJwtToken(token);
148
- }
149
- catch (err) {
150
- throw new AppError("Your auth token is invalid, please login again.", 401, {}, "InvalidAuthToken");
151
- }
152
- if (!decoded?.id)
153
- throw new AppError("Your auth token is invalid, please login again.", 401, {}, "InvalidAuthToken");
154
- const user = await prisma.user.findUnique({
155
- where: { id: String(decoded.id) },
156
- select: {
157
- id: true,
158
- passwordChangedAt: true,
159
- isActive: true,
160
- deletedSelfAccountAt: true,
161
- isSuperUser: true,
162
- },
163
- });
164
- if (!user)
165
- throw new AppError("The user belonging to this token does no longer exists", 401);
166
- if (this.userChangedPasswordAfter(user, decoded.iat) &&
167
- !req.path?.includes?.("logout"))
168
- throw new AppError("User recently changed password! Please log in again.", 401, {}, "PasswordChanged");
169
- return user;
170
- }
171
- handleAuthenticationControl(action, authenticationControl) {
172
- if (authenticationControl && typeof authenticationControl === "object") {
173
- if (authenticationControl[action] === false)
174
- return callNext;
175
- else if (authenticationControl[action] === true)
176
- return this.authenticate;
177
- }
178
- else
179
- return this.authenticate;
180
- return this.authenticate;
181
- }
182
- }
183
- const authService = new AuthService();
184
- export default authService;
185
- //# sourceMappingURL=auth.service.js.map
@@ -1 +0,0 @@
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 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 &&\n !configs?.jwt?.secret\n )\n throw new AppError(\n \"Missing JWT secret on production!\",\n 500,\n {},\n \"MissingJWTOnProduction\"\n );\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 * Is used by default internally by Arkos under `BaseService` class to check if the password is already hashed.\n *\n * This was just added to prevent unwanted errors when someone just forgets that the `BaseService` class will automatically hash the password field using `authService.hashPassword` by default.\n *\n * So now before `BaseService` hashes it will test it.\n *\n *\n * @param password The password to be tested if is hashed\n * @returns\n */\n isPasswordHashed(password: string) {\n return !Number.isNaN(bcrypt.getRounds(password) * 1);\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 role: {\n permissions: {\n some: {\n resource: resourceName,\n action: action,\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 (!accessControl)\n return next(\n new AppError(\n \"You do not have permission to perform this action\",\n 403\n )\n );\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 \"LoginRequired\"\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 \"InvalidAuthToken\"\n );\n }\n\n if (!decoded?.id)\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401,\n {},\n \"InvalidAuthToken\"\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 \"PasswordChanged\"\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,73 +0,0 @@
1
- import { getArkosConfig } from "../../../../server";
2
- import AppError from "../../../error-handler/utils/app-error";
3
- export const determineUsernameField = (req) => {
4
- const authConfigs = getArkosConfig()?.authentication;
5
- if (req.query?.usernameField &&
6
- typeof req.query?.usernameField === "string" &&
7
- authConfigs?.login?.allowedUsernames?.includes?.(req.query.usernameField))
8
- return req.query.usernameField;
9
- else if (req.query?.usernameField)
10
- throw new AppError("Invalid usernameField parameter, it is not allowed!", 400);
11
- return authConfigs?.login?.allowedUsernames?.[0] || "username";
12
- };
13
- export const createPrismaWhereClause = (path, value) => {
14
- if (!path)
15
- return {};
16
- const parts = path.split(".");
17
- const whereClause = {};
18
- if (parts.length === 1) {
19
- whereClause[parts[0]] = value;
20
- return whereClause;
21
- }
22
- let current = whereClause;
23
- for (let i = 0; i < parts.length - 1; i++) {
24
- const part = parts[i];
25
- current[part] = {};
26
- current = current[part];
27
- }
28
- current[parts[parts.length - 1]] = value;
29
- return whereClause;
30
- };
31
- export const getNestedValue = (obj, path) => {
32
- if (!obj || !path)
33
- return undefined;
34
- const properties = path.split(".");
35
- const lastProperty = properties[properties.length - 1];
36
- if (lastProperty in obj) {
37
- return obj[lastProperty];
38
- }
39
- return undefined;
40
- };
41
- function normalizeDuration(input) {
42
- return input
43
- .toLowerCase()
44
- .replace(/years?|yr|year/g, "y")
45
- .replace(/minutes?|min/g, "m")
46
- .replace(/seconds?|sec|secs/g, "s")
47
- .replace(/hours?|hr/g, "h")
48
- .replace(/days?/g, "d")
49
- .replace(/weeks?/g, "w")
50
- .replace(/milliseconds?/g, "ms");
51
- }
52
- export function toMs(input) {
53
- if (typeof input === "number")
54
- return input * 1000;
55
- const normalizedInput = normalizeDuration(input.trim());
56
- const regex = /^(\d+(?:\.\d+)?)(ms|s|m|h|d|w|y)$/i;
57
- const match = normalizedInput.match(regex);
58
- if (!match)
59
- throw new Error(`Invalid time format: ${input}`);
60
- const value = parseFloat(match[1]);
61
- const unit = match[2].toLowerCase();
62
- const multipliers = {
63
- ms: 1,
64
- s: 1000,
65
- m: 60000,
66
- h: 3600000,
67
- d: 86400000,
68
- w: 604800000,
69
- y: 31557600000,
70
- };
71
- return value * multipliers[unit];
72
- }
73
- //# sourceMappingURL=auth.controller.helpers.js.map
@@ -1,151 +0,0 @@
1
- import catchAsync from "../error-handler/utils/catch-async";
2
- import APIFeatures from "../../utils/features/api.features";
3
- import { BaseService } from "./base.service";
4
- import AppError from "../error-handler/utils/app-error";
5
- import { kebabCase, pascalCase } from "../../utils/helpers/change-case.helpers";
6
- import { getModelModules, getModels } from "../../utils/helpers/models.helpers";
7
- import { getAppRoutes } from "./utils/helpers/base.controller.helpers";
8
- import pluralize from "pluralize";
9
- export class BaseController {
10
- constructor(modelName) {
11
- this.createOne = catchAsync(async (req, res, next) => {
12
- const data = await this.service.createOne(req.body, req.prismaQueryOptions);
13
- if (this.middlewares.afterCreateOne) {
14
- req.responseData = { data };
15
- req.responseStatus = 201;
16
- return next();
17
- }
18
- res.status(201).json({ data });
19
- });
20
- this.createMany = catchAsync(async (req, res, next) => {
21
- const data = await this.service.createMany(req.body, req.prismaQueryOptions);
22
- if (!data) {
23
- return next(new AppError("Failed to create the resources. Please check your input.", 400));
24
- }
25
- if (this.middlewares.afterCreateMany) {
26
- req.responseData = { data };
27
- req.responseStatus = 201;
28
- return next();
29
- }
30
- res.status(201).json({ data });
31
- });
32
- this.findMany = catchAsync(async (req, res, next) => {
33
- const { filters: { where, ...queryOptions }, } = new APIFeatures(req, this.modelName)
34
- .filter()
35
- .sort()
36
- .limitFields()
37
- .paginate();
38
- const [data, total] = (await Promise.all([
39
- this.service.findMany(where, queryOptions),
40
- this.service.count(where),
41
- ]));
42
- if (this.middlewares.afterFindMany) {
43
- req.responseData = { total, results: data.length, data };
44
- req.responseStatus = 200;
45
- return next();
46
- }
47
- res.status(200).json({ total, results: data.length, data });
48
- });
49
- this.findOne = catchAsync(async (req, res, next) => {
50
- const data = await this.service.findOne(req.params, req.prismaQueryOptions);
51
- if (!data) {
52
- if (Object.keys(req.params).length === 1 &&
53
- "id" in req.params &&
54
- req.params.id !== "me") {
55
- return next(new AppError(`${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`, 404, {}, "not_found"));
56
- }
57
- else {
58
- return next(new AppError(`${pascalCase(String(this.modelName))} not found`, 404, {}, "not_found"));
59
- }
60
- }
61
- if (this.middlewares.afterFindOne) {
62
- req.responseData = { data };
63
- req.responseStatus = 200;
64
- return next();
65
- }
66
- res.status(200).json({ data });
67
- });
68
- this.updateOne = catchAsync(async (req, res, next) => {
69
- const data = await this.service.updateOne(req.params, req.body, req.prismaQueryOptions);
70
- if (!data) {
71
- if (Object.keys(req.params).length === 1 && "id" in req.params) {
72
- return next(new AppError(`${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`, 404, {}, "not_found"));
73
- }
74
- else {
75
- return next(new AppError(`${pascalCase(String(this.modelName))} not found`, 404, {}, "not_found"));
76
- }
77
- }
78
- if (this.middlewares.afterUpdateOne) {
79
- req.responseData = { data };
80
- req.responseStatus = 200;
81
- return next();
82
- }
83
- res.status(200).json({ data });
84
- });
85
- this.updateMany = catchAsync(async (req, res, next) => {
86
- if (!Object.keys(req.query).some((key) => key !== "prismaQueryOptions")) {
87
- return next(new AppError("Filter criteria not provided for bulk update.", 400));
88
- }
89
- req.query.filterMode = req.query?.filterMode || "AND";
90
- const { filters: { where, ...queryOptions }, } = new APIFeatures(req, this.modelName).filter().sort();
91
- delete queryOptions.include;
92
- const data = (await this.service.updateMany(where, req.body, queryOptions));
93
- if (!data || data.count === 0)
94
- return next(new AppError(`${pluralize(pascalCase(String(this.modelName)))} not found`, 404));
95
- if (this.middlewares.afterUpdateMany) {
96
- req.responseData = { results: data.count, data };
97
- req.responseStatus = 200;
98
- return next();
99
- }
100
- res.status(200).json({ results: data.count, data });
101
- });
102
- this.deleteOne = catchAsync(async (req, res, next) => {
103
- const data = await this.service.deleteOne(req.params);
104
- if (!data) {
105
- if (Object.keys(req.params).length === 1 && "id" in req.params) {
106
- return next(new AppError(`${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`, 404, {}, "not_found"));
107
- }
108
- else {
109
- return next(new AppError(`${pascalCase(String(this.modelName))} not found`, 404, {}, "not_found"));
110
- }
111
- }
112
- if (this.middlewares.afterDeleteOne) {
113
- req.additionalData = { data };
114
- req.responseStatus = 204;
115
- return next();
116
- }
117
- res.status(204).send();
118
- });
119
- this.deleteMany = catchAsync(async (req, res, next) => {
120
- if (!Object.keys(req.query).some((key) => key !== "prismaQueryOptions")) {
121
- return next(new AppError("Filter criteria not provided for bulk deletion.", 400));
122
- }
123
- req.query.filterMode = req.query?.filterMode || "AND";
124
- const { filters: { where }, } = new APIFeatures(req, this.modelName).filter().sort();
125
- const data = await this.service.deleteMany(where);
126
- if (!data || data.count === 0) {
127
- return next(new AppError(`No records found to delete`, 404));
128
- }
129
- if (this.middlewares.afterDeleteMany) {
130
- req.responseData = { results: data.count, data };
131
- req.responseStatus = 200;
132
- return next();
133
- }
134
- res.status(200).json({ results: data.count, data });
135
- });
136
- this.modelName = modelName;
137
- this.service = new BaseService(modelName);
138
- this.middlewares = getModelModules(modelName)?.middlewares || {};
139
- }
140
- }
141
- export function getAvalibleRoutes(req, res, next) {
142
- const routes = getAppRoutes();
143
- res.json(routes);
144
- }
145
- export const getAvailableResources = catchAsync(async (req, res, next) => {
146
- const models = getModels();
147
- res.status(200).json({
148
- data: [...models.map((model) => kebabCase(model)), "file-upload"],
149
- });
150
- });
151
- //# sourceMappingURL=base.controller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.controller.js","sourceRoot":"","sources":["../../../../src/modules/base/base.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport APIFeatures from \"../../utils/features/api.features\";\nimport { BaseService } from \"./base.service\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { kebabCase, pascalCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModelModules, getModels } from \"../../utils/helpers/models.helpers\";\nimport { getAppRoutes } from \"./utils/helpers/base.controller.helpers\";\nimport pluralize from \"pluralize\";\n\n/**\n * The `BaseController` class provides standardized RESTful API endpoints\n * for any Prisma model based on its name. It supports automatic integration\n * with Prisma services and dynamic middleware hooks for extending behaviors.\n *\n * This controller includes:\n * - `createOne` / `createMany`\n * - `findOne` / `findMany`\n * - `updateOne` / `updateMany`\n * - `deleteOne` / `deleteMany`\n *\n * It handles:\n * - Prisma query options\n * - APIFeatures: filtering, sorting, pagination, field limiting\n * - Middleware hooks: `afterCreateOne`, `afterUpdateMany`, etc.\n *\n * @class BaseController\n * @example\n *\n * **Extending the Controller**\n *\n * ```ts\n * // src/modules/product/product.controller.ts\n *\n * class ProductController extends BaseController {}\n *\n * const productController = new ProcutController(\"product\")\n *\n * export default productController\n *\n * ```\n * **Using in custom Router**\n *\n * ```ts\n * // src/modules/product/product.router.ts\n *\n * import { Router } from \"express\";\n * import productController from \"./product.controller\";\n *\n * const productRouter = Router();\n *\n * // Arkos handles this base endpoints by default it\n * // is just an example\n *\n * productRouter.post(\"/\", productController.createOne);\n * productRouter.get(\"/\", productController.findMany);\n * productRouter.get(\"/:id\", productController.findOne);\n * productRouter.patch(\"/:id\", productController.updateOne);\n * productRouter.delete(\"/:id\", productController.deleteOne);\n *\n * export default productRouter\n * ```\n *\n * @param {string} modelName - The Prisma model name this controller handles.\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-controller-class}\n *--\n *\n * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport class BaseController {\n /**\n * Service instance to handle business logic operations\n * @private\n */\n private service: BaseService<any>;\n\n /**\n * Name of the model this controller handles\n * @private\n */\n private modelName: string;\n\n /**\n * Model-specific middlewares loaded from model modules\n * @private\n */\n private middlewares: any;\n\n /**\n * Creates a new BaseController instance\n * @param {string} modelName - The name of the model for which this controller will handle operations\n */\n constructor(modelName: string) {\n this.modelName = modelName;\n this.service = new BaseService(modelName);\n this.middlewares = getModelModules(modelName)?.middlewares || {};\n }\n\n /**\n * Creates a single resource\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createOne(\n req.body,\n req.prismaQueryOptions\n );\n\n if (this.middlewares.afterCreateOne) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Creates multiple resources in a single operation\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createMany(\n req.body,\n req.prismaQueryOptions\n );\n\n if (!data) {\n return next(\n new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400\n )\n );\n }\n\n if (this.middlewares.afterCreateMany) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName)\n .filter()\n .sort()\n .limitFields()\n .paginate();\n\n // Execute both operations separately\n const [data, total] = (await Promise.all([\n this.service.findMany(where, queryOptions),\n this.service.count(where),\n ])) as [Record<string, any>[], number];\n\n if (this.middlewares.afterFindMany) {\n req.responseData = { total, results: data.length, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ total, results: data.length, data });\n }\n );\n\n /**\n * Retrieves a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.findOne(\n req.params,\n req.prismaQueryOptions\n );\n\n if (!data) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"not_found\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"not_found\"\n )\n );\n }\n }\n\n if (this.middlewares.afterFindOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.updateOne(\n req.params,\n req.body,\n req.prismaQueryOptions\n );\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"not_found\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"not_found\"\n )\n );\n }\n }\n\n if (this.middlewares.afterUpdateOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\"Filter criteria not provided for bulk update.\", 400)\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName).filter().sort();\n delete queryOptions.include;\n\n const data = (await this.service.updateMany(\n where,\n req.body,\n queryOptions\n )) as { count: number };\n\n if (!data || data.count === 0)\n return next(\n new AppError(\n `${pluralize(pascalCase(String(this.modelName)))} not found`,\n 404\n )\n );\n\n if (this.middlewares.afterUpdateMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n\n /**\n * Deletes a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.deleteOne(req.params);\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"not_found\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"not_found\"\n )\n );\n }\n }\n\n if (this.middlewares.afterDeleteOne) {\n req.additionalData = { data };\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).send();\n }\n );\n\n /**\n * Deletes multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\"Filter criteria not provided for bulk deletion.\", 400)\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where },\n } = new APIFeatures(req, this.modelName).filter().sort();\n\n const data = await this.service.deleteMany(where);\n\n if (!data || data.count === 0) {\n return next(new AppError(`No records found to delete`, 404));\n }\n\n if (this.middlewares.afterDeleteMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n}\n\n/**\n * Returns a list of all registered API routes in the Express application\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {void}\n */\nexport function getAvalibleRoutes(\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n) {\n const routes = getAppRoutes();\n\n res.json(routes);\n}\n\n/**\n * Returns a list of all available resource endpoints based on the application's models\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\nexport const getAvailableResources = catchAsync(async (req, res, next) => {\n const models = getModels();\n res.status(200).json({\n data: [...models.map((model) => kebabCase(model)), \"file-upload\"],\n });\n});\n"]}
@@ -1,81 +0,0 @@
1
- import { getArkosConfig } from "../../server";
2
- import deepmerge from "../../utils/helpers/deepmerge.helper";
3
- import { catchAsync } from "../../exports/error-handler";
4
- import validateDto from "../../utils/validate-dto";
5
- import validateSchema from "../../utils/validate-schema";
6
- import { resolvePrismaQueryOptions } from "./utils/helpers/base.middlewares.helpers";
7
- export function callNext(req, res, next) {
8
- next();
9
- }
10
- export function sendResponse(req, res, next) {
11
- if (Number(req?.responseStatus) === 204)
12
- res.status(Number(req?.responseStatus)).send();
13
- else if (req.responseData && req?.responseStatus)
14
- res.status(Number(req?.responseStatus)).json(req.responseData);
15
- else if (Number(req?.responseStatus) && !req.responseData)
16
- res.status(Number(req?.responseStatus)).send();
17
- else
18
- res
19
- .status(500)
20
- .json({ message: "No status or data attached to the response" });
21
- }
22
- export function addRouteMiddlwaresAndConfigs() { }
23
- export function addPrismaQueryOptionsToRequest(prismaQueryOptions, action) {
24
- return (req, res, next) => {
25
- const configs = getArkosConfig();
26
- const resolvedOptions = resolvePrismaQueryOptions(prismaQueryOptions, action);
27
- const requestQueryOptions = configs?.request?.parameters
28
- ?.allowDangerousPrismaQueryOptions
29
- ? JSON.parse(req.query?.prismaQueryOptions || "{}")
30
- : {};
31
- req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);
32
- next();
33
- };
34
- }
35
- export function handleRequestLogs(req, res, next) {
36
- const startTime = Date.now();
37
- const methodColors = {
38
- GET: "\x1b[36m",
39
- POST: "\x1b[32m",
40
- PUT: "\x1b[33m",
41
- PATCH: "\x1b[33m",
42
- DELETE: "\x1b[31m",
43
- HEAD: "\x1b[34m",
44
- OPTIONS: "\x1b[34m",
45
- };
46
- const getStatusColor = (statusCode) => {
47
- if (statusCode >= 200 && statusCode < 300)
48
- return "\x1b[32m";
49
- if (statusCode >= 300 && statusCode < 400)
50
- return "\x1b[33m";
51
- if (statusCode >= 400 && statusCode < 500)
52
- return "\x1b[33m";
53
- if (statusCode >= 500)
54
- return "\x1b[31m";
55
- return "\x1b[0m";
56
- };
57
- res.on("finish", () => {
58
- const duration = Date.now() - startTime;
59
- const now = new Date();
60
- const time = now.toTimeString().split(" ")[0];
61
- const methodColor = methodColors[req.method] || "\x1b[0m";
62
- const statusColor = getStatusColor(res.statusCode);
63
- console.info(`[\x1b[36mINFO\x1b[0m] \x1b[90m${time}\x1b[0m ${methodColor}${req.method}\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${res.statusCode}\x1b[0m \x1b[35m${duration}ms\x1b[0m`);
64
- });
65
- next();
66
- }
67
- export function handleRequestBodyValidationAndTransformation(schemaOrDtoClass, classValidatorValidationOptions) {
68
- return catchAsync(async (req, res, next) => {
69
- const validationConfigs = getArkosConfig()?.validation;
70
- let body = req.body;
71
- if (validationConfigs?.resolver === "class-validator" && schemaOrDtoClass)
72
- req.body = await validateDto(schemaOrDtoClass, body, deepmerge({
73
- whitelist: true,
74
- ...classValidatorValidationOptions,
75
- }, validationConfigs?.validationOptions || {}));
76
- else if (validationConfigs?.resolver === "zod" && schemaOrDtoClass)
77
- req.body = await validateSchema(schemaOrDtoClass, body);
78
- next();
79
- });
80
- }
81
- //# sourceMappingURL=base.middlewares.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\n\nexport function callNext(req: Request, res: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n // Resolve and merge all applicable options using the helper\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n // Parse and merge any dangerous query options from request if allowed\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n // Final merge with request options having the highest priority\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mINFO\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
@@ -1,17 +0,0 @@
1
- import { Router } from "express";
2
- import { getAvalibleRoutes, getAvailableResources } from "./base.controller";
3
- import { getModels } from "../../utils/helpers/models.helpers";
4
- import authService from "../auth/auth.service";
5
- import { setupRouters } from "./utils/helpers/base.router.helpers";
6
- export async function getPrismaModelsRouter(arkosConfigs) {
7
- const router = Router();
8
- await Promise.all(setupRouters(getModels(), router, arkosConfigs));
9
- return router;
10
- }
11
- export function getAvailableResourcesAndRoutesRouter() {
12
- const router = Router();
13
- router.get("/available-routes", authService?.authenticate, getAvalibleRoutes);
14
- router.get("/available-resources", authService?.authenticate, getAvailableResources);
15
- return router;
16
- }
17
- //# sourceMappingURL=base.router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.router.js","sourceRoot":"","sources":["../../../../src/modules/base/base.router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,YAAyB;IACnE,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oCAAoC;IAClD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CACR,mBAAmB,EACnB,WAAW,EAAE,YAAY,EAEzB,iBAAiB,CAClB,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,sBAAsB,EACtB,WAAW,EAAE,YAAY,EAEzB,qBAAqB,CACtB,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { Router } from \"express\";\nimport { getAvalibleRoutes, getAvailableResources } from \"./base.controller\";\nimport { getModels } from \"../../utils/helpers/models.helpers\";\n\nimport authService from \"../auth/auth.service\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport { setupRouters } from \"./utils/helpers/base.router.helpers\";\n\nexport async function getPrismaModelsRouter(arkosConfigs: ArkosConfig) {\n const router: Router = Router();\n\n await Promise.all(setupRouters(getModels(), router, arkosConfigs));\n\n return router;\n}\n\nexport function getAvailableResourcesAndRoutesRouter(): Router {\n const router = Router();\n //\n router.get(\n \"/available-routes\",\n authService?.authenticate,\n // authService?.handleAccessControl({}, \"view\", \"\"),\n getAvalibleRoutes\n );\n\n router.get(\n \"/available-resources\",\n authService?.authenticate,\n // authService?.handleAccessControl({}, \"view\", \"\"),\n getAvailableResources\n );\n\n return router;\n}\n"]}