arkos 1.2.13-test → 1.2.13-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 (265) hide show
  1. package/README.md +22 -14
  2. package/cli.js +2 -11
  3. package/dist/cjs/app.js +138 -1
  4. package/dist/cjs/app.js.map +1 -1
  5. package/dist/cjs/index.js +22 -0
  6. package/dist/cjs/modules/auth/auth.router.js +9 -83
  7. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  8. package/dist/cjs/modules/auth/auth.service.js +0 -7
  9. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  10. package/dist/cjs/modules/base/base.controller.js +11 -12
  11. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  12. package/dist/cjs/modules/base/base.middlewares.js +4 -4
  13. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  14. package/dist/cjs/modules/base/base.router.js.map +1 -1
  15. package/dist/cjs/modules/base/base.service.js.map +1 -1
  16. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +43 -113
  17. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  18. package/dist/cjs/modules/error-handler/error-handler.controller.js +2 -0
  19. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  20. package/dist/cjs/modules/error-handler/utils/catch-async.js +1 -1
  21. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  22. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +6 -0
  23. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  24. package/dist/cjs/modules/file-upload/file-upload.router.js +9 -21
  25. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  26. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +7 -0
  27. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  28. package/dist/cjs/modules/swagger/swagger.router.js +71 -93
  29. package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
  30. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +270 -0
  31. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
  32. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +66 -0
  33. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
  34. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +41 -0
  35. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
  36. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +29 -0
  37. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
  38. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +30 -0
  39. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
  40. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +471 -0
  41. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
  42. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +575 -0
  43. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +1 -0
  44. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +253 -0
  45. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
  46. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +105 -0
  47. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
  48. package/dist/cjs/paths.js +9 -1
  49. package/dist/cjs/server.js +85 -3
  50. package/dist/cjs/server.js.map +1 -1
  51. package/dist/cjs/types/arkos-config.js.map +1 -1
  52. package/dist/cjs/utils/cli/build.js +2 -19
  53. package/dist/cjs/utils/cli/build.js.map +1 -1
  54. package/dist/cjs/utils/cli/dev.js +35 -47
  55. package/dist/cjs/utils/cli/dev.js.map +1 -1
  56. package/dist/cjs/utils/cli/generate.js +6 -6
  57. package/dist/cjs/utils/cli/generate.js.map +1 -1
  58. package/dist/cjs/utils/cli/start.js +4 -3
  59. package/dist/cjs/utils/cli/start.js.map +1 -1
  60. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -3
  61. package/dist/cjs/utils/cli/utils/cli.helpers.js.map +1 -1
  62. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +33 -66
  63. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
  64. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +17 -11
  65. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
  66. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js +5 -0
  67. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
  68. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js +1 -1
  69. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
  70. package/dist/cjs/utils/features/api.features.js +10 -4
  71. package/dist/cjs/utils/features/api.features.js.map +1 -1
  72. package/dist/cjs/utils/helpers/fs.helpers.js +12 -5
  73. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  74. package/dist/cjs/utils/helpers/global.helpers.js +51 -2
  75. package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
  76. package/dist/cjs/utils/helpers/models.helpers.js +81 -67
  77. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  78. package/dist/cjs/utils/helpers/prisma.helpers.js +7 -4
  79. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  80. package/dist/cjs/utils/helpers/routers.helpers.js +21 -0
  81. package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -0
  82. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js +451 -0
  83. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
  84. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +88 -0
  85. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -0
  86. package/dist/cjs/utils/prisma/prisma-schema-parser.js +158 -0
  87. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -0
  88. package/dist/cjs/utils/prisma/types.js +3 -0
  89. package/dist/cjs/utils/prisma/types.js.map +1 -0
  90. package/dist/cjs/utils/sheu.js +119 -0
  91. package/dist/cjs/utils/sheu.js.map +1 -0
  92. package/dist/esm/index.d.mts +280 -0
  93. package/dist/esm/index.mjs +22 -0
  94. package/dist/exports/index.js +1 -0
  95. package/dist/types/arkos-config.js +1 -0
  96. package/dist/types/auth.js +1 -0
  97. package/dist/types/index.js +1 -0
  98. package/dist/types/modules/base/base.middlewares.d.ts +4 -4
  99. package/dist/types/modules/base/base.service.d.ts +1 -1
  100. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +4 -1
  101. package/dist/types/modules/error-handler/utils/catch-async.d.ts +1 -0
  102. package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +4 -0
  103. package/dist/types/modules/file-upload/file-upload.router.d.ts +1 -1
  104. package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +2 -1
  105. package/dist/types/modules/swagger/swagger.router.d.ts +1 -1
  106. package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +3 -0
  107. package/dist/types/modules/swagger/utils/helpers/get-system-json-schema-paths.d.ts +2 -0
  108. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +1 -0
  109. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +2 -0
  110. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.d.ts +1 -0
  111. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.d.ts +3 -0
  112. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.d.ts +3 -0
  113. package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +34 -0
  114. package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +7 -0
  115. package/dist/types/router-config.js +1 -0
  116. package/dist/types/server.d.ts +3 -0
  117. package/dist/types/types/arkos-config.d.ts +10 -5
  118. package/dist/types/utils/cli/utils/cli.helpers.d.ts +1 -1
  119. package/dist/types/utils/features/api.features.d.ts +1 -0
  120. package/dist/types/utils/helpers/global.helpers.d.ts +6 -1
  121. package/dist/types/utils/helpers/models.helpers.d.ts +31 -5
  122. package/dist/types/utils/helpers/routers.helpers.d.ts +2 -0
  123. package/dist/types/utils/prisma/enhaced-prisma-json-schema-generator.d.ts +34 -0
  124. package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +10 -0
  125. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +18 -0
  126. package/dist/types/utils/prisma/types.d.ts +48 -0
  127. package/dist/types/utils/sheu.d.ts +70 -0
  128. package/dist/utils/arkos-env.js +1 -0
  129. package/dist/utils/dotenv.helpers.js +1 -0
  130. package/dist/utils/sheu.js +1 -0
  131. package/dist/utils/validate-dto.js +1 -0
  132. package/dist/utils/validate-schema.js +1 -0
  133. package/package.json +32 -34
  134. package/dist/es2020/app.js +0 -1
  135. package/dist/es2020/app.js.map +0 -1
  136. package/dist/es2020/exports/auth/index.js +0 -2
  137. package/dist/es2020/exports/auth/index.js.map +0 -1
  138. package/dist/es2020/exports/controllers/index.js +0 -4
  139. package/dist/es2020/exports/controllers/index.js.map +0 -1
  140. package/dist/es2020/exports/error-handler/index.js +0 -4
  141. package/dist/es2020/exports/error-handler/index.js.map +0 -1
  142. package/dist/es2020/exports/index.js +0 -8
  143. package/dist/es2020/exports/index.js.map +0 -1
  144. package/dist/es2020/exports/middlewares/index.js +0 -2
  145. package/dist/es2020/exports/middlewares/index.js.map +0 -1
  146. package/dist/es2020/exports/prisma/index.js +0 -3
  147. package/dist/es2020/exports/prisma/index.js.map +0 -1
  148. package/dist/es2020/exports/services/index.js +0 -9
  149. package/dist/es2020/exports/services/index.js.map +0 -1
  150. package/dist/es2020/exports/utils/index.js +0 -4
  151. package/dist/es2020/exports/utils/index.js.map +0 -1
  152. package/dist/es2020/exports/validation/index.js +0 -4
  153. package/dist/es2020/exports/validation/index.js.map +0 -1
  154. package/dist/es2020/modules/auth/auth.controller.js +0 -187
  155. package/dist/es2020/modules/auth/auth.controller.js.map +0 -1
  156. package/dist/es2020/modules/auth/auth.router.js +0 -118
  157. package/dist/es2020/modules/auth/auth.router.js.map +0 -1
  158. package/dist/es2020/modules/auth/auth.service.js +0 -185
  159. package/dist/es2020/modules/auth/auth.service.js.map +0 -1
  160. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +0 -73
  161. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -1
  162. package/dist/es2020/modules/base/base.controller.js +0 -151
  163. package/dist/es2020/modules/base/base.controller.js.map +0 -1
  164. package/dist/es2020/modules/base/base.middlewares.js +0 -81
  165. package/dist/es2020/modules/base/base.middlewares.js.map +0 -1
  166. package/dist/es2020/modules/base/base.router.js +0 -17
  167. package/dist/es2020/modules/base/base.router.js.map +0 -1
  168. package/dist/es2020/modules/base/base.service.js +0 -120
  169. package/dist/es2020/modules/base/base.service.js.map +0 -1
  170. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js +0 -77
  171. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js.map +0 -1
  172. package/dist/es2020/modules/base/utils/helpers/base.middlewares.helpers.js +0 -44
  173. package/dist/es2020/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -1
  174. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +0 -161
  175. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
  176. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +0 -165
  177. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js.map +0 -1
  178. package/dist/es2020/modules/email/email.service.js +0 -97
  179. package/dist/es2020/modules/email/email.service.js.map +0 -1
  180. package/dist/es2020/modules/error-handler/error-handler.controller.js +0 -105
  181. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +0 -1
  182. package/dist/es2020/modules/error-handler/utils/app-error.js +0 -15
  183. package/dist/es2020/modules/error-handler/utils/app-error.js.map +0 -1
  184. package/dist/es2020/modules/error-handler/utils/catch-async.js +0 -10
  185. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +0 -1
  186. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +0 -155
  187. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
  188. package/dist/es2020/modules/file-upload/file-upload.controller.js +0 -266
  189. package/dist/es2020/modules/file-upload/file-upload.controller.js.map +0 -1
  190. package/dist/es2020/modules/file-upload/file-upload.router.js +0 -50
  191. package/dist/es2020/modules/file-upload/file-upload.router.js.map +0 -1
  192. package/dist/es2020/modules/file-upload/file-upload.service.js +0 -314
  193. package/dist/es2020/modules/file-upload/file-upload.service.js.map +0 -1
  194. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -81
  195. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
  196. package/dist/es2020/modules/swagger/swagger.router.js +0 -135
  197. package/dist/es2020/modules/swagger/swagger.router.js.map +0 -1
  198. package/dist/es2020/paths.js +0 -1
  199. package/dist/es2020/paths.js.map +0 -1
  200. package/dist/es2020/server.js +0 -3
  201. package/dist/es2020/server.js.map +0 -1
  202. package/dist/es2020/types/arkos-config.js +0 -2
  203. package/dist/es2020/types/arkos-config.js.map +0 -1
  204. package/dist/es2020/types/auth.js +0 -2
  205. package/dist/es2020/types/auth.js.map +0 -1
  206. package/dist/es2020/types/index.js +0 -8
  207. package/dist/es2020/types/index.js.map +0 -1
  208. package/dist/es2020/types/router-config.js +0 -2
  209. package/dist/es2020/types/router-config.js.map +0 -1
  210. package/dist/es2020/utils/arkos-env.js +0 -7
  211. package/dist/es2020/utils/arkos-env.js.map +0 -1
  212. package/dist/es2020/utils/cli/build.js +0 -223
  213. package/dist/es2020/utils/cli/build.js.map +0 -1
  214. package/dist/es2020/utils/cli/dev.js +0 -261
  215. package/dist/es2020/utils/cli/dev.js.map +0 -1
  216. package/dist/es2020/utils/cli/generate.js +0 -183
  217. package/dist/es2020/utils/cli/generate.js.map +0 -1
  218. package/dist/es2020/utils/cli/index.js +0 -74
  219. package/dist/es2020/utils/cli/index.js.map +0 -1
  220. package/dist/es2020/utils/cli/start.js +0 -86
  221. package/dist/es2020/utils/cli/start.js.map +0 -1
  222. package/dist/es2020/utils/cli/utils/cli.helpers.js +0 -18
  223. package/dist/es2020/utils/cli/utils/cli.helpers.js.map +0 -1
  224. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +0 -33
  225. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js.map +0 -1
  226. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -18
  227. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
  228. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js +0 -265
  229. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +0 -1
  230. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +0 -55
  231. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +0 -1
  232. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js +0 -32
  233. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js.map +0 -1
  234. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-service-template.js +0 -32
  235. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-service-template.js.map +0 -1
  236. package/dist/es2020/utils/cli/utils/template-generators.js +0 -25
  237. package/dist/es2020/utils/cli/utils/template-generators.js.map +0 -1
  238. package/dist/es2020/utils/dotenv.helpers.js +0 -37
  239. package/dist/es2020/utils/dotenv.helpers.js.map +0 -1
  240. package/dist/es2020/utils/features/api.features.js +0 -154
  241. package/dist/es2020/utils/features/api.features.js.map +0 -1
  242. package/dist/es2020/utils/features/change-case.features.js +0 -31
  243. package/dist/es2020/utils/features/change-case.features.js.map +0 -1
  244. package/dist/es2020/utils/helpers/api.features.helpers.js +0 -103
  245. package/dist/es2020/utils/helpers/api.features.helpers.js.map +0 -1
  246. package/dist/es2020/utils/helpers/change-case.helpers.js +0 -161
  247. package/dist/es2020/utils/helpers/change-case.helpers.js.map +0 -1
  248. package/dist/es2020/utils/helpers/deepmerge.helper.js +0 -113
  249. package/dist/es2020/utils/helpers/deepmerge.helper.js.map +0 -1
  250. package/dist/es2020/utils/helpers/fs.helpers.js +0 -45
  251. package/dist/es2020/utils/helpers/fs.helpers.js.map +0 -1
  252. package/dist/es2020/utils/helpers/global.helpers.js +0 -4
  253. package/dist/es2020/utils/helpers/global.helpers.js.map +0 -1
  254. package/dist/es2020/utils/helpers/models.helpers.js +0 -276
  255. package/dist/es2020/utils/helpers/models.helpers.js.map +0 -1
  256. package/dist/es2020/utils/helpers/prisma.helpers.js +0 -41
  257. package/dist/es2020/utils/helpers/prisma.helpers.js.map +0 -1
  258. package/dist/es2020/utils/helpers/query-parser.helpers.js +0 -40
  259. package/dist/es2020/utils/helpers/query-parser.helpers.js.map +0 -1
  260. package/dist/es2020/utils/helpers/text.helpers.js +0 -22
  261. package/dist/es2020/utils/helpers/text.helpers.js.map +0 -1
  262. package/dist/es2020/utils/validate-dto.js +0 -11
  263. package/dist/es2020/utils/validate-dto.js.map +0 -1
  264. package/dist/es2020/utils/validate-schema.js +0 -9
  265. package/dist/es2020/utils/validate-schema.js.map +0 -1
@@ -1,161 +0,0 @@
1
- import { singular, plural } from "pluralize";
2
- import { kebabCase } from "../../../../exports/utils";
3
- import { importPrismaModelModules } from "../../../../utils/helpers/models.helpers";
4
- import authService from "../../../auth/auth.service";
5
- import { BaseController } from "../../base.controller";
6
- import { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, sendResponse, } from "../../base.middlewares";
7
- import catchAsync from "../../../error-handler/utils/catch-async";
8
- export function setupRouters(models, router, arkosConfigs) {
9
- return models.map(async (model) => {
10
- const modelNameInKebab = kebabCase(model);
11
- const modelModules = await importPrismaModelModules(modelNameInKebab);
12
- const { middlewares, authConfigs, prismaQueryOptions, router: customRouterModule, dtos, schemas, } = modelModules;
13
- const routeName = plural(modelNameInKebab);
14
- const controller = new BaseController(model);
15
- const routerConfig = customRouterModule?.config;
16
- const disableConfig = routerConfig?.disable || {};
17
- const isCompletelyDisabled = disableConfig === true;
18
- const customRouter = customRouterModule || {};
19
- const hasCustomImplementation = (path, method) => {
20
- return customRouter.stack?.some((layer) => (layer.path === `/api/${path}` ||
21
- layer.path === `api/${path}` ||
22
- layer.path === `api/${path}/` ||
23
- layer.path === `/api/${path}/`) &&
24
- layer.method.toLowerCase() === method.toLowerCase());
25
- };
26
- const isEndpointDisabled = (endpoint) => {
27
- if (isCompletelyDisabled)
28
- return true;
29
- return typeof disableConfig === "object" && !!disableConfig[endpoint];
30
- };
31
- const getValidationSchemaOrDto = (key) => {
32
- const validationConfigs = arkosConfigs?.validation;
33
- if (validationConfigs?.resolver === "class-validator") {
34
- return dtos?.[key];
35
- }
36
- else if (validationConfigs?.resolver === "zod") {
37
- return schemas?.[key];
38
- }
39
- return undefined;
40
- };
41
- if (customRouterModule?.default && !customRouterModule?.config?.disable)
42
- router.use(`/${routeName}`, customRouterModule.default);
43
- function safeCatchAsync(middleware) {
44
- return middleware ? catchAsync(middleware) : undefined;
45
- }
46
- if (!isEndpointDisabled("createOne") &&
47
- !hasCustomImplementation(`/${routeName}`, "post")) {
48
- router.post(`/${routeName}`, authService.handleAuthenticationControl("Create", authConfigs?.authenticationControl), authService.handleAccessControl("Create", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("create")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "createOne"), ...[
49
- safeCatchAsync(middlewares?.beforeCreateOne) || controller.createOne,
50
- safeCatchAsync(middlewares?.beforeCreateOne)
51
- ? controller.createOne
52
- : safeCatchAsync(middlewares?.afterCreateOne) || sendResponse,
53
- safeCatchAsync(middlewares?.beforeCreateOne) &&
54
- safeCatchAsync(middlewares?.afterCreateOne)
55
- ? safeCatchAsync(middlewares?.afterCreateOne)
56
- : sendResponse,
57
- ].filter((m) => !!m), sendResponse);
58
- }
59
- if (!isEndpointDisabled("findMany") &&
60
- !hasCustomImplementation(`/${routeName}`, "get")) {
61
- router.get(`/${routeName}`, authService.handleAuthenticationControl("View", authConfigs?.authenticationControl), authService.handleAccessControl("View", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), addPrismaQueryOptionsToRequest(prismaQueryOptions, "findMany"), ...[
62
- safeCatchAsync(middlewares?.beforeFindMany) || controller.findMany,
63
- safeCatchAsync(middlewares?.beforeFindMany)
64
- ? controller.findMany
65
- : safeCatchAsync(middlewares?.afterFindMany) || sendResponse,
66
- safeCatchAsync(middlewares?.beforeFindMany) &&
67
- safeCatchAsync(middlewares?.afterFindMany)
68
- ? safeCatchAsync(middlewares?.afterFindMany)
69
- : sendResponse,
70
- sendResponse,
71
- ].filter((m) => !!m));
72
- }
73
- if (!isEndpointDisabled("createMany") &&
74
- !hasCustomImplementation(`/${routeName}/many`, "post")) {
75
- router.post(`/${routeName}/many`, authService.handleAuthenticationControl("Create", authConfigs?.authenticationControl), authService.handleAccessControl("Create", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("createMany")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "createMany"), ...[
76
- safeCatchAsync(middlewares?.beforeCreateMany) ||
77
- controller.createMany,
78
- safeCatchAsync(middlewares?.beforeCreateMany)
79
- ? controller.createMany
80
- : safeCatchAsync(middlewares?.afterCreateMany) || sendResponse,
81
- safeCatchAsync(middlewares?.beforeCreateMany) &&
82
- safeCatchAsync(middlewares?.afterCreateMany)
83
- ? safeCatchAsync(middlewares?.afterCreateMany)
84
- : sendResponse,
85
- sendResponse,
86
- ].filter((m) => !!m));
87
- }
88
- if (!isEndpointDisabled("updateMany") &&
89
- !hasCustomImplementation(`/${routeName}/many`, "patch")) {
90
- router.patch(`/${routeName}/many`, authService.handleAuthenticationControl("Update", authConfigs?.authenticationControl), authService.handleAccessControl("Update", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("updateMany")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updateMany"), ...[
91
- safeCatchAsync(middlewares?.beforeUpdateMany) ||
92
- controller.updateMany,
93
- safeCatchAsync(middlewares?.beforeUpdateMany)
94
- ? controller.updateMany
95
- : safeCatchAsync(middlewares?.afterUpdateMany) || sendResponse,
96
- safeCatchAsync(middlewares?.beforeUpdateMany) &&
97
- safeCatchAsync(middlewares?.afterUpdateMany)
98
- ? safeCatchAsync(middlewares?.afterUpdateMany)
99
- : sendResponse,
100
- sendResponse,
101
- ].filter((m) => !!m));
102
- }
103
- if (!isEndpointDisabled("deleteMany") &&
104
- !hasCustomImplementation(`/${routeName}/many`, "delete")) {
105
- router.delete(`/${routeName}/many`, authService.handleAuthenticationControl("Delete", authConfigs?.authenticationControl), authService.handleAccessControl("Delete", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("deleteMany")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "deleteMany"), ...[
106
- safeCatchAsync(middlewares?.beforeDeleteMany) ||
107
- controller.deleteMany,
108
- safeCatchAsync(middlewares?.beforeDeleteMany)
109
- ? controller.deleteMany
110
- : safeCatchAsync(middlewares?.afterDeleteMany) || sendResponse,
111
- safeCatchAsync(middlewares?.beforeDeleteMany) &&
112
- safeCatchAsync(middlewares?.afterDeleteMany)
113
- ? safeCatchAsync(middlewares?.afterDeleteMany)
114
- : sendResponse,
115
- sendResponse,
116
- ].filter((middleware) => !!middleware));
117
- }
118
- if (!isEndpointDisabled("findOne") &&
119
- !hasCustomImplementation(`/${routeName}/:id`, "get")) {
120
- router.get(`/${routeName}/:id`, authService.handleAuthenticationControl("View", authConfigs?.authenticationControl), authService.handleAccessControl("View", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("findOne")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "findOne"), ...[
121
- safeCatchAsync(middlewares?.beforeFindOne) || controller.findOne,
122
- safeCatchAsync(middlewares?.beforeFindOne)
123
- ? controller.findOne
124
- : safeCatchAsync(middlewares?.afterFindOne) || sendResponse,
125
- safeCatchAsync(middlewares?.beforeFindOne) &&
126
- safeCatchAsync(middlewares?.afterFindOne)
127
- ? safeCatchAsync(middlewares?.afterFindOne)
128
- : sendResponse,
129
- sendResponse,
130
- ].filter((m) => !!m));
131
- }
132
- if (!isEndpointDisabled("updateOne") &&
133
- !hasCustomImplementation(`/${routeName}/:id`, "patch")) {
134
- router.patch(`/${routeName}/:id`, authService.handleAuthenticationControl("Update", authConfigs?.authenticationControl), authService.handleAccessControl("Update", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("update")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updateOne"), ...[
135
- safeCatchAsync(middlewares?.beforeUpdateOne) || controller.updateOne,
136
- safeCatchAsync(middlewares?.beforeUpdateOne)
137
- ? controller.updateOne
138
- : safeCatchAsync(middlewares?.afterUpdateOne) || sendResponse,
139
- safeCatchAsync(middlewares?.beforeUpdateOne) &&
140
- safeCatchAsync(middlewares?.afterUpdateOne)
141
- ? safeCatchAsync(middlewares?.afterUpdateOne)
142
- : sendResponse,
143
- ].filter((m) => !!m), sendResponse);
144
- }
145
- if (!isEndpointDisabled("deleteOne") &&
146
- !hasCustomImplementation(`/${routeName}/:id`, "delete")) {
147
- router.delete(`/${routeName}/:id`, authService.handleAuthenticationControl("Delete", authConfigs?.authenticationControl), authService.handleAccessControl("Delete", kebabCase(singular(modelNameInKebab)), authConfigs?.accessControl || {}), handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("delete")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "deleteOne"), ...[
148
- safeCatchAsync(middlewares?.beforeDeleteOne) || controller.deleteOne,
149
- safeCatchAsync(middlewares?.beforeDeleteOne)
150
- ? controller.deleteOne
151
- : safeCatchAsync(middlewares?.afterDeleteOne) || sendResponse,
152
- safeCatchAsync(middlewares?.beforeDeleteOne) &&
153
- safeCatchAsync(middlewares?.afterDeleteOne)
154
- ? safeCatchAsync(middlewares?.afterDeleteOne)
155
- : sendResponse,
156
- sendResponse,
157
- ].filter((m) => !!m));
158
- }
159
- });
160
- }
161
- //# sourceMappingURL=base.router.helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.router.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.router.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { singular, plural } from \"pluralize\";\nimport { ArkosConfig, RouterConfig } from \"../../../../exports\";\nimport { kebabCase } from \"../../../../exports/utils\";\nimport { PrismaQueryOptions } from \"../../../../types\";\nimport { RouterEndpoint } from \"../../../../types/router-config\";\nimport { importPrismaModelModules } from \"../../../../utils/helpers/models.helpers\";\nimport authService from \"../../../auth/auth.service\";\nimport { BaseController } from \"../../base.controller\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../../base.middlewares\";\nimport catchAsync from \"../../../error-handler/utils/catch-async\";\n\nexport function setupRouters(\n models: string[],\n router: Router,\n arkosConfigs: ArkosConfig\n) {\n return models.map(async (model) => {\n const modelNameInKebab = kebabCase(model);\n const modelModules = await importPrismaModelModules(modelNameInKebab);\n const {\n middlewares,\n authConfigs,\n prismaQueryOptions,\n router: customRouterModule,\n dtos,\n schemas,\n } = modelModules;\n\n const routeName = plural(modelNameInKebab);\n const controller = new BaseController(model);\n\n // Check for router customization/disabling\n const routerConfig: RouterConfig = customRouterModule?.config;\n const disableConfig = routerConfig?.disable || {};\n const isCompletelyDisabled = disableConfig === true;\n\n // Check if custom implementation exists\n const customRouter = (customRouterModule as Router) || {};\n const hasCustomImplementation = (path: string, method: string) => {\n return customRouter.stack?.some(\n (layer) =>\n (layer.path === `/api/${path}` ||\n layer.path === `api/${path}` ||\n layer.path === `api/${path}/` ||\n layer.path === `/api/${path}/`) &&\n layer.method.toLowerCase() === method.toLowerCase()\n );\n };\n\n // Helper to determine if an endpoint should be disabled\n const isEndpointDisabled = (endpoint: RouterEndpoint): boolean => {\n if (isCompletelyDisabled) return true;\n return typeof disableConfig === \"object\" && !!disableConfig[endpoint];\n };\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (\n key: keyof typeof dtos | keyof typeof schemas\n ) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n // If the custom router has its own routes, add them\n if (customRouterModule?.default && !customRouterModule?.config?.disable)\n router.use(`/${routeName}`, customRouterModule.default);\n\n function safeCatchAsync(middleware: any) {\n return middleware ? catchAsync(middleware) : undefined;\n }\n\n // POST /{routeName} - Create One\n if (\n !isEndpointDisabled(\"createOne\") &&\n !hasCustomImplementation(`/${routeName}`, \"post\")\n ) {\n router.post(\n `/${routeName}`,\n authService.handleAuthenticationControl(\n \"Create\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Create\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"create\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createOne\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeCreateOne) || controller.createOne,\n safeCatchAsync(middlewares?.beforeCreateOne)\n ? controller.createOne\n : safeCatchAsync(middlewares?.afterCreateOne) || sendResponse,\n safeCatchAsync(middlewares?.beforeCreateOne) &&\n safeCatchAsync(middlewares?.afterCreateOne)\n ? safeCatchAsync(middlewares?.afterCreateOne)\n : sendResponse,\n ].filter((m) => !!m),\n sendResponse\n );\n }\n\n // GET /{routeName} - Find Many\n if (\n !isEndpointDisabled(\"findMany\") &&\n !hasCustomImplementation(`/${routeName}`, \"get\")\n ) {\n router.get(\n `/${routeName}`,\n authService.handleAuthenticationControl(\n \"View\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"View\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findMany\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeFindMany) || controller.findMany,\n safeCatchAsync(middlewares?.beforeFindMany)\n ? controller.findMany\n : safeCatchAsync(middlewares?.afterFindMany) || sendResponse,\n safeCatchAsync(middlewares?.beforeFindMany) &&\n safeCatchAsync(middlewares?.afterFindMany)\n ? safeCatchAsync(middlewares?.afterFindMany)\n : sendResponse,\n sendResponse,\n ].filter((m) => !!m)\n );\n }\n\n // POST /{routeName}/many - Create Many\n if (\n !isEndpointDisabled(\"createMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"post\")\n ) {\n router.post(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(\n \"Create\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Create\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"createMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createMany\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeCreateMany) ||\n controller.createMany,\n safeCatchAsync(middlewares?.beforeCreateMany)\n ? controller.createMany\n : safeCatchAsync(middlewares?.afterCreateMany) || sendResponse,\n safeCatchAsync(middlewares?.beforeCreateMany) &&\n safeCatchAsync(middlewares?.afterCreateMany)\n ? safeCatchAsync(middlewares?.afterCreateMany)\n : sendResponse,\n sendResponse,\n ].filter((m) => !!m)\n );\n }\n\n // PATCH /{routeName}/many - Update Many\n if (\n !isEndpointDisabled(\"updateMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(\n \"Update\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Update\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateMany\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeUpdateMany) ||\n controller.updateMany,\n safeCatchAsync(middlewares?.beforeUpdateMany)\n ? controller.updateMany\n : safeCatchAsync(middlewares?.afterUpdateMany) || sendResponse,\n safeCatchAsync(middlewares?.beforeUpdateMany) &&\n safeCatchAsync(middlewares?.afterUpdateMany)\n ? safeCatchAsync(middlewares?.afterUpdateMany)\n : sendResponse,\n sendResponse,\n ].filter((m) => !!m)\n );\n }\n\n // DELETE /{routeName}/many - Delete Many\n if (\n !isEndpointDisabled(\"deleteMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(\n \"Delete\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Delete\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"deleteMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteMany\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeDeleteMany) ||\n controller.deleteMany,\n safeCatchAsync(middlewares?.beforeDeleteMany)\n ? controller.deleteMany\n : safeCatchAsync(middlewares?.afterDeleteMany) || sendResponse,\n safeCatchAsync(middlewares?.beforeDeleteMany) &&\n safeCatchAsync(middlewares?.afterDeleteMany)\n ? safeCatchAsync(middlewares?.afterDeleteMany)\n : sendResponse,\n sendResponse,\n ].filter((middleware) => !!middleware)\n );\n }\n\n // GET /{routeName}/:id - Find One\n if (\n !isEndpointDisabled(\"findOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"get\")\n ) {\n router.get(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(\n \"View\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"View\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"findOne\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findOne\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeFindOne) || controller.findOne,\n safeCatchAsync(middlewares?.beforeFindOne)\n ? controller.findOne\n : safeCatchAsync(middlewares?.afterFindOne) || sendResponse,\n safeCatchAsync(middlewares?.beforeFindOne) &&\n safeCatchAsync(middlewares?.afterFindOne)\n ? safeCatchAsync(middlewares?.afterFindOne)\n : sendResponse,\n sendResponse,\n ].filter((m) => !!m)\n );\n }\n\n // PATCH /{routeName}/:id - Update One\n if (\n !isEndpointDisabled(\"updateOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(\n \"Update\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Update\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"update\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateOne\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeUpdateOne) || controller.updateOne,\n safeCatchAsync(middlewares?.beforeUpdateOne)\n ? controller.updateOne\n : safeCatchAsync(middlewares?.afterUpdateOne) || sendResponse,\n safeCatchAsync(middlewares?.beforeUpdateOne) &&\n safeCatchAsync(middlewares?.afterUpdateOne)\n ? safeCatchAsync(middlewares?.afterUpdateOne)\n : sendResponse,\n ].filter((m) => !!m),\n sendResponse\n );\n }\n\n // DELETE /{routeName}/:id - Delete One\n if (\n !isEndpointDisabled(\"deleteOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(\n \"Delete\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Delete\",\n kebabCase(singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"delete\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteOne\"\n ),\n ...[\n safeCatchAsync(middlewares?.beforeDeleteOne) || controller.deleteOne,\n safeCatchAsync(middlewares?.beforeDeleteOne)\n ? controller.deleteOne\n : safeCatchAsync(middlewares?.afterDeleteOne) || sendResponse,\n safeCatchAsync(middlewares?.beforeDeleteOne) &&\n safeCatchAsync(middlewares?.afterDeleteOne)\n ? safeCatchAsync(middlewares?.afterDeleteOne)\n : sendResponse,\n sendResponse,\n ].filter((m) => !!m)\n );\n }\n });\n}\n"]}
@@ -1,165 +0,0 @@
1
- import { getPrismaModelRelations, getModelUniqueFields, } from "../../../../utils/helpers/models.helpers";
2
- export function removeApiAction(obj) {
3
- if (!obj || typeof obj !== "object")
4
- return obj;
5
- const result = {};
6
- for (const [key, value] of Object.entries(obj)) {
7
- if (key === "apiAction")
8
- continue;
9
- if (Array.isArray(value)) {
10
- result[key] = value.map((item) => typeof item === "object" && item !== null ? removeApiAction(item) : item);
11
- }
12
- else if (typeof value === "object" && value !== null) {
13
- result[key] = removeApiAction(value);
14
- }
15
- else {
16
- result[key] = value;
17
- }
18
- }
19
- return result;
20
- }
21
- export function isPrismaRelationFormat(obj) {
22
- if (!obj || typeof obj !== "object")
23
- return false;
24
- const prismaOperations = [
25
- "create",
26
- "connect",
27
- "update",
28
- "delete",
29
- "disconnect",
30
- "deleteMany",
31
- "connectOrCreate",
32
- "upsert",
33
- "set",
34
- ];
35
- return prismaOperations.some((op) => op in obj);
36
- }
37
- export function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
38
- let mutableBody = { ...body };
39
- relationFields?.list?.forEach((field) => {
40
- if (!body[field.name])
41
- return;
42
- if (isPrismaRelationFormat(body[field.name])) {
43
- return;
44
- }
45
- if (!Array.isArray(body[field.name])) {
46
- return;
47
- }
48
- const createData = [];
49
- const connectData = [];
50
- const updateData = [];
51
- const disconnectData = [];
52
- const deleteManyIds = [];
53
- body[field.name]?.forEach((bodyField) => {
54
- if (ignoreActions?.includes?.(bodyField?.apiAction))
55
- return;
56
- const apiAction = bodyField?.apiAction;
57
- if (apiAction === "delete") {
58
- deleteManyIds.push(bodyField.id);
59
- }
60
- else if (apiAction === "disconnect") {
61
- disconnectData.push({ id: bodyField.id });
62
- }
63
- else if (canBeUsedToConnect(field.type, bodyField)) {
64
- const { apiAction: _, ...cleanedData } = bodyField;
65
- connectData.push(cleanedData);
66
- }
67
- else if (!bodyField?.id) {
68
- let nestedRelations = getPrismaModelRelations(field.type);
69
- let dataToPush = { ...bodyField };
70
- if (nestedRelations) {
71
- dataToPush = handleRelationFieldsInBody(dataToPush, nestedRelations, ignoreActions);
72
- }
73
- if ("apiAction" in dataToPush) {
74
- const { apiAction: _, ...rest } = dataToPush;
75
- dataToPush = rest;
76
- }
77
- createData.push(dataToPush);
78
- }
79
- else {
80
- const { id, apiAction: _, ...data } = bodyField;
81
- let nestedRelations = getPrismaModelRelations(field.type);
82
- let dataToPush = data;
83
- if (nestedRelations) {
84
- dataToPush = handleRelationFieldsInBody(data, nestedRelations, ignoreActions);
85
- }
86
- updateData.push({
87
- where: { id },
88
- data: dataToPush,
89
- });
90
- }
91
- });
92
- mutableBody[field.name] = {
93
- ...(createData.length ? { create: createData } : {}),
94
- ...(connectData.length ? { connect: connectData } : {}),
95
- ...(updateData.length ? { update: updateData } : {}),
96
- ...(disconnectData.length ? { disconnect: disconnectData } : {}),
97
- ...(deleteManyIds.length
98
- ? { deleteMany: { id: { in: deleteManyIds } } }
99
- : {}),
100
- };
101
- });
102
- relationFields?.singular?.forEach((field) => {
103
- if (!body[field.name])
104
- return;
105
- if (ignoreActions?.includes?.(body[field.name]?.apiAction))
106
- return;
107
- if (isPrismaRelationFormat(body[field.name])) {
108
- return;
109
- }
110
- const relationData = body[field.name];
111
- let nestedRelations = getPrismaModelRelations(field.type);
112
- if (canBeUsedToConnect(field.type, relationData)) {
113
- const { apiAction: _, ...cleanedData } = relationData;
114
- mutableBody[field.name] = { connect: cleanedData };
115
- }
116
- else if (!relationData?.id) {
117
- let dataToCreate = { ...relationData };
118
- if ("apiAction" in dataToCreate) {
119
- const { apiAction: _, ...rest } = dataToCreate;
120
- dataToCreate = rest;
121
- }
122
- if (nestedRelations) {
123
- dataToCreate = handleRelationFieldsInBody(dataToCreate, nestedRelations, ignoreActions);
124
- }
125
- mutableBody[field.name] = { create: dataToCreate };
126
- }
127
- else {
128
- const { id, apiAction: _, ...data } = relationData;
129
- let dataToUpdate = data;
130
- if (nestedRelations) {
131
- dataToUpdate = handleRelationFieldsInBody(data, nestedRelations, ignoreActions);
132
- }
133
- mutableBody[field.name] = {
134
- update: {
135
- data: dataToUpdate,
136
- },
137
- };
138
- }
139
- });
140
- if ("apiAction" in mutableBody) {
141
- const { apiAction, ...rest } = mutableBody;
142
- mutableBody = rest;
143
- }
144
- return removeApiAction(mutableBody);
145
- }
146
- export function canBeUsedToConnect(modelName, bodyField) {
147
- if (!bodyField)
148
- return false;
149
- if (bodyField.apiAction && !["connect"]?.includes?.(bodyField.apiAction)) {
150
- return false;
151
- }
152
- if (bodyField.apiAction === "connect") {
153
- return true;
154
- }
155
- if (Object.keys(bodyField)?.length === 1 && bodyField?.id) {
156
- return true;
157
- }
158
- const uniqueFields = getModelUniqueFields(modelName);
159
- if (Object.keys(bodyField).length === 1) {
160
- const fieldName = Object.keys(bodyField)[0];
161
- return uniqueFields?.some((field) => field.name === fieldName);
162
- }
163
- return false;
164
- }
165
- //# sourceMappingURL=base.service.helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.service.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.service.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getPrismaModelRelations,\n RelationFields,\n getModelUniqueFields,\n} from \"../../../../utils/helpers/models.helpers\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nexport function removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Common Prisma relation operations\n const prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n ];\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => op in obj);\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {Object} relationFields - Defines relation field types.\n * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).\n * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: RelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body[field.name]) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n // Skip if the field is not an array (likely already handled manually)\n if (!Array.isArray(body[field.name])) {\n return;\n }\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions?.includes?.(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (canBeUsedToConnect(field.type, bodyField)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = bodyField;\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n // If no ID, assume create operation\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (\"apiAction\" in dataToPush) {\n const { apiAction: _, ...rest } = dataToPush;\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = bodyField;\n\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = data;\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n updateData.push({\n where: { id },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body[field.name]) return;\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getPrismaModelRelations(field.type);\n\n if (canBeUsedToConnect(field.type, relationData)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = relationData;\n mutableBody[field.name] = { connect: cleanedData };\n } else if (!relationData?.id) {\n // If no ID, assume create operation\n let dataToCreate = { ...relationData };\n\n if (\"apiAction\" in dataToCreate) {\n const { apiAction: _, ...rest } = dataToCreate;\n dataToCreate = rest;\n }\n\n if (nestedRelations) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = relationData;\n\n let dataToUpdate = data;\n if (nestedRelations) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (\"apiAction\" in mutableBody) {\n const { apiAction, ...rest } = mutableBody;\n mutableBody = rest;\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n // If the field is null or undefined, it can't be used to connect\n if (!bodyField) return false;\n\n // If the field has an apiAction that's not for connecting, return false\n if (bodyField.apiAction && ![\"connect\"]?.includes?.(bodyField.apiAction)) {\n return false;\n }\n\n // If explicitly marked for connect, allow it\n if (bodyField.apiAction === \"connect\") {\n return true;\n }\n\n // If only ID is present, it can be used to connect\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) {\n return true;\n }\n\n // Get unique fields for the model\n const uniqueFields = getModelUniqueFields(modelName);\n\n // If the field has exactly one property and it's a unique field, it can be used to connect\n if (Object.keys(bodyField).length === 1) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field) => field.name === fieldName);\n }\n\n return false;\n}\n"]}
@@ -1,97 +0,0 @@
1
- import nodemailer from "nodemailer";
2
- import { convert } from "html-to-text";
3
- import { getArkosConfig } from "../../server";
4
- import AppError from "../error-handler/utils/app-error";
5
- export class EmailService {
6
- constructor(config) {
7
- this.transporter = null;
8
- this.customConfig = null;
9
- if (config) {
10
- this.customConfig = config;
11
- }
12
- }
13
- getEmailConfig() {
14
- if (this.customConfig) {
15
- return this.customConfig;
16
- }
17
- const { email: emailConfigs } = getArkosConfig();
18
- if (!emailConfigs) {
19
- throw new AppError("You are trying to use emailService without setting arkosConfig.email configurations", 500, {
20
- docs: "Read more about emailService at https://www.arkosjs.com/docs/core-concepts/sending-emails",
21
- });
22
- }
23
- return {
24
- host: emailConfigs.host,
25
- port: emailConfigs.port || 465,
26
- secure: emailConfigs.secure !== undefined ? emailConfigs.secure : true,
27
- auth: {
28
- user: emailConfigs.auth?.user,
29
- pass: emailConfigs.auth?.pass,
30
- },
31
- name: emailConfigs.name,
32
- };
33
- }
34
- getTransporter(customConfig) {
35
- if (customConfig) {
36
- const defaultConfig = this.getEmailConfig();
37
- return nodemailer.createTransport({
38
- host: customConfig.host || defaultConfig.host,
39
- port: customConfig.port || defaultConfig.port,
40
- secure: customConfig.secure !== undefined
41
- ? customConfig.secure
42
- : defaultConfig.secure,
43
- auth: customConfig.auth || defaultConfig.auth,
44
- });
45
- }
46
- if (!this.transporter) {
47
- const config = this.getEmailConfig();
48
- this.transporter = nodemailer.createTransport({
49
- host: config.host,
50
- port: config.port,
51
- secure: config.secure,
52
- auth: config.auth,
53
- });
54
- }
55
- return this.transporter;
56
- }
57
- async send(options, connectionOptions, skipVerification = false) {
58
- const config = this.getEmailConfig();
59
- const transporter = connectionOptions
60
- ? this.getTransporter(connectionOptions)
61
- : this.getTransporter();
62
- const fromAddress = options.from || connectionOptions?.auth?.user || config.auth?.user;
63
- if (connectionOptions || !skipVerification) {
64
- const isConnected = await this.verifyConnection(transporter);
65
- if (!isConnected) {
66
- throw new Error("Failed to connect to email server");
67
- }
68
- }
69
- const info = await transporter.sendMail({
70
- ...options,
71
- from: fromAddress,
72
- text: options?.text || convert(options.html),
73
- });
74
- return { success: true, messageId: info.messageId };
75
- }
76
- async verifyConnection(transporterToVerify) {
77
- try {
78
- const transporter = transporterToVerify || this.getTransporter();
79
- await transporter.verify();
80
- return true;
81
- }
82
- catch (error) {
83
- console.error("Email Server Connection Failed", error);
84
- return false;
85
- }
86
- }
87
- updateConfig(config) {
88
- this.customConfig = config;
89
- this.transporter = null;
90
- }
91
- static create(config) {
92
- return new EmailService(config);
93
- }
94
- }
95
- const emailService = new EmailService();
96
- export default emailService;
97
- //# sourceMappingURL=email.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../../../src/modules/email/email.service.ts"],"names":[],"mappings":"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","sourcesContent":["import nodemailer, { Transporter } from \"nodemailer\";\nimport { convert } from \"html-to-text\";\nimport { getArkosConfig } from \"../../server\";\nimport AppError from \"../error-handler/utils/app-error\";\n\n/**\n * Defines the options for sending an email.\n */\nexport type EmailOptions = {\n from?: string; // Sender's email address (optional).\n to: string | string[]; // Recipient's email address or an array of email addresses.\n subject: string; // Subject of the email.\n text?: string; // Plain text body of the email (optional).\n html: string; // HTML body of the email.\n};\n\n/**\n * Defines the authentication options for SMTP.\n */\nexport type SMTPAuthOptions = {\n user: string;\n pass: string;\n};\n\n/**\n * Defines the connection options for SMTP server.\n */\nexport type SMTPConnectionOptions = {\n host?: string;\n port?: number;\n secure?: boolean;\n auth?: SMTPAuthOptions;\n name?: string;\n};\n\n/**\n * A service class to handle email-related tasks, including sending emails.\n *\n * See the api reference [www.arkosjs.com/docs/api-reference/the-email-service-class](https://www.arkosjs.com/docs/api-reference/the-email-service-class)\n */\nexport class EmailService {\n private transporter: Transporter | null = null;\n private customConfig: SMTPConnectionOptions | null = null;\n\n /**\n * Creates an instance of the EmailService class.\n *\n * @param {SMTPConnectionOptions} [config] - Optional custom SMTP configuration.\n * If provided, these settings will be used instead of the Arkos config.\n */\n constructor(config?: SMTPConnectionOptions) {\n if (config) {\n this.customConfig = config;\n }\n }\n\n /**\n * Gets the email configuration, either from constructor-provided config or ArkosConfig\n * @returns Configuration object with host, port, and auth details\n * @throws AppError if email configuration is not set\n */\n private getEmailConfig(): SMTPConnectionOptions {\n // If custom config was provided through constructor, use it\n if (this.customConfig) {\n return this.customConfig;\n }\n\n // Otherwise, get from Arkos config\n const { email: emailConfigs } = getArkosConfig();\n\n if (!emailConfigs) {\n throw new AppError(\n \"You are trying to use emailService without setting arkosConfig.email configurations\",\n 500,\n {\n docs: \"Read more about emailService at https://www.arkosjs.com/docs/core-concepts/sending-emails\",\n }\n );\n }\n\n return {\n host: emailConfigs.host,\n port: emailConfigs.port || 465,\n secure: emailConfigs.secure !== undefined ? emailConfigs.secure : true,\n auth: {\n user: emailConfigs.auth?.user,\n pass: emailConfigs.auth?.pass,\n },\n name: emailConfigs.name,\n };\n }\n\n /**\n * Gets or creates a transporter using provided config or default config\n * @param customConfig Optional override connection settings\n * @returns A configured nodemailer transporter\n */\n private getTransporter(customConfig?: SMTPConnectionOptions): Transporter {\n if (customConfig) {\n // Create temporary transporter with custom settings\n const defaultConfig = this.getEmailConfig();\n return nodemailer.createTransport({\n host: customConfig.host || defaultConfig.host,\n port: customConfig.port || defaultConfig.port,\n secure:\n customConfig.secure !== undefined\n ? customConfig.secure\n : defaultConfig.secure,\n auth: customConfig.auth || defaultConfig.auth,\n });\n }\n\n // Use cached transporter or create new one with default settings\n if (!this.transporter) {\n const config = this.getEmailConfig();\n this.transporter = nodemailer.createTransport({\n host: config.host,\n port: config.port,\n secure: config.secure,\n auth: config.auth,\n });\n }\n\n return this.transporter;\n }\n\n /**\n * Sends an email with the provided options.\n * Can use either the default configuration or custom connection options.\n *\n * @param {EmailOptions} options - The options for the email to be sent.\n * @param {SMTPConnectionOptions} [connectionOptions] - Optional custom connection settings.\n * @param {boolean} [skipVerification=false] - Whether to skip connection verification.\n * @returns {Promise<{ success: boolean; messageId?: string }>} Result with message ID on success.\n */\n public async send(\n options: EmailOptions,\n connectionOptions?: SMTPConnectionOptions,\n skipVerification = false\n ): Promise<{ success: boolean; messageId?: string }> {\n const config = this.getEmailConfig();\n const transporter = connectionOptions\n ? this.getTransporter(connectionOptions)\n : this.getTransporter();\n\n // Determine from address with proper fallbacks\n const fromAddress =\n options.from || connectionOptions?.auth?.user || config.auth?.user;\n\n // Optionally verify connection\n if (connectionOptions || !skipVerification) {\n const isConnected = await this.verifyConnection(transporter);\n\n if (!isConnected) {\n throw new Error(\"Failed to connect to email server\");\n }\n }\n\n // Send the email\n const info = await transporter.sendMail({\n ...options,\n from: fromAddress,\n text: options?.text || convert(options.html),\n });\n\n return { success: true, messageId: info.messageId };\n }\n\n /**\n * Verifies the connection to the email server.\n * @param {Transporter} [transporterToVerify] - Optional transporter to verify.\n * @returns {Promise<boolean>} A promise that resolves to true if connection is valid.\n */\n public async verifyConnection(\n transporterToVerify?: Transporter\n ): Promise<boolean> {\n try {\n const transporter = transporterToVerify || this.getTransporter();\n await transporter.verify();\n return true;\n } catch (error) {\n console.error(\"Email Server Connection Failed\", error);\n return false;\n }\n }\n\n /**\n * Updates the custom configuration for this email service instance.\n * @param {SMTPConnectionOptions} config - The new connection options.\n */\n public updateConfig(config: SMTPConnectionOptions): void {\n this.customConfig = config;\n this.transporter = null; // Reset transporter so it will be recreated with new config\n }\n\n /**\n * Creates a new instance of EmailService with custom configuration.\n * @param {SMTPConnectionOptions} config - The connection options for the new instance.\n * @returns {EmailService} A new EmailService instance.\n */\n public static create(config: SMTPConnectionOptions): EmailService {\n return new EmailService(config);\n }\n}\n\n// Create default instance\nconst emailService = new EmailService();\nexport default emailService;\n"]}
@@ -1,105 +0,0 @@
1
- import AppError from "./utils/app-error";
2
- import * as errorControllerHelper from "./utils/error-handler.helpers";
3
- import { server } from "../../server";
4
- export default function errorHandler(err, req, res, next) {
5
- console.error("[\x1b[31mERROR\x1b[0m]:", err);
6
- err.statusCode = err.statusCode || 500;
7
- err.status = err.status || "error";
8
- if (process.env.NODE_ENV !== "production") {
9
- sendDevelopmentError(err, req, res);
10
- return;
11
- }
12
- let error = { ...err, message: err.message };
13
- if (err.name === "JsonWebTokenError")
14
- error = errorControllerHelper.handleJWTError();
15
- if (err.name === "TokenExpiredError")
16
- error = errorControllerHelper.handleJWTExpired();
17
- if (err.name === "PrismaClientValidationError")
18
- error = errorControllerHelper.handlePrismaClientValidationError(err);
19
- if (err.code === "P1000")
20
- error = errorControllerHelper.handleAuthenticationError(err);
21
- if (err.code === "P1001")
22
- error = errorControllerHelper.handleServerNotReachableError(err);
23
- if (err.code === "P1002")
24
- error = errorControllerHelper.handleConnectionTimeoutError(err);
25
- if (err.code === "P1003")
26
- error = errorControllerHelper.handleDatabaseNotFoundError(err);
27
- if (err.code === "P2000")
28
- error = errorControllerHelper.handleFieldValueTooLargeError(err);
29
- if (err.code === "P2001")
30
- error = errorControllerHelper.handleRecordNotFoundError(err);
31
- if (err.code === "P2002")
32
- error = errorControllerHelper.handleUniqueConstraintError(err);
33
- if (err.code === "P2003")
34
- error = errorControllerHelper.handleForeignKeyConstraintError(err);
35
- if (err.code === "P2004")
36
- error = errorControllerHelper.handleConstraintFailedError(err);
37
- if (err.code === "P3000")
38
- error = errorControllerHelper.handleSchemaCreationFailedError(err);
39
- if (err.code === "P3001")
40
- error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);
41
- if (err.code === "P3002")
42
- error = errorControllerHelper.handleMigrationScriptFailedError(err);
43
- if (err.code === "P3003")
44
- error = errorControllerHelper.handleVersionMismatchError(err);
45
- if (err.name === "NetworkError")
46
- error = errorControllerHelper.handleNetworkError(err);
47
- if (!error.isOperational)
48
- error = new AppError("Something went wrong!", 500);
49
- sendProductionError(error, req, res);
50
- }
51
- function sendDevelopmentError(err, req, res) {
52
- if (req.originalUrl.startsWith("/api"))
53
- res.status(err.statusCode).json({
54
- ...err,
55
- message: err.message.split("\n")[err.message.split("\n").length - 1],
56
- stack: err.stack?.split("\n"),
57
- });
58
- else
59
- res.status(err.statusCode).json({
60
- title: "Something went wrong!",
61
- message: err.message,
62
- });
63
- }
64
- function sendProductionError(err, req, res) {
65
- if (req.originalUrl.startsWith("/api")) {
66
- if (err.isOperational)
67
- res.status(err.statusCode).json({
68
- status: err.status,
69
- message: err.message,
70
- meta: err.meta || {},
71
- code: err.code || "unknown",
72
- });
73
- else
74
- res.status(500).json({
75
- status: "error",
76
- message: "Something went wrong!",
77
- });
78
- return;
79
- }
80
- if (err.isOperational) {
81
- res.status(err.statusCode).json({
82
- title: "Something went wrong!",
83
- message: err.message,
84
- });
85
- return;
86
- }
87
- res.status(err.statusCode).json({
88
- title: "Something went wrong!",
89
- message: "Please try again later.",
90
- });
91
- }
92
- process.on("SIGTERM", () => {
93
- if (process.env.NODE_ENV !== "production" &&
94
- process.env.NODE_ENV !== "staging") {
95
- process.exit();
96
- }
97
- else {
98
- console.error("SIGTERM RECEIVED in Production. Shutting down gracefully!");
99
- server.close(() => {
100
- console.error("Process terminated!!!");
101
- process.exit();
102
- });
103
- }
104
- });
105
- //# sourceMappingURL=error-handler.controller.js.map