arkos 1.3.2-canary.4 → 1.3.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +8 -4
  2. package/dist/cjs/app.js +39 -4
  3. package/dist/cjs/app.js.map +1 -1
  4. package/dist/cjs/exports/utils/index.js +5 -25
  5. package/dist/cjs/exports/utils/index.js.map +1 -1
  6. package/dist/cjs/modules/auth/auth.controller.js +18 -0
  7. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  8. package/dist/cjs/modules/auth/auth.router.js +2 -0
  9. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  10. package/dist/cjs/modules/base/base.controller.js +49 -11
  11. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  12. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  13. package/dist/cjs/modules/base/base.service.js +108 -0
  14. package/dist/cjs/modules/base/base.service.js.map +1 -1
  15. package/dist/cjs/modules/base/types/base.service.types.js.map +1 -1
  16. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +29 -14
  17. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  18. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +2 -2
  19. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  20. package/dist/cjs/modules/base/utils/router-validator.js +1 -4
  21. package/dist/cjs/modules/base/utils/router-validator.js.map +1 -1
  22. package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +1 -1
  23. package/dist/cjs/modules/debugger/debugger.service.js +82 -0
  24. package/dist/cjs/modules/debugger/debugger.service.js.map +1 -0
  25. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js +55 -0
  26. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js.map +1 -0
  27. package/dist/cjs/modules/file-upload/file-upload.controller.js +4 -0
  28. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
  29. package/dist/cjs/modules/file-upload/file-upload.router.js +3 -1
  30. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  31. package/dist/cjs/modules/swagger/swagger.router.js +2 -1
  32. package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
  33. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +2 -1
  34. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  35. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +12 -8
  36. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  37. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +3 -3
  38. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  39. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +2 -1
  40. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  41. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -3
  42. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  43. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  44. package/dist/cjs/server.js +11 -0
  45. package/dist/cjs/server.js.map +1 -1
  46. package/dist/cjs/types/arkos-config.js.map +1 -1
  47. package/dist/cjs/types/index.js.map +1 -1
  48. package/dist/cjs/utils/cli/generate.js +9 -4
  49. package/dist/cjs/utils/cli/generate.js.map +1 -1
  50. package/dist/cjs/utils/cli/prisma-generate.js +1 -2
  51. package/dist/cjs/utils/cli/prisma-generate.js.map +1 -1
  52. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  53. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js +34 -10
  54. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  55. package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js +2 -6
  56. package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -1
  57. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js +31 -36
  58. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  59. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js +0 -2
  60. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  61. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js +1 -1
  62. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  63. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +7 -10
  64. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  65. package/dist/cjs/utils/dynamic-loader.js +11 -2
  66. package/dist/cjs/utils/dynamic-loader.js.map +1 -1
  67. package/dist/cjs/utils/features/api.features.js +130 -73
  68. package/dist/cjs/utils/features/api.features.js.map +1 -1
  69. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +1 -1
  70. package/dist/cjs/utils/helpers/prisma.helpers.js +8 -4
  71. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  72. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  73. package/dist/cjs/utils/sheu.js +11 -0
  74. package/dist/cjs/utils/sheu.js.map +1 -1
  75. package/dist/esm/app.js +6 -4
  76. package/dist/esm/app.js.map +1 -1
  77. package/dist/esm/exports/utils/index.js +2 -2
  78. package/dist/esm/exports/utils/index.js.map +1 -1
  79. package/dist/esm/modules/auth/auth.controller.js +18 -0
  80. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  81. package/dist/esm/modules/auth/auth.router.js +3 -1
  82. package/dist/esm/modules/auth/auth.router.js.map +1 -1
  83. package/dist/esm/modules/base/base.controller.js +49 -11
  84. package/dist/esm/modules/base/base.controller.js.map +1 -1
  85. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  86. package/dist/esm/modules/base/base.service.js +108 -0
  87. package/dist/esm/modules/base/base.service.js.map +1 -1
  88. package/dist/esm/modules/base/types/base.service.types.js.map +1 -1
  89. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +29 -15
  90. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  91. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +2 -2
  92. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  93. package/dist/esm/modules/base/utils/router-validator.js +1 -4
  94. package/dist/esm/modules/base/utils/router-validator.js.map +1 -1
  95. package/dist/esm/modules/base/utils/service-hooks-manager.js.map +1 -1
  96. package/dist/esm/modules/debugger/debugger.service.js +77 -0
  97. package/dist/esm/modules/debugger/debugger.service.js.map +1 -0
  98. package/dist/esm/modules/debugger/utils/loaded-components-logger.js +50 -0
  99. package/dist/esm/modules/debugger/utils/loaded-components-logger.js.map +1 -0
  100. package/dist/esm/modules/file-upload/file-upload.controller.js +4 -0
  101. package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
  102. package/dist/esm/modules/file-upload/file-upload.router.js +3 -1
  103. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  104. package/dist/esm/modules/swagger/swagger.router.js +2 -1
  105. package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
  106. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +2 -1
  107. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  108. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +12 -8
  109. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  110. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +3 -3
  111. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  112. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +2 -1
  113. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  114. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -3
  115. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  116. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  117. package/dist/esm/server.js +11 -0
  118. package/dist/esm/server.js.map +1 -1
  119. package/dist/esm/types/arkos-config.js.map +1 -1
  120. package/dist/esm/types/index.js.map +1 -1
  121. package/dist/esm/utils/cli/generate.js +9 -4
  122. package/dist/esm/utils/cli/generate.js.map +1 -1
  123. package/dist/esm/utils/cli/prisma-generate.js +1 -2
  124. package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
  125. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  126. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js +34 -10
  127. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  128. package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js +2 -6
  129. package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -1
  130. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js +31 -36
  131. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  132. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js +0 -2
  133. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  134. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js +1 -1
  135. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  136. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +7 -7
  137. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  138. package/dist/esm/utils/dynamic-loader.js +11 -2
  139. package/dist/esm/utils/dynamic-loader.js.map +1 -1
  140. package/dist/esm/utils/features/api.features.js +130 -72
  141. package/dist/esm/utils/features/api.features.js.map +1 -1
  142. package/dist/esm/utils/helpers/deepmerge.helper.js.map +1 -1
  143. package/dist/esm/utils/helpers/prisma.helpers.js +8 -4
  144. package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
  145. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  146. package/dist/esm/utils/sheu.js +11 -0
  147. package/dist/esm/utils/sheu.js.map +1 -1
  148. package/dist/types/exports/utils/index.d.ts +2 -2
  149. package/dist/types/modules/base/base.controller.d.ts +2 -0
  150. package/dist/types/modules/base/base.service.d.ts +5 -0
  151. package/dist/types/modules/base/types/base.service.types.d.ts +8 -8
  152. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +3 -1
  153. package/dist/types/modules/base/utils/service-hooks-manager.d.ts +1 -1
  154. package/dist/types/modules/debugger/debugger.service.d.ts +15 -0
  155. package/dist/types/modules/debugger/utils/loaded-components-logger.d.ts +9 -0
  156. package/dist/types/types/arkos-config.d.ts +14 -0
  157. package/dist/types/types/index.d.ts +3 -0
  158. package/dist/types/utils/dynamic-loader.d.ts +33 -13
  159. package/dist/types/utils/features/api.features.d.ts +3 -5
  160. package/dist/types/utils/sheu.d.ts +8 -0
  161. package/package.json +1 -1
@@ -1 +1 @@
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 pluralize from \"pluralize\";\nimport { ArkosConfig, RouterConfig } from \"../../../../exports\";\nimport { kebabCase } from \"../../../../exports/utils\";\nimport { PrismaQueryOptions } from \"../../../../types\";\nimport {\n AuthRouterEndpoint,\n FileUploadRouterEndpoint,\n RouterEndpoint,\n} from \"../../../../types/router-config\";\nimport { getModuleComponents } from \"../../../../utils/dynamic-loader\";\nimport authService from \"../../../auth/auth.service\";\nimport { BaseController } from \"../../base.controller\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../../base.middlewares\";\nimport { processMiddleware } from \"../../../../utils/helpers/routers.helpers\";\nimport routerValidator from \"../router-validator\";\nimport { getUserFileExtension } from \"../../../../utils/helpers/fs.helpers\";\nimport prismaSchemaParser from \"../../../../utils/prisma/prisma-schema-parser\";\n\nexport async function setupRouters(router: Router, arkosConfigs: ArkosConfig) {\n return prismaSchemaParser.getModelsAsArrayOfStrings().map(async (model) => {\n const modelNameInKebab = kebabCase(model);\n const modelModules = getModuleComponents(modelNameInKebab) || {};\n\n const {\n interceptors,\n authConfigs,\n prismaQueryOptions,\n router: customRouterModule,\n dtos,\n schemas,\n } = modelModules;\n\n const routeName = pluralize.plural(modelNameInKebab);\n const controller = new BaseController(model);\n\n const routerConfig: RouterConfig = customRouterModule?.config || {};\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 get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n // If the custom router has its own routes, add them\n if (\n typeof customRouterModule?.default === \"function\" &&\n !routerConfig?.disable\n )\n if (routerValidator.isExpressRouter(customRouterModule?.default))\n router.use(`/${routeName}`, customRouterModule.default);\n else\n throw Error(\n `Validation Error: The exported router from ${modelNameInKebab}.router.${getUserFileExtension()} is not a valid express Router.`\n );\n\n // POST /{routeName} - Create One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"create\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createOne\"\n ),\n ...processMiddleware(interceptors?.beforeCreateOne),\n controller.createOne,\n ...processMiddleware(interceptors?.afterCreateOne),\n sendResponse,\n ...processMiddleware(interceptors?.onCreateOneError, { type: \"error\" })\n );\n }\n\n // GET /{routeName} - Find Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findMany\"\n ),\n ...processMiddleware(interceptors?.beforeFindMany),\n controller.findMany,\n ...processMiddleware(interceptors?.afterFindMany),\n sendResponse,\n ...processMiddleware(interceptors?.onFindManyError, { type: \"error\" })\n );\n }\n\n // POST /{routeName}/many - Create Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"createMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createMany\"\n ),\n ...processMiddleware(interceptors?.beforeCreateMany),\n controller.createMany,\n ...processMiddleware(interceptors?.afterCreateMany),\n sendResponse,\n ...processMiddleware(interceptors?.onCreateManyError, { type: \"error\" })\n );\n }\n\n // PATCH /{routeName}/many - Update Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateMany\"\n ),\n ...processMiddleware(interceptors?.beforeUpdateMany),\n controller.updateMany,\n ...processMiddleware(interceptors?.afterUpdateMany),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateManyError, { type: \"error\" })\n );\n }\n\n // DELETE /{routeName}/many - Delete Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"deleteMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteMany\"\n ),\n ...processMiddleware(interceptors?.beforeDeleteMany),\n controller.deleteMany,\n ...processMiddleware(interceptors?.afterDeleteMany),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteManyError, { type: \"error\" })\n );\n }\n\n // GET /{routeName}/:id - Find One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"findOne\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findOne\"\n ),\n ...processMiddleware(interceptors?.beforeFindOne),\n controller.findOne,\n ...processMiddleware(interceptors?.afterFindOne),\n sendResponse,\n ...processMiddleware(interceptors?.onFindOneError, { type: \"error\" })\n );\n }\n\n // PATCH /{routeName}/:id - Update One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"update\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateOne\"\n ),\n ...processMiddleware(interceptors?.beforeUpdateOne),\n controller.updateOne,\n ...processMiddleware(interceptors?.afterUpdateOne),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateOneError, { type: \"error\" })\n );\n }\n\n // DELETE /{routeName}/:id - Delete One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"delete\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteOne\"\n ),\n ...processMiddleware(interceptors?.beforeDeleteOne),\n controller.deleteOne,\n ...processMiddleware(interceptors?.afterDeleteOne),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteOneError, { type: \"error\" })\n );\n }\n });\n}\n\nexport function isEndpointDisabled<RouterType extends string = \"prisma\">(\n routerConfig: RouterConfig<RouterType>,\n endpoint: RouterEndpoint | AuthRouterEndpoint | FileUploadRouterEndpoint\n): boolean {\n if (!routerConfig?.disable) return false;\n\n if (routerConfig.disable === true) return true;\n\n if (typeof routerConfig.disable === \"object\")\n return routerConfig.disable[endpoint as never] === true;\n\n return false;\n}\n\nexport function isParentEndpointAllowed(\n routerConfig: any,\n endpoint: string\n): boolean {\n if (!routerConfig?.parent) return false;\n\n const parentEndpoints = routerConfig.parent.endpoints;\n if (parentEndpoints === \"*\") return true;\n if (Array.isArray(parentEndpoints)) return parentEndpoints.includes(endpoint);\n\n return true; // Default to allow if not specified\n}\n"]}
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 pluralize from \"pluralize\";\nimport { ArkosConfig, RouterConfig } from \"../../../../exports\";\nimport { APIFeatures, kebabCase } from \"../../../../exports/utils\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosResponse,\n PrismaQueryOptions,\n} from \"../../../../types\";\nimport {\n AuthRouterEndpoint,\n FileUploadRouterEndpoint,\n RouterEndpoint,\n} from \"../../../../types/router-config\";\nimport { getModuleComponents } from \"../../../../utils/dynamic-loader\";\nimport authService from \"../../../auth/auth.service\";\nimport { BaseController } from \"../../base.controller\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../../base.middlewares\";\nimport { processMiddleware } from \"../../../../utils/helpers/routers.helpers\";\nimport routerValidator from \"../router-validator\";\nimport { getUserFileExtension } from \"../../../../utils/helpers/fs.helpers\";\nimport prismaSchemaParser from \"../../../../utils/prisma/prisma-schema-parser\";\nimport debuggerService from \"../../../debugger/debugger.service\";\nimport util from \"util\";\n\nexport function handleModelsApiFeatures(modelName: string) {\n return (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n req.modelName = modelName;\n req.query.filterMode = req.query?.filterMode || \"AND\";\n req.filters = new APIFeatures(req, modelName)\n .filter()\n .sort()\n .limitFields()\n .paginate().filters;\n\n next();\n };\n}\n\nexport async function setupRouters(router: Router, arkosConfigs: ArkosConfig) {\n return prismaSchemaParser.getModelsAsArrayOfStrings().map(async (model) => {\n const modelNameInKebab = kebabCase(model);\n const modelModules = getModuleComponents(modelNameInKebab) || {};\n\n const {\n interceptors,\n authConfigs,\n prismaQueryOptions,\n router: customRouterModule,\n dtos,\n schemas,\n } = modelModules;\n\n const routeName = pluralize.plural(modelNameInKebab);\n const controller = new BaseController(model);\n\n const routerConfig: RouterConfig<any> = customRouterModule?.config || {};\n\n const customRouter = customRouterModule?.default 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 const getValidationSchemaOrDto = (key: \"create\" | \"update\") => {\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 (customRouter && customRouterModule) {\n if (routerValidator.isExpressRouter(customRouter))\n router.use(`/${routeName}`, customRouter);\n else\n throw Error(\n `Validation Error: The exported router from ${modelNameInKebab}.router.${getUserFileExtension()} is not a valid express Router.`\n );\n }\n\n // POST /{routeName} - Create One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"create\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createOne\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeCreateOne),\n controller.createOne,\n ...processMiddleware(interceptors?.afterCreateOne),\n sendResponse,\n ...processMiddleware(interceptors?.onCreateOneError, { type: \"error\" })\n );\n }\n\n // GET /{routeName} - Find Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findMany\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeFindMany),\n controller.findMany,\n ...processMiddleware(interceptors?.afterFindMany),\n sendResponse,\n ...processMiddleware(interceptors?.onFindManyError, { type: \"error\" })\n );\n }\n\n // POST /{routeName}/many - Create Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"create\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createMany\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeCreateMany),\n controller.createMany,\n ...processMiddleware(interceptors?.afterCreateMany),\n sendResponse,\n ...processMiddleware(interceptors?.onCreateManyError, { type: \"error\" })\n );\n }\n\n // PATCH /{routeName}/many - Update Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateMany\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeUpdateMany),\n controller.updateMany,\n ...processMiddleware(interceptors?.afterUpdateMany),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateManyError, { type: \"error\" })\n );\n }\n\n // DELETE /{routeName}/many - Delete Many\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteMany\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeDeleteMany),\n controller.deleteMany,\n ...processMiddleware(interceptors?.afterDeleteMany),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteManyError, { type: \"error\" })\n );\n }\n\n // GET /{routeName}/:id - Find One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findOne\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeFindOne),\n controller.findOne,\n ...processMiddleware(interceptors?.afterFindOne),\n sendResponse,\n ...processMiddleware(interceptors?.onFindOneError, { type: \"error\" })\n );\n }\n\n // PATCH /{routeName}/:id - Update One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"update\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateOne\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeUpdateOne),\n controller.updateOne,\n ...processMiddleware(interceptors?.afterUpdateOne),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateOneError, { type: \"error\" })\n );\n }\n\n // DELETE /{routeName}/:id - Delete One\n if (\n !isEndpointDisabled(routerConfig, \"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(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteOne\"\n ),\n handleModelsApiFeatures(model),\n debuggerService.logLevel2RequestInfo,\n ...processMiddleware(interceptors?.beforeDeleteOne),\n controller.deleteOne,\n ...processMiddleware(interceptors?.afterDeleteOne),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteOneError, { type: \"error\" })\n );\n }\n\n debuggerService.logModuleFinalRouter(modelNameInKebab, router);\n });\n}\n\nexport function isEndpointDisabled(\n routerConfig: RouterConfig<any>,\n endpoint: RouterEndpoint | AuthRouterEndpoint | FileUploadRouterEndpoint\n): boolean {\n if (!routerConfig?.disable) return false;\n\n if (routerConfig.disable === true) return true;\n\n if (typeof routerConfig.disable === \"object\")\n return routerConfig.disable[endpoint as never] === true;\n\n return false;\n}\n\nexport function isParentEndpointAllowed(\n routerConfig: any,\n endpoint: string\n): boolean {\n if (!routerConfig?.parent) return false;\n\n const parentEndpoints = routerConfig.parent.endpoints;\n if (parentEndpoints === \"*\") return true;\n if (Array.isArray(parentEndpoints)) return parentEndpoints.includes(endpoint);\n\n return true;\n}\n"]}
@@ -42,7 +42,7 @@ export function throwErrorIfApiActionIsInvalid(apiAction) {
42
42
  export function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
43
43
  let mutableBody = { ...body };
44
44
  relationFields?.list?.forEach((field) => {
45
- if (!body[field.name])
45
+ if (!body?.[field.name])
46
46
  return;
47
47
  if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {
48
48
  delete mutableBody[field.name];
@@ -111,7 +111,7 @@ export function handleRelationFieldsInBody(body, relationFields, ignoreActions =
111
111
  };
112
112
  });
113
113
  relationFields?.singular?.forEach((field) => {
114
- if (!body[field.name])
114
+ if (!body?.[field.name])
115
115
  return;
116
116
  if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {
117
117
  delete mutableBody[field.name];
@@ -1 +1 @@
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 prismaSchemaParser from \"../../../../utils/prisma/prisma-schema-parser\";\nimport { PrismaField } from \"../../../../utils/prisma/types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\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\nconst prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\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 // Check if any key is a Prisma operation\n return prismaOperations.some((op) => obj?.[op]);\n}\n\nexport function throwErrorIfApiActionIsInvalid(apiAction: string) {\n if (apiAction && !prismaOperations.includes(apiAction))\n throw Error(\n `Validation Error: Unknown value \"${apiAction}\" for apiAction field, available values are ${prismaOperations.join(\", \")}.`\n );\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: ModelGroupRelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body[field.name]) return;\n\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) return;\n\n // Skip if the field is not an array (likely already handled manually)\n if (!Array.isArray(body[field.name])) return;\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 throwErrorIfApiActionIsInvalid(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\n throwErrorIfApiActionIsInvalid(apiAction);\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n // If no ID, assume create operation\n let nestedRelations = getGroupedModelReations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (dataToPush?.apiAction) {\n const { apiAction, ...rest } = dataToPush;\n\n throwErrorIfApiActionIsInvalid(apiAction);\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 throwErrorIfApiActionIsInvalid(apiAction);\n let nestedRelations = getGroupedModelReations(field.type);\n\n let dataToPush = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\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\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\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 = getGroupedModelReations(field.type);\n\n if (relationData?.apiAction === \"delete\") {\n // Handle delete for singular relations\n mutableBody[field.name] = { delete: true };\n } else if (relationData?.apiAction === \"disconnect\") {\n // Handle disconnect for singular relations\n mutableBody[field.name] = { disconnect: true };\n } else if (canBeUsedToConnect(field.type, relationData)) {\n // Handle connection with unique fields or ID\n const { apiAction, ...cleanedData } = relationData;\n\n throwErrorIfApiActionIsInvalid(apiAction);\n\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 (dataToCreate?.apiAction) {\n const { apiAction, ...rest } = dataToCreate;\n throwErrorIfApiActionIsInvalid(apiAction);\n\n dataToCreate = rest;\n }\n\n if (nestedRelations?.singular || nestedRelations?.list) {\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 throwErrorIfApiActionIsInvalid(apiAction);\n\n let dataToUpdate = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n where: { id },\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (mutableBody?.apiAction) {\n throw new AppError(\n \"Validation Error: Invalid usage of apiAction field, it must only be used on relation fields whether single or multiple.\",\n 500,\n {\n data: {\n ...body,\n },\n }\n );\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\nexport type ModelGroupRelationFields = ReturnType<\n typeof getGroupedModelReations\n>;\n\nfunction getGroupedModelReations(modelName: string) {\n const relationsFields = prismaSchemaParser.getModelRelations(modelName);\n\n return {\n singular: relationsFields?.filter(\n (field) => field.isRelation && !field.isArray\n ),\n list: relationsFields?.filter((field) => field.isRelation && field.isArray),\n };\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 = prismaSchemaParser.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 && uniqueFields?.length > 0) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field: PrismaField) => field.name === fieldName);\n }\n\n return false;\n}\n"]}
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 prismaSchemaParser from \"../../../../utils/prisma/prisma-schema-parser\";\nimport { PrismaField } from \"../../../../utils/prisma/types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\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\nconst prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\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 // Check if any key is a Prisma operation\n return prismaOperations.some((op) => obj?.[op]);\n}\n\nexport function throwErrorIfApiActionIsInvalid(apiAction: string) {\n if (apiAction && !prismaOperations.includes(apiAction))\n throw Error(\n `Validation Error: Unknown value \"${apiAction}\" for apiAction field, available values are ${prismaOperations.join(\", \")}.`\n );\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: ModelGroupRelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body?.[field.name]) return;\n\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\n\n if (isPrismaRelationFormat(body[field.name])) return;\n\n if (!Array.isArray(body[field.name])) return;\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 throwErrorIfApiActionIsInvalid(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 const { apiAction, ...cleanedData } = bodyField;\n\n throwErrorIfApiActionIsInvalid(apiAction);\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n let nestedRelations = getGroupedModelReations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (dataToPush?.apiAction) {\n const { apiAction, ...rest } = dataToPush;\n\n throwErrorIfApiActionIsInvalid(apiAction);\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n const { id, apiAction, ...data } = bodyField;\n\n throwErrorIfApiActionIsInvalid(apiAction);\n let nestedRelations = getGroupedModelReations(field.type);\n\n let dataToPush = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\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\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\n\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getGroupedModelReations(field.type);\n\n if (relationData?.apiAction === \"delete\") {\n mutableBody[field.name] = { delete: true };\n } else if (relationData?.apiAction === \"disconnect\") {\n mutableBody[field.name] = { disconnect: true };\n } else if (canBeUsedToConnect(field.type, relationData)) {\n const { apiAction, ...cleanedData } = relationData;\n\n throwErrorIfApiActionIsInvalid(apiAction);\n\n mutableBody[field.name] = { connect: cleanedData };\n } else if (!relationData?.id) {\n let dataToCreate = { ...relationData };\n\n if (dataToCreate?.apiAction) {\n const { apiAction, ...rest } = dataToCreate;\n throwErrorIfApiActionIsInvalid(apiAction);\n\n dataToCreate = rest;\n }\n\n if (nestedRelations?.singular || nestedRelations?.list) {\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 throwErrorIfApiActionIsInvalid(apiAction);\n\n let dataToUpdate = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n where: { id },\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (mutableBody?.apiAction) {\n throw new AppError(\n \"Validation Error: Invalid usage of apiAction field, it must only be used on relation fields whether single or multiple.\",\n 500,\n {\n data: {\n ...body,\n },\n }\n );\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\nexport type ModelGroupRelationFields = ReturnType<\n typeof getGroupedModelReations\n>;\n\nfunction getGroupedModelReations(modelName: string) {\n const relationsFields = prismaSchemaParser.getModelRelations(modelName);\n\n return {\n singular: relationsFields?.filter(\n (field) => field.isRelation && !field.isArray\n ),\n list: relationsFields?.filter((field) => field.isRelation && field.isArray),\n };\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 = prismaSchemaParser.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 && uniqueFields?.length > 0) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field: PrismaField) => field.name === fieldName);\n }\n\n return false;\n}\n"]}
@@ -2,11 +2,8 @@ class RouterValidator {
2
2
  isExpressRouter(router) {
3
3
  if (!router || typeof router !== "function")
4
4
  return false;
5
- const hasRouterMethods = typeof router?.use === "function" &&
6
- typeof router?.get === "function" &&
7
- typeof router?.route === "function";
8
5
  const hasStack = Array.isArray(router?.stack);
9
- return hasRouterMethods && hasStack;
6
+ return hasStack;
10
7
  }
11
8
  }
12
9
  const routerValidator = new RouterValidator();
@@ -1 +1 @@
1
- {"version":3,"file":"router-validator.js","sourceRoot":"","sources":["../../../../../src/modules/base/utils/router-validator.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe;IACnB,eAAe,CAAC,MAAW;QACzB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAE1D,MAAM,gBAAgB,GACpB,OAAO,MAAM,EAAE,GAAG,KAAK,UAAU;YACjC,OAAO,MAAM,EAAE,GAAG,KAAK,UAAU;YACjC,OAAO,MAAM,EAAE,KAAK,KAAK,UAAU,CAAC;QAEtC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9C,OAAO,gBAAgB,IAAI,QAAQ,CAAC;IACtC,CAAC;CACF;AAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAE9C,eAAe,eAAe,CAAC","sourcesContent":["class RouterValidator {\n isExpressRouter(router: any) {\n if (!router || typeof router !== \"function\") return false;\n\n const hasRouterMethods =\n typeof router?.use === \"function\" &&\n typeof router?.get === \"function\" &&\n typeof router?.route === \"function\";\n\n const hasStack = Array.isArray(router?.stack);\n\n return hasRouterMethods && hasStack;\n }\n}\n\nconst routerValidator = new RouterValidator();\n\nexport default routerValidator;\n"]}
1
+ {"version":3,"file":"router-validator.js","sourceRoot":"","sources":["../../../../../src/modules/base/utils/router-validator.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe;IACnB,eAAe,CAAC,MAAW;QACzB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAE1D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9C,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAE9C,eAAe,eAAe,CAAC","sourcesContent":["class RouterValidator {\n isExpressRouter(router: any) {\n if (!router || typeof router !== \"function\") return false;\n\n const hasStack = Array.isArray(router?.stack);\n\n return hasStack;\n }\n}\n\nconst routerValidator = new RouterValidator();\n\nexport default routerValidator;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"service-hooks-manager.js","sourceRoot":"","sources":["../../../../../src/modules/base/utils/service-hooks-manager.ts"],"names":[],"mappings":"AAKA,MAAM,mBAAmB;IAIvB,KAAK,CAAC,UAAU,CACd,aAA0C,EAC1C,SAA8B;QAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YACxC,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,IAAiB;QACnC,IAAI,OAAO,IAAI,KAAK,UAAU;YAC5B,MAAM,IAAI,KAAK,CACb,4GAA4G,OAAO,IAAI,EAAE,CAC1H,CAAC;IACN,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAEtD,eAAe,mBAAmB,CAAC","sourcesContent":["type ServiceHook = (args: Record<string, any>) => Promise<void>;\n\n/**\n * Manages and handles service hooks implementation on the base service class\n */\nclass ServiceHooksManager {\n /*\n * Handles single function or array of functions of service hook\n */\n async handleHook(\n hooksReceived: ServiceHook | ServiceHook[],\n hooksArgs: Record<string, any>\n ) {\n const hooks = Array.isArray(hooksReceived)\n ? hooksReceived\n : [hooksReceived];\n\n for (const hook of hooks) {\n await hook(hooksArgs);\n }\n }\n\n validateServiceHook(hook: ServiceHook) {\n if (typeof hook !== \"function\")\n throw new Error(\n `Validation Error: service hook must be of type function or array of functions but received value of type ${typeof hook}`\n );\n }\n}\n\nconst serviceHooksManager = new ServiceHooksManager();\n\nexport default serviceHooksManager;\n"]}
1
+ {"version":3,"file":"service-hooks-manager.js","sourceRoot":"","sources":["../../../../../src/modules/base/utils/service-hooks-manager.ts"],"names":[],"mappings":"AAKA,MAAM,mBAAmB;IAIvB,KAAK,CAAC,UAAU,CACd,aAA0C,EAC1C,SAA8B;QAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YACxC,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,IAAiB;QACnC,IAAI,OAAO,IAAI,KAAK,UAAU;YAC5B,MAAM,IAAI,KAAK,CACb,4GAA4G,OAAO,IAAI,EAAE,CAC1H,CAAC;IACN,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAEtD,eAAe,mBAAmB,CAAC","sourcesContent":["export type ServiceHook = (args: Record<string, any>) => Promise<void>;\n\n/**\n * Manages and handles service hooks implementation on the base service class\n */\nclass ServiceHooksManager {\n /*\n * Handles single function or array of functions of service hook\n */\n async handleHook(\n hooksReceived: ServiceHook | ServiceHook[],\n hooksArgs: Record<string, any>\n ) {\n const hooks = Array.isArray(hooksReceived)\n ? hooksReceived\n : [hooksReceived];\n\n for (const hook of hooks) {\n await hook(hooksArgs);\n }\n }\n\n validateServiceHook(hook: ServiceHook) {\n if (typeof hook !== \"function\")\n throw new Error(\n `Validation Error: service hook must be of type function or array of functions but received value of type ${typeof hook}`\n );\n }\n}\n\nconst serviceHooksManager = new ServiceHooksManager();\n\nexport default serviceHooksManager;\n"]}
@@ -0,0 +1,77 @@
1
+ import sheu from "../../utils/sheu.js";
2
+ import { getArkosConfig, } from "../../exports/index.js";
3
+ import util from "util";
4
+ import { crd } from "../../utils/helpers/fs.helpers.js";
5
+ import loadedComponentsLogger from "./utils/loaded-components-logger.js";
6
+ class DebuggerService {
7
+ logModuleFinalRouter(moduleName, router) {
8
+ const config = getArkosConfig();
9
+ const debugLevel = config.debugging?.dynamicLoader?.level || 0;
10
+ if (debugLevel < 3)
11
+ return;
12
+ const moduleNameFilter = config.debugging?.dynamicLoader?.filters?.modules;
13
+ if ((moduleNameFilter?.[0]?.length || 0) > 0 &&
14
+ !moduleNameFilter?.some((name) => moduleName.toLowerCase().startsWith(name.toLowerCase())))
15
+ return;
16
+ sheu.debug(`${sheu.bold("Final Router Module:")} ${moduleName}`);
17
+ sheu.print(util.inspect(router, { depth: null, colors: true }));
18
+ }
19
+ logDynamicLoadedModulesComponents(appModules) {
20
+ const config = getArkosConfig();
21
+ const debugLevel = config.debugging?.dynamicLoader?.level || 0;
22
+ if (debugLevel < 1)
23
+ return;
24
+ sheu.debug(`${sheu.bold("Dynamic Loader Components")}`, {
25
+ timestamp: true,
26
+ });
27
+ const moduleNameFilter = config.debugging?.dynamicLoader?.filters?.modules;
28
+ appModules.forEach(({ moduleName, moduleDir, components }) => {
29
+ if ((moduleNameFilter?.[0]?.length || 0) > 0 &&
30
+ !moduleNameFilter?.some((name) => moduleName.toLowerCase().startsWith(name.toLowerCase())))
31
+ return;
32
+ sheu.print(`\n${sheu.bold("Module:")} ${moduleName}
33
+ ${sheu.bold("Path:")} ${moduleDir.replace(crd(), "")}
34
+ ${sheu.bold("Components:")} ${loadedComponentsLogger.getComponentsNameList(moduleName, components).join(", ")}${debugLevel >= 2 ? `\n${loadedComponentsLogger.getLogText(components)}` : ""}
35
+ ${sheu.bold("Ending:")} ${moduleName}\n`);
36
+ });
37
+ }
38
+ handleTransformedQueryLog(transformedQuery) {
39
+ const config = getArkosConfig();
40
+ const debugLevel = config.debugging?.requests?.level || 0;
41
+ if (debugLevel < 2)
42
+ return;
43
+ if (transformedQuery && Object.keys(transformedQuery).length > 0) {
44
+ sheu.debug(`Transformed Request Parameters\n${JSON.stringify(transformedQuery, null, 2)}`, { timestamp: true });
45
+ }
46
+ else
47
+ sheu.debug(`Transformed Request Parameters - Empty`, {
48
+ timestamp: true,
49
+ });
50
+ }
51
+ logLevel2RequestInfo(req, _, next) {
52
+ const config = getArkosConfig();
53
+ const debugLevel = config.debugging?.requests?.level || 0;
54
+ if (debugLevel < 2)
55
+ return next();
56
+ if (req.modelName) {
57
+ sheu.debug(`Prisma Model Module\n${req.modelName}`, { timestamp: true });
58
+ }
59
+ if (Object.keys(req.query).length > 0) {
60
+ sheu.debug(`Original Request Parameters (req.query)\n${JSON.stringify(req.query || {}, null, 2)}`, { timestamp: true });
61
+ }
62
+ else
63
+ sheu.debug(`Original Request Parameters (req.query) - Empty`, {
64
+ timestamp: true,
65
+ });
66
+ if (req.body && Object.keys(req.body).length > 0)
67
+ sheu.debug(`Original Request Body (req.body)\n${JSON.stringify(req.body, null, 2)}`, { timestamp: true });
68
+ else
69
+ sheu.debug(`Original Request Body (req.body) - Empty`, {
70
+ timestamp: true,
71
+ });
72
+ next();
73
+ }
74
+ }
75
+ const debuggerService = new DebuggerService();
76
+ export default debuggerService;
77
+ //# sourceMappingURL=debugger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugger.service.js","sourceRoot":"","sources":["../../../../src/modules/debugger/debugger.service.ts"],"names":[],"mappings":"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","sourcesContent":["import sheu from \"../../utils/sheu\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosResponse,\n getArkosConfig,\n} from \"../../exports\";\nimport { ModuleComponents } from \"../../utils/dynamic-loader\";\nimport util from \"util\";\nimport { crd } from \"../../utils/helpers/fs.helpers\";\nimport loadedComponentsLogger from \"./utils/loaded-components-logger\";\nimport { Router } from \"express\";\n\nclass DebuggerService {\n logModuleFinalRouter(moduleName: string, router: Router) {\n const config = getArkosConfig();\n const debugLevel = config.debugging?.dynamicLoader?.level || 0;\n if (debugLevel < 3) return;\n\n const moduleNameFilter = config.debugging?.dynamicLoader?.filters?.modules;\n if (\n (moduleNameFilter?.[0]?.length || 0) > 0 &&\n !moduleNameFilter?.some((name) =>\n moduleName.toLowerCase().startsWith(name.toLowerCase())\n )\n )\n return;\n\n sheu.debug(`${sheu.bold(\"Final Router Module:\")} ${moduleName}`);\n sheu.print(util.inspect(router, { depth: null, colors: true }));\n }\n\n logDynamicLoadedModulesComponents(\n appModules: {\n moduleName: string;\n moduleDir: string;\n components: ModuleComponents;\n }[]\n ) {\n const config = getArkosConfig();\n const debugLevel = config.debugging?.dynamicLoader?.level || 0;\n\n if (debugLevel < 1) return;\n sheu.debug(`${sheu.bold(\"Dynamic Loader Components\")}`, {\n timestamp: true,\n });\n\n const moduleNameFilter = config.debugging?.dynamicLoader?.filters?.modules;\n\n appModules.forEach(({ moduleName, moduleDir, components }) => {\n if (\n (moduleNameFilter?.[0]?.length || 0) > 0 &&\n !moduleNameFilter?.some((name) =>\n moduleName.toLowerCase().startsWith(name.toLowerCase())\n )\n )\n return;\n\n sheu.print(`\\n${sheu.bold(\"Module:\")} ${moduleName}\n${sheu.bold(\"Path:\")} ${moduleDir.replace(crd(), \"\")}\n${sheu.bold(\"Components:\")} ${loadedComponentsLogger.getComponentsNameList(moduleName, components).join(\", \")}${debugLevel >= 2 ? `\\n${loadedComponentsLogger.getLogText(components)}` : \"\"}\n${sheu.bold(\"Ending:\")} ${moduleName}\\n`);\n });\n }\n handleTransformedQueryLog(transformedQuery: Record<string, any>) {\n const config = getArkosConfig();\n const debugLevel = config.debugging?.requests?.level || 0;\n if (debugLevel < 2) return;\n\n if (transformedQuery && Object.keys(transformedQuery).length > 0) {\n sheu.debug(\n `Transformed Request Parameters\\n${JSON.stringify(transformedQuery, null, 2)}`,\n { timestamp: true }\n );\n } else\n sheu.debug(`Transformed Request Parameters - Empty`, {\n timestamp: true,\n });\n }\n\n logLevel2RequestInfo(\n req: ArkosRequest,\n _: ArkosResponse,\n next: ArkosNextFunction\n ): void {\n const config = getArkosConfig();\n const debugLevel = config.debugging?.requests?.level || 0;\n if (debugLevel < 2) return next();\n\n if (req.modelName) {\n sheu.debug(`Prisma Model Module\\n${req.modelName}`, { timestamp: true });\n }\n\n if (Object.keys(req.query).length > 0) {\n sheu.debug(\n `Original Request Parameters (req.query)\\n${JSON.stringify(req.query || {}, null, 2)}`,\n { timestamp: true }\n );\n } else\n sheu.debug(`Original Request Parameters (req.query) - Empty`, {\n timestamp: true,\n });\n\n if (req.body && Object.keys(req.body).length > 0)\n sheu.debug(\n `Original Request Body (req.body)\\n${JSON.stringify(req.body, null, 2)}`,\n { timestamp: true }\n );\n else\n sheu.debug(`Original Request Body (req.body) - Empty`, {\n timestamp: true,\n });\n\n next();\n }\n}\n\nconst debuggerService = new DebuggerService();\n\nexport default debuggerService;\n"]}
@@ -0,0 +1,50 @@
1
+ import { getUserFileExtension as ext } from "../../../utils/helpers/fs.helpers.js";
2
+ import sheu from "../../../utils/sheu.js";
3
+ import util from "util";
4
+ class LoadedComponentsLogger {
5
+ constructor() {
6
+ this.ext = ext();
7
+ this.componentsToPath = {
8
+ authConfigs: `{{module-name}}.auth.${this.ext}`,
9
+ prismaQueryOptions: `{{module-name}}.query.${this.ext}`,
10
+ interceptors: `{{module-name}}.middlewares.${this.ext}`,
11
+ router: `{{module-name}}.router.${this.ext}`,
12
+ hooks: `{{module-name}}.hooks.${this.ext}`,
13
+ dtos: {
14
+ create: `create-{{module-name}}.dto.${this.ext}`,
15
+ update: `update-{{module-name}}.dto.${this.ext}`,
16
+ },
17
+ schemas: {
18
+ create: `create-{{module-name}}.schema.${this.ext}`,
19
+ update: `update-{{module-name}}.schema.${this.ext}`,
20
+ },
21
+ };
22
+ }
23
+ getComponentsNameList(moduleName, components) {
24
+ return Object.keys(components).reduce((acc, key) => {
25
+ if (components[key]) {
26
+ const mapping = this.componentsToPath[key];
27
+ if (!["schemas", "dtos"].includes(key))
28
+ acc.push(mapping.replace("{{module-name}}", moduleName));
29
+ else {
30
+ if (components[key]?.create)
31
+ acc.push(mapping?.create.replace("{{module-name}}", moduleName));
32
+ if (components[key]?.update)
33
+ acc.push(mapping?.update.replace("{{module-name}}", moduleName));
34
+ }
35
+ }
36
+ return acc;
37
+ }, []);
38
+ }
39
+ getLogText(components) {
40
+ return `${sheu.bold("AuthConfigs:")} ${components?.authConfigs ? `\n${util.inspect(components.authConfigs, { depth: null, colors: true })}` : " -"}
41
+ ${sheu.bold("PrismaQueryOptions:")}${components?.prismaQueryOptions ? `\n${util.inspect(components.prismaQueryOptions, { depth: null, colors: true })}` : " -"}
42
+ ${sheu.bold("Router:")}${components?.router ? `\n${util.inspect(components.router, { depth: null, colors: true })}` : " -"}
43
+ ${sheu.bold("Interceptors:")}${components?.interceptors ? `\n${util.inspect(components.interceptors, { depth: null, colors: true })}` : " -"}
44
+ ${sheu.bold("Hooks:")}${components?.hooks ? `\n${util.inspect(components.hooks, { depth: null, colors: true })}` : " -"}
45
+ `;
46
+ }
47
+ }
48
+ const loadedComponentsLogger = new LoadedComponentsLogger();
49
+ export default loadedComponentsLogger;
50
+ //# sourceMappingURL=loaded-components-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaded-components-logger.js","sourceRoot":"","sources":["../../../../../src/modules/debugger/utils/loaded-components-logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { ModuleComponents } from \"../../../utils/dynamic-loader\";\nimport { getUserFileExtension as ext } from \"../../../utils/helpers/fs.helpers\";\nimport sheu from \"../../../utils/sheu\";\nimport util from \"util\";\n\nclass LoadedComponentsLogger {\n ext = ext();\n componentsToPath: Record<\n keyof ModuleComponents,\n string | ModuleComponents[\"dtos\"]\n > = {\n authConfigs: `{{module-name}}.auth.${this.ext}`,\n prismaQueryOptions: `{{module-name}}.query.${this.ext}`,\n interceptors: `{{module-name}}.middlewares.${this.ext}`,\n router: `{{module-name}}.router.${this.ext}`,\n hooks: `{{module-name}}.hooks.${this.ext}`,\n dtos: {\n create: `create-{{module-name}}.dto.${this.ext}`,\n update: `update-{{module-name}}.dto.${this.ext}`,\n },\n schemas: {\n create: `create-{{module-name}}.schema.${this.ext}`,\n update: `update-{{module-name}}.schema.${this.ext}`,\n },\n };\n\n getComponentsNameList(moduleName: string, components: ModuleComponents) {\n return Object.keys(components).reduce((acc, key) => {\n if (components[key as keyof ModuleComponents]) {\n const mapping = this.componentsToPath[key as keyof ModuleComponents];\n if (![\"schemas\", \"dtos\"].includes(key))\n acc.push((mapping as string)!.replace(\"{{module-name}}\", moduleName));\n else {\n if ((components as any)[key as keyof ModuleComponents]?.create)\n acc.push(\n (mapping as ModuleComponents[\"dtos\"])?.create.replace(\n \"{{module-name}}\",\n moduleName\n )\n );\n if ((components as any)[key as keyof ModuleComponents]?.update)\n acc.push(\n (mapping as ModuleComponents[\"dtos\"])?.update.replace(\n \"{{module-name}}\",\n moduleName\n )\n );\n }\n }\n\n return acc;\n }, [] as string[]);\n }\n\n getLogText(components: ModuleComponents) {\n return `${sheu.bold(\"AuthConfigs:\")} ${components?.authConfigs ? `\\n${util.inspect(components.authConfigs, { depth: null, colors: true })}` : \" -\"}\n${sheu.bold(\"PrismaQueryOptions:\")}${components?.prismaQueryOptions ? `\\n${util.inspect(components.prismaQueryOptions, { depth: null, colors: true })}` : \" -\"}\n${sheu.bold(\"Router:\")}${components?.router ? `\\n${util.inspect(components.router, { depth: null, colors: true })}` : \" -\"}\n${sheu.bold(\"Interceptors:\")}${components?.interceptors ? `\\n${util.inspect(components.interceptors, { depth: null, colors: true })}` : \" -\"}\n${sheu.bold(\"Hooks:\")}${components?.hooks ? `\\n${util.inspect(components.hooks, { depth: null, colors: true })}` : \" -\"}\n`;\n }\n}\n\nconst loadedComponentsLogger = new LoadedComponentsLogger();\n\nexport default loadedComponentsLogger;\n"]}
@@ -74,7 +74,9 @@ class FileUploadController {
74
74
  };
75
75
  if (this.interceptors?.afterUploadFile) {
76
76
  req.responseData = jsonContent;
77
+ res.locals.data = jsonContent;
77
78
  req.responseStatus = 200;
79
+ res.locals.status = 200;
78
80
  return next();
79
81
  }
80
82
  res.status(200).json(jsonContent);
@@ -215,7 +217,9 @@ class FileUploadController {
215
217
  };
216
218
  if (this.interceptors.afterUpdateFile) {
217
219
  req.responseData = jsonContent;
220
+ res.locals.data = jsonContent;
218
221
  req.responseStatus = 200;
222
+ res.locals.status = 200;
219
223
  return next();
220
224
  }
221
225
  res.status(200).json(jsonContent);
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.controller.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import AppError from \"../error-handler/utils/app-error\";\nimport {\n FileUploadService,\n getFileUploadServices,\n} from \"./file-upload.service\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { getArkosConfig } from \"../../server\";\nimport { processFile, processImage } from \"./utils/helpers/file-upload.helpers\";\nimport { ArkosNextFunction, ArkosRequest, ArkosResponse } from \"../../types\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\n\n/**\n * Handles files uploads and allow to be extended\n */\nclass FileUploadController {\n /**\n * Model-specific interceptors loaded from model modules\n * @private\n */\n private interceptors: any;\n\n /**\n * Handles file upload requests, processes images if needed, and returns URLs\n *\n * Supports paths outside of the project directory with '../' prefix\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n uploadFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n this.interceptors =\n getModuleComponents(\"file-upload\")?.interceptors || {};\n\n const { fileType } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n // Ensure upload directory exists\n const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);\n try {\n await fs.promises.access(uploadPath);\n } catch (err) {\n // Create directory if it doesn't exist\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n // Select the appropriate uploader service based on file type\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n // Handle the file upload\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) return next(err);\n\n // Process all uploaded files\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n // Process multiple image files with image transformations\n data = await Promise.all(\n req.files.map((file) => processImage(req, file.path, options))\n );\n } else {\n // Just store other file types without processing\n data = await Promise.all(\n req.files.map((file) => processFile(req, file.path))\n );\n }\n // Filter out any null values from failed processing\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n // Process a single file\n if (fileType === \"images\") {\n data = await processImage(req, req.file.path, options);\n } else {\n data = await processFile(req, req.file.path);\n }\n } else {\n return next(new AppError(\"No file uploaded\", 400));\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? `${data.length} files uploaded successfully`\n : \"File uploaded successfully\",\n };\n\n if (this.interceptors?.afterUploadFile) {\n req.responseData = jsonContent;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n\n /**\n * Handles file deletion requests\n *\n * Supports paths outside of the project directory with '../' prefix\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n deleteFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n this.interceptors =\n getModuleComponents(\"file-upload\")?.interceptors || {};\n\n const { fileType, fileName } = req.params;\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n try {\n const { fileUpload } = getArkosConfig();\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n // This checks if the URL follows the expected format: /api/files/{fileType}/{fileName}\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n // Build the expected URL for this request\n const fullUrl = `${req.protocol}://${req.get(\"host\")}${\n req.originalUrl\n }`;\n\n // URL matches expected pattern, use deleteFileByUrl\n await uploader.deleteFileByUrl(fullUrl);\n } else {\n // URL doesn't match expected pattern, use deleteFileByName\n await uploader.deleteFileByName(fileName, fileType);\n }\n\n if (this.interceptors.afterDeleteFile) {\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).json();\n } catch (error) {\n // Handle different types of errors\n if (error instanceof AppError) {\n return next(error);\n }\n // File doesn't exist or other error\n return next(new AppError(\"File not found\", 404));\n }\n }\n );\n\n /**\n * Handles file update requests by deleting the old file and uploading a new one\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n updateFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n this.interceptors =\n getModuleComponents(\"file-upload\")?.interceptors || {};\n\n const { fileType, fileName } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n // Ensure upload directory exists\n const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);\n try {\n await fs.promises.access(uploadPath);\n } catch (err) {\n // Create directory if it doesn't exist\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n // Select the appropriate uploader service based on file type\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n // Handle the file upload\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) return next(err);\n\n // Check if new file was uploaded\n if (\n !req.file &&\n (!req.files || !Array.isArray(req.files) || req.files.length === 0)\n ) {\n return next(new AppError(\"No new file uploaded\", 400));\n }\n\n // Only attempt to delete old file if fileName is specified\n if (fileName && fileName.trim() !== \"\") {\n try {\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n // Check if the URL follows the expected format\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n // URL matches expected pattern, use deleteFileByUrl\n const oldFileUrl = `${req.protocol}://${req.get(\"host\")}${\n req.originalUrl\n }`;\n await uploader.deleteFileByUrl(oldFileUrl);\n } else {\n // URL doesn't match expected pattern, use deleteFileByName\n await uploader.deleteFileByName(fileName, fileType);\n }\n } catch (error) {\n // Log the error but continue with upload - old file might not exist\n console.warn(`Could not delete old file: ${fileName}`, error);\n }\n }\n\n // Process the new uploaded file(s)\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n // Process multiple image files with image transformations\n data = await Promise.all(\n req.files.map((file) => processImage(req, file.path, options))\n );\n } else {\n // Just store other file types without processing\n data = await Promise.all(\n req.files.map((file) => processFile(req, file.path))\n );\n }\n // Filter out any null values from failed processing\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n // Process a single file\n if (fileType === \"images\") {\n data = await processImage(req, req.file.path, options);\n } else {\n data = await processFile(req, req.file.path);\n }\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? fileName && fileName.trim() !== \"\"\n ? `File updated successfully. ${data.length} new files uploaded`\n : `${data.length} files uploaded successfully`\n : fileName && fileName.trim() !== \"\"\n ? \"File updated successfully\"\n : \"File uploaded successfully\",\n };\n\n if (this.interceptors.afterUpdateFile) {\n req.responseData = jsonContent;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n\n /**\n * Not implemented yet\n *\n * @deprecated\n */\n // streamFile = catchAsync(\n // async (req: ArkosRequest, res: ArkosResponse, _: ArkosNextFunction) => {\n // const { fileName, fileType } = req.params;\n\n // const filePath = path.join(\".\", \"uploads\", fileType, fileName);\n // try {\n // await fs.promises.access(filePath);\n // } catch (err) {\n // throw new AppError(\"File not found\", 404);\n // }\n\n // const fileStat = await fs.promises.stat(filePath);\n // const fileSize = fileStat.size;\n // const range = req.headers.range;\n\n // if (range) {\n // const [partialStart, partialEnd] = range\n // .replace(/bytes=/, \"\")\n // .split(\"-\");\n // const start = parseInt(partialStart, 10) || 0;\n // const end = partialEnd ? parseInt(partialEnd, 10) : fileSize - 1;\n\n // if (start >= fileSize || end >= fileSize) {\n // res.status(416).json({ error: \"Range Not Satisfiable\" });\n // return;\n // }\n\n // res.writeHead(206, {\n // \"Content-Range\": `bytes ${start}-${end}/${fileSize}`,\n // \"Accept-Ranges\": \"bytes\",\n // \"Content-Length\": end - start + 1,\n // \"Content-Type\": \"application/octet-stream\",\n // \"Content-Disposition\": `inline; filename=\"${fileName}\"`,\n // });\n\n // fs.createReadStream(filePath, { start, end }).pipe(res);\n // } else {\n // res.writeHead(200, {\n // \"Content-Length\": fileSize,\n // \"Content-Type\": \"application/octet-stream\",\n // \"Content-Disposition\": `inline; filename=\"${fileName}\"`,\n // });\n // fs.createReadStream(filePath).pipe(res);\n // }\n // }\n // );\n}\n\n/**\n * Controller instance responsible for handling file upload operations.\n * Manages the processing and routing of file upload requests.\n *\n * @remarks\n * This controller handles various file upload operations including validation,\n * storage, and response management.\n *\n * @instance\n * @constant\n * @see {@link https://www.arkosjs.com/docs/api-reference/file-upload-controller-object}\n */\nconst fileUploadController = new FileUploadController();\n\nexport default fileUploadController;\n"]}
1
+ {"version":3,"file":"file-upload.controller.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import AppError from \"../error-handler/utils/app-error\";\nimport {\n FileUploadService,\n getFileUploadServices,\n} from \"./file-upload.service\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { getArkosConfig } from \"../../server\";\nimport { processFile, processImage } from \"./utils/helpers/file-upload.helpers\";\nimport { ArkosNextFunction, ArkosRequest, ArkosResponse } from \"../../types\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\n\n/**\n * Handles files uploads and allow to be extended\n */\nclass FileUploadController {\n /**\n * Model-specific interceptors loaded from model modules\n * @private\n */\n private interceptors: any;\n\n /**\n * Handles file upload requests, processes images if needed, and returns URLs\n *\n * Supports paths outside of the project directory with '../' prefix\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n uploadFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n this.interceptors =\n getModuleComponents(\"file-upload\")?.interceptors || {};\n\n const { fileType } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);\n try {\n await fs.promises.access(uploadPath);\n } catch (err) {\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) return next(err);\n\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n data = await Promise.all(\n req.files.map((file) => processImage(req, file.path, options))\n );\n } else {\n data = await Promise.all(\n req.files.map((file) => processFile(req, file.path))\n );\n }\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n if (fileType === \"images\") {\n data = await processImage(req, req.file.path, options);\n } else {\n data = await processFile(req, req.file.path);\n }\n } else {\n return next(new AppError(\"No file uploaded\", 400));\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? `${data.length} files uploaded successfully`\n : \"File uploaded successfully\",\n };\n\n if (this.interceptors?.afterUploadFile) {\n req.responseData = jsonContent;\n res.locals.data = jsonContent;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n\n /**\n * Handles file deletion requests\n *\n * Supports paths outside of the project directory with '../' prefix\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n deleteFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n this.interceptors =\n getModuleComponents(\"file-upload\")?.interceptors || {};\n\n const { fileType, fileName } = req.params;\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n try {\n const { fileUpload } = getArkosConfig();\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n // This checks if the URL follows the expected format: /api/files/{fileType}/{fileName}\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n // Build the expected URL for this request\n const fullUrl = `${req.protocol}://${req.get(\"host\")}${\n req.originalUrl\n }`;\n\n // URL matches expected pattern, use deleteFileByUrl\n await uploader.deleteFileByUrl(fullUrl);\n } else {\n // URL doesn't match expected pattern, use deleteFileByName\n await uploader.deleteFileByName(fileName, fileType);\n }\n\n if (this.interceptors.afterDeleteFile) {\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).json();\n } catch (error) {\n // Handle different types of errors\n if (error instanceof AppError) {\n return next(error);\n }\n // File doesn't exist or other error\n return next(new AppError(\"File not found\", 404));\n }\n }\n );\n\n /**\n * Handles file update requests by deleting the old file and uploading a new one\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n updateFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n this.interceptors =\n getModuleComponents(\"file-upload\")?.interceptors || {};\n\n const { fileType, fileName } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n // Ensure upload directory exists\n const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);\n try {\n await fs.promises.access(uploadPath);\n } catch (err) {\n // Create directory if it doesn't exist\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n // Select the appropriate uploader service based on file type\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n // Handle the file upload\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) return next(err);\n\n // Check if new file was uploaded\n if (\n !req.file &&\n (!req.files || !Array.isArray(req.files) || req.files.length === 0)\n ) {\n return next(new AppError(\"No new file uploaded\", 400));\n }\n\n // Only attempt to delete old file if fileName is specified\n if (fileName && fileName.trim() !== \"\") {\n try {\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n // Check if the URL follows the expected format\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n // URL matches expected pattern, use deleteFileByUrl\n const oldFileUrl = `${req.protocol}://${req.get(\"host\")}${\n req.originalUrl\n }`;\n await uploader.deleteFileByUrl(oldFileUrl);\n } else {\n // URL doesn't match expected pattern, use deleteFileByName\n await uploader.deleteFileByName(fileName, fileType);\n }\n } catch (error) {\n // Log the error but continue with upload - old file might not exist\n console.warn(`Could not delete old file: ${fileName}`, error);\n }\n }\n\n // Process the new uploaded file(s)\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n // Process multiple image files with image transformations\n data = await Promise.all(\n req.files.map((file) => processImage(req, file.path, options))\n );\n } else {\n // Just store other file types without processing\n data = await Promise.all(\n req.files.map((file) => processFile(req, file.path))\n );\n }\n // Filter out any null values from failed processing\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n // Process a single file\n if (fileType === \"images\") {\n data = await processImage(req, req.file.path, options);\n } else {\n data = await processFile(req, req.file.path);\n }\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? fileName && fileName.trim() !== \"\"\n ? `File updated successfully. ${data.length} new files uploaded`\n : `${data.length} files uploaded successfully`\n : fileName && fileName.trim() !== \"\"\n ? \"File updated successfully\"\n : \"File uploaded successfully\",\n };\n\n if (this.interceptors.afterUpdateFile) {\n req.responseData = jsonContent;\n res.locals.data = jsonContent;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n\n /**\n * Not implemented yet\n *\n * @deprecated\n */\n // streamFile = catchAsync(\n // async (req: ArkosRequest, res: ArkosResponse, _: ArkosNextFunction) => {\n // const { fileName, fileType } = req.params;\n\n // const filePath = path.join(\".\", \"uploads\", fileType, fileName);\n // try {\n // await fs.promises.access(filePath);\n // } catch (err) {\n // throw new AppError(\"File not found\", 404);\n // }\n\n // const fileStat = await fs.promises.stat(filePath);\n // const fileSize = fileStat.size;\n // const range = req.headers.range;\n\n // if (range) {\n // const [partialStart, partialEnd] = range\n // .replace(/bytes=/, \"\")\n // .split(\"-\");\n // const start = parseInt(partialStart, 10) || 0;\n // const end = partialEnd ? parseInt(partialEnd, 10) : fileSize - 1;\n\n // if (start >= fileSize || end >= fileSize) {\n // res.status(416).json({ error: \"Range Not Satisfiable\" });\n // return;\n // }\n\n // res.writeHead(206, {\n // \"Content-Range\": `bytes ${start}-${end}/${fileSize}`,\n // \"Accept-Ranges\": \"bytes\",\n // \"Content-Length\": end - start + 1,\n // \"Content-Type\": \"application/octet-stream\",\n // \"Content-Disposition\": `inline; filename=\"${fileName}\"`,\n // });\n\n // fs.createReadStream(filePath, { start, end }).pipe(res);\n // } else {\n // res.writeHead(200, {\n // \"Content-Length\": fileSize,\n // \"Content-Type\": \"application/octet-stream\",\n // \"Content-Disposition\": `inline; filename=\"${fileName}\"`,\n // });\n // fs.createReadStream(filePath).pipe(res);\n // }\n // }\n // );\n}\n\n/**\n * Controller instance responsible for handling file upload operations.\n * Manages the processing and routing of file upload requests.\n *\n * @remarks\n * This controller handles various file upload operations including validation,\n * storage, and response management.\n *\n * @instance\n * @constant\n * @see {@link https://www.arkosjs.com/docs/api-reference/file-upload-controller-object}\n */\nconst fileUploadController = new FileUploadController();\n\nexport default fileUploadController;\n"]}
@@ -9,12 +9,13 @@ import { sendResponse } from "../base/base.middlewares.js";
9
9
  import { processMiddleware } from "../../utils/helpers/routers.helpers.js";
10
10
  import { adjustRequestUrl } from "./utils/helpers/file-upload.helpers.js";
11
11
  import { isEndpointDisabled } from "../base/utils/helpers/base.router.helpers.js";
12
+ import debuggerService from "../debugger/debugger.service.js";
12
13
  const router = Router();
13
14
  export async function getFileUploadRouter(arkosConfig) {
14
15
  const { fileUpload } = arkosConfig;
15
16
  const moduleComponents = getModuleComponents("file-upload");
16
17
  let { interceptors = {}, authConfigs = {}, router: customRouterModule, } = {};
17
- if ((moduleComponents)) {
18
+ if (moduleComponents) {
18
19
  ({
19
20
  interceptors = {},
20
21
  authConfigs = {},
@@ -49,6 +50,7 @@ export async function getFileUploadRouter(arkosConfig) {
49
50
  if (!isEndpointDisabled(routerConfig, "deleteFile")) {
50
51
  router.delete(`${basePathname}:fileType/:fileName`, authService.handleAuthenticationControl("Delete", authConfigs.authenticationControl), authService.handleAccessControl("Delete", "file-upload", authConfigs.accessControl), ...processMiddleware(interceptors?.beforeDeleteFile), fileUploadController.deleteFile, ...processMiddleware(interceptors?.afterDeleteFile), sendResponse, ...processMiddleware(interceptors?.onDeleteFileError, { type: "error" }));
51
52
  }
53
+ debuggerService.logModuleFinalRouter("file-upload", router);
52
54
  return router;
53
55
  }
54
56
  //# sourceMappingURL=file-upload.router.js.map