arkos 1.4.0-canary.7 → 1.4.0-canary.71
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.
- package/cli.js +2 -5
- package/dist/cjs/app.js +104 -72
- package/dist/cjs/app.js.map +1 -1
- package/dist/cjs/exports/index.js.map +1 -1
- package/dist/cjs/exports/services/index.js +6 -1
- package/dist/cjs/exports/services/index.js.map +1 -1
- package/dist/cjs/modules/auth/auth.controller.js +31 -40
- package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
- package/dist/cjs/modules/auth/auth.router.js +29 -21
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +34 -10
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js +16 -10
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/cjs/modules/base/base.controller.js +6 -4
- package/dist/cjs/modules/base/base.controller.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +102 -19
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/base/base.router.js +4 -3
- package/dist/cjs/modules/base/base.router.js.map +1 -1
- package/dist/cjs/modules/base/base.service.js +68 -66
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +17 -40
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +22 -6
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/cjs/modules/debugger/debugger.service.js +11 -4
- package/dist/cjs/modules/debugger/debugger.service.js.map +1 -1
- package/dist/cjs/modules/debugger/utils/loaded-components-logger.js +1 -1
- package/dist/cjs/modules/debugger/utils/loaded-components-logger.js.map +1 -1
- package/dist/cjs/modules/email/email.service.js +24 -27
- package/dist/cjs/modules/email/email.service.js.map +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +22 -15
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js +14 -3
- package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +1 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.controller.js +9 -6
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +13 -5
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.service.js +38 -48
- package/dist/cjs/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js +134 -0
- package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js.map +1 -0
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +10 -5
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
- package/dist/cjs/modules/swagger/swagger.router.js +11 -5
- package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js +53 -0
- package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +10 -10
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +419 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +3 -3
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +4 -6
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +4 -4
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +9 -9
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +9 -9
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +6 -8
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +204 -0
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +9 -9
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/cjs/server.js +33 -36
- package/dist/cjs/server.js.map +1 -1
- package/dist/cjs/types/arkos-config.js.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/new-arkos-config.js +3 -0
- package/dist/cjs/types/new-arkos-config.js.map +1 -0
- package/dist/cjs/types/router-config.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +89 -37
- package/dist/cjs/utils/arkos-router/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/route-config-validator.js +8 -7
- package/dist/cjs/utils/arkos-router/route-config-validator.js.map +1 -1
- package/dist/cjs/utils/arkos-router/types/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/types/openapi-config.js +3 -0
- package/dist/cjs/utils/arkos-router/types/openapi-config.js.map +1 -0
- package/dist/cjs/utils/arkos-router/types/upload-config.js +3 -0
- package/dist/cjs/utils/arkos-router/types/upload-config.js.map +1 -0
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js +24 -6
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +232 -0
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -0
- package/dist/cjs/utils/cli/build.js +9 -13
- package/dist/cjs/utils/cli/build.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +7 -7
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/export-auth-action.js +78 -0
- package/dist/cjs/utils/cli/export-auth-action.js.map +1 -0
- package/dist/cjs/utils/cli/generate.js +28 -12
- package/dist/cjs/utils/cli/generate.js.map +1 -1
- package/dist/cjs/utils/cli/index.js +32 -18
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/prisma-generate.js +2 -2
- package/dist/cjs/utils/cli/prisma-generate.js.map +1 -1
- package/dist/cjs/utils/cli/start.js +12 -52
- package/dist/cjs/utils/cli/start.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +58 -0
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +38 -13
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +44 -17
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/{controller-template.js → generate-controller-template.js} +12 -2
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js +1 -34
- package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js +97 -265
- package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js +16 -16
- package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +4 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +8 -32
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +3 -5
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generators.js +2 -2
- package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/cjs/utils/cli/utils/watermark-stamper.js +14 -5
- package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +1 -1
- package/dist/cjs/utils/define-config.js +2 -0
- package/dist/cjs/utils/define-config.js.map +1 -0
- package/dist/cjs/utils/dotenv.helpers.js +2 -1
- package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
- package/dist/cjs/utils/dynamic-loader.js +3 -2
- package/dist/cjs/utils/dynamic-loader.js.map +1 -1
- package/dist/cjs/utils/features/port-and-host-allocator.js +28 -4
- package/dist/cjs/utils/features/port-and-host-allocator.js.map +1 -1
- package/dist/cjs/utils/helpers/arkos-config.helpers.js +45 -0
- package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +1 -0
- package/dist/cjs/utils/helpers/dynamic-loader.helpers.js +135 -46
- package/dist/cjs/utils/helpers/dynamic-loader.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/fs.helpers.js +1 -4
- package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/routers.helpers.js +55 -4
- package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +20 -31
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-schema-parser.js +3 -4
- package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/cjs/utils/sheu.js.map +1 -1
- package/dist/esm/app.js +104 -72
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/exports/index.js.map +1 -1
- package/dist/esm/exports/services/index.js +2 -1
- package/dist/esm/exports/services/index.js.map +1 -1
- package/dist/esm/modules/auth/auth.controller.js +32 -41
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +32 -24
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +34 -10
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/auth/utils/services/auth-action.service.js +12 -9
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +6 -4
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +102 -18
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/base.router.js +4 -3
- package/dist/esm/modules/base/base.router.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +68 -66
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +19 -41
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +22 -6
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/esm/modules/debugger/debugger.service.js +11 -4
- package/dist/esm/modules/debugger/debugger.service.js.map +1 -1
- package/dist/esm/modules/debugger/utils/loaded-components-logger.js +1 -1
- package/dist/esm/modules/debugger/utils/loaded-components-logger.js.map +1 -1
- package/dist/esm/modules/email/email.service.js +24 -27
- package/dist/esm/modules/email/email.service.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +22 -12
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/app-error.js +14 -3
- package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.controller.js +9 -6
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +13 -5
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.service.js +37 -47
- package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/helpers/file-extensions.js +131 -0
- package/dist/esm/modules/file-upload/utils/helpers/file-extensions.js.map +1 -0
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +9 -5
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
- package/dist/esm/modules/swagger/swagger.router.js +11 -5
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js +48 -0
- package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +10 -10
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +413 -0
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +3 -3
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +3 -5
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +4 -4
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +9 -9
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +9 -9
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +6 -8
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +199 -0
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +9 -9
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/esm/server.js +31 -34
- package/dist/esm/server.js.map +1 -1
- package/dist/esm/types/arkos-config.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/new-arkos-config.js +2 -0
- package/dist/esm/types/new-arkos-config.js.map +1 -0
- package/dist/esm/types/router-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +89 -37
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/route-config-validator.js +8 -7
- package/dist/esm/utils/arkos-router/route-config-validator.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/openapi-config.js +2 -0
- package/dist/esm/utils/arkos-router/types/openapi-config.js.map +1 -0
- package/dist/esm/utils/arkos-router/types/upload-config.js +2 -0
- package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -0
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +23 -5
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +227 -0
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -0
- package/dist/esm/utils/cli/build.js +9 -13
- package/dist/esm/utils/cli/build.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +7 -7
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/export-auth-action.js +72 -0
- package/dist/esm/utils/cli/export-auth-action.js.map +1 -0
- package/dist/esm/utils/cli/generate.js +28 -12
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +32 -18
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/prisma-generate.js +2 -2
- package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
- package/dist/esm/utils/cli/start.js +12 -52
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js +53 -0
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +38 -13
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +44 -17
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/{controller-template.js → generate-controller-template.js} +12 -2
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js +1 -34
- package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js +97 -265
- package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js +16 -16
- package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +4 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +8 -32
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +3 -5
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/cli/utils/watermark-stamper.js +11 -5
- package/dist/esm/utils/cli/utils/watermark-stamper.js.map +1 -1
- package/dist/esm/utils/define-config.js +2 -0
- package/dist/esm/utils/define-config.js.map +1 -0
- package/dist/esm/utils/dotenv.helpers.js +2 -1
- package/dist/esm/utils/dotenv.helpers.js.map +1 -1
- package/dist/esm/utils/dynamic-loader.js +4 -3
- package/dist/esm/utils/dynamic-loader.js.map +1 -1
- package/dist/esm/utils/features/port-and-host-allocator.js +28 -4
- package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -1
- package/dist/esm/utils/helpers/arkos-config.helpers.js +38 -0
- package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -0
- package/dist/esm/utils/helpers/dynamic-loader.helpers.js +134 -46
- package/dist/esm/utils/helpers/dynamic-loader.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/fs.helpers.js +1 -4
- package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/routers.helpers.js +53 -4
- package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +20 -31
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-schema-parser.js +3 -4
- package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/esm/utils/sheu.js.map +1 -1
- package/dist/types/app.d.ts +2 -2
- package/dist/types/exports/index.d.ts +3 -2
- package/dist/types/exports/services/index.d.ts +2 -1
- package/dist/types/modules/auth/auth.controller.d.ts +2 -2
- package/dist/types/modules/auth/auth.router.d.ts +2 -3
- package/dist/types/modules/auth/auth.service.d.ts +6 -0
- package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +1 -0
- package/dist/types/modules/base/base.middlewares.d.ts +1 -2
- package/dist/types/modules/base/base.router.d.ts +2 -2
- package/dist/types/modules/base/base.service.d.ts +2 -1
- package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +2 -4
- package/dist/types/modules/debugger/debugger.service.d.ts +1 -1
- package/dist/types/modules/error-handler/utils/app-error.d.ts +1 -1
- package/dist/types/modules/file-upload/file-upload.router.d.ts +2 -2
- package/dist/types/modules/file-upload/file-upload.service.d.ts +24 -2
- package/dist/types/modules/file-upload/utils/helpers/file-extensions.d.ts +3 -0
- package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +2 -1
- package/dist/types/modules/swagger/swagger.router.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/class-validator-to-json-schema.d.ts +3 -0
- package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +2 -2
- package/dist/types/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.d.ts +3 -0
- package/dist/types/modules/swagger/utils/helpers/get-swagger-default-configs.d.ts +2 -45
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/openapi-schema-converter.d.ts +17 -0
- package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +3 -3
- package/dist/types/server.d.ts +4 -6
- package/dist/types/types/arkos-config.d.ts +4 -181
- package/dist/types/types/index.d.ts +5 -4
- package/dist/types/types/new-arkos-config.d.ts +167 -0
- package/dist/types/types/router-config.d.ts +16 -23
- package/dist/types/utils/arkos-router/types/index.d.ts +39 -9
- package/dist/types/utils/arkos-router/types/openapi-config.d.ts +35 -0
- package/dist/types/utils/arkos-router/types/upload-config.d.ts +21 -0
- package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +13 -0
- package/dist/types/utils/cli/export-auth-action.d.ts +4 -0
- package/dist/types/utils/cli/generate.d.ts +2 -1
- package/dist/types/utils/cli/utils/runtime-cli-commander.d.ts +11 -0
- package/dist/types/utils/cli/utils/watermark-stamper.d.ts +3 -3
- package/dist/types/utils/define-config.d.ts +0 -0
- package/dist/types/utils/features/port-and-host-allocator.d.ts +4 -2
- package/dist/types/utils/helpers/arkos-config.helpers.d.ts +7 -0
- package/dist/types/utils/helpers/dynamic-loader.helpers.d.ts +1 -0
- package/dist/types/utils/helpers/routers.helpers.d.ts +8 -0
- package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +1 -1
- package/package.json +3 -2
- package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js.map +0 -1
- /package/dist/types/utils/cli/utils/template-generator/templates/{controller-template.d.ts → generate-controller-template.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-action.service.js","sourceRoot":"","sources":["../../../../../../src/modules/auth/utils/services/auth-action.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-action.service.js","sourceRoot":"","sources":["../../../../../../src/modules/auth/utils/services/auth-action.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { kebabCase } from \"../../../../exports/utils\";\nimport {\n AccessControlConfig,\n DetailedAccessControlRule,\n} from \"../../../../types/auth\";\nimport { getArkosConfig } from \"../../../../utils/helpers/arkos-config.helpers\";\nimport deepmerge from \"../../../../utils/helpers/deepmerge.helper\";\nimport { capitalize } from \"../../../../utils/helpers/text.helpers\";\n\ninterface AuthAction {\n /** role name, e.g Admin, Manager */\n roles?: string[];\n /** action name, e.g Create, View, Update, Download, Cancel */\n action: string;\n /** resource name, e.g user, user-role, product, author */\n resource: string;\n /** Human-readable name for this permission (optional) */\n name?: string;\n /** Detailed description of what this permission allows (optional) */\n description?: string;\n /** Detailed error message of what must be returned on forbidden response (optional)\n *\n * Note: not yet implemented\n */\n errorMessage?: string;\n}\n\nclass AuthActionService {\n authActions: AuthAction[] = [\n {\n roles: [],\n action: \"View\",\n resource: \"auth-action\",\n name: \"View auth action\",\n description: \"Viewm an auth action\",\n errorMessage: \"You do not have permission to perform this operation\",\n },\n ];\n\n add(action: string, resource: string, accessControl?: AccessControlConfig) {\n const transformedAction = this.transformAccessControlToValidAuthAction(\n action,\n resource,\n accessControl\n );\n const existingAuthAction = this.getOne(action, resource);\n if (existingAuthAction) this.remove(action, resource);\n this.authActions.push(\n deepmerge(existingAuthAction || {}, transformedAction)\n );\n }\n\n remove(action: string, resource: string) {\n this.authActions = this.authActions.filter(\n (authAction) =>\n authAction.action !== action && authAction.resource !== resource\n );\n }\n\n getAll(): AuthAction[] {\n return this.authActions;\n }\n\n getOne(action: string, resource: string): AuthAction | undefined {\n return this.authActions.find(\n (authAction) =>\n authAction.action === action && authAction.resource === resource\n );\n }\n\n private transformAccessControlToValidAuthAction(\n action: string,\n resource: string,\n accessControl?: AccessControlConfig\n ): AuthAction {\n const baseAuthAction: AuthAction = {\n roles:\n (accessControl &&\n (Array.isArray(accessControl)\n ? accessControl\n : typeof accessControl === \"string\"\n ? [accessControl]\n : Array.isArray(accessControl?.[action] || {})\n ? (accessControl[action] as string[])\n : (accessControl[action] as DetailedAccessControlRule)\n ?.roles)) ||\n [],\n action,\n resource,\n name: `${capitalize(kebabCase(action).replace(/-/g, \" \"))} ${capitalize(kebabCase(resource).replace(/-/g, \" \"))}`,\n description: `${capitalize(kebabCase(action).replace(/-/g, \" \"))} ${capitalize(kebabCase(resource).replace(/-/g, \" \"))}`,\n errorMessage: `You do not have permission to perform this operation`,\n };\n\n const config = getArkosConfig();\n\n if (config?.authentication?.mode === \"dynamic\") delete baseAuthAction.roles;\n\n if (!accessControl) return baseAuthAction;\n\n if (Array.isArray(accessControl)) return baseAuthAction;\n\n const actionRule = accessControl[action];\n\n if (actionRule) {\n if (Array.isArray(actionRule)) {\n // If it's just an array of roles, keep the base action\n return baseAuthAction;\n } else if (typeof actionRule === \"object\") {\n // If it's a detailed rule object, use its metadata\n return {\n ...baseAuthAction,\n name: actionRule.name || baseAuthAction.name,\n description: actionRule?.description || baseAuthAction.description,\n errorMessage: actionRule?.errorMessage || baseAuthAction.errorMessage,\n };\n }\n }\n\n return baseAuthAction;\n }\n\n /**\n * Get all unique actions across all auth actions\n */\n getUniqueActions(): string[] {\n return [\n ...new Set(this.authActions.map((authAction) => authAction.action)),\n ];\n }\n\n /**\n * Get all unique resources across all auth actions\n */\n getUniqueResources(): string[] {\n return [\n ...new Set(this.authActions.map((authAction) => authAction.resource)),\n ];\n }\n\n /**\n * Get all auth actions for a specific resource\n */\n getByResource(resource: string): AuthAction[] | undefined {\n return this.authActions.filter(\n (authAction) => authAction.resource === resource\n );\n }\n\n /**\n * Get all auth actions for a specific action\n */\n getByAction(action: string): AuthAction[] {\n return this.authActions.filter(\n (authAction) => authAction.action === action\n );\n }\n\n /**\n * Check if an auth action exists\n */\n exists(action: string, resource: string): boolean {\n return !!this.getOne(action, resource);\n }\n}\n\nconst authActionService = new AuthActionService();\n\nexport default authActionService;\n"]}
|
|
@@ -18,9 +18,8 @@ class BaseController {
|
|
|
18
18
|
constructor(modelName) {
|
|
19
19
|
this.executeOperation = (config) => {
|
|
20
20
|
return (0, catch_async_1.default)(async (req, res, next) => {
|
|
21
|
-
if (config.hooks?.beforeQuery)
|
|
21
|
+
if (config.hooks?.beforeQuery)
|
|
22
22
|
await config.hooks.beforeQuery(req);
|
|
23
|
-
}
|
|
24
23
|
if (config.requiresQueryForBulk) {
|
|
25
24
|
if (Object.keys(req.query).every((key) => ["filterMode", "prismaQueryOptions"].includes(key))) {
|
|
26
25
|
return next(new app_error_1.default(`Filter criteria not provided for bulk ${config.operationType.replace(/Many$/, "")}.`, 400, {}, "MissingRequestQueryParameters"));
|
|
@@ -103,7 +102,7 @@ class BaseController {
|
|
|
103
102
|
operationType: "createMany",
|
|
104
103
|
serviceMethod: "createMany",
|
|
105
104
|
successStatus: 201,
|
|
106
|
-
queryFeatures: [
|
|
105
|
+
queryFeatures: [],
|
|
107
106
|
usesRequestBody: true,
|
|
108
107
|
});
|
|
109
108
|
this.findMany = this.executeOperation({
|
|
@@ -131,7 +130,7 @@ class BaseController {
|
|
|
131
130
|
operationType: "updateMany",
|
|
132
131
|
serviceMethod: "updateMany",
|
|
133
132
|
successStatus: 200,
|
|
134
|
-
queryFeatures: ["filter"
|
|
133
|
+
queryFeatures: ["filter"],
|
|
135
134
|
requiresQueryForBulk: true,
|
|
136
135
|
preventORFilter: true,
|
|
137
136
|
usesRequestBody: true,
|
|
@@ -171,13 +170,16 @@ class BaseController {
|
|
|
171
170
|
this.interceptors = components?.interceptors || {};
|
|
172
171
|
}
|
|
173
172
|
setResponseData(req, res, data, status) {
|
|
173
|
+
res.originalData = data;
|
|
174
174
|
req.responseData = data;
|
|
175
175
|
res.locals.data = data;
|
|
176
|
+
res.originalStatus = status;
|
|
176
177
|
req.responseStatus = status;
|
|
177
178
|
res.locals.status = status;
|
|
178
179
|
if (status === 204) {
|
|
179
180
|
req.additionalData = data;
|
|
180
181
|
res.locals.additionalData = data;
|
|
182
|
+
res.originalAdditionalData = data;
|
|
181
183
|
}
|
|
182
184
|
}
|
|
183
185
|
buildServiceArgs(config, req, where, queryOptions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.controller.js","sourceRoot":"","sources":["../../../../src/modules/base/base.controller.ts"],"names":[],"mappings":";;;;;;AACA,qFAA4D;AAC5D,iDAA6C;AAC7C,iFAAwD;AACxD,iFAAgF;AAChF,+DAAiE;AACjE,0DAAkC;AAClC,4DAAoC;AACpC,mGAAyE;AACzE,+CAAkD;AAClD,4FAA6D;AAwD7D,MAAa,cAAc;IAuBzB,YAAY,SAAiB;QAQrB,qBAAgB,GAAG,CAAC,MAAuB,EAAE,EAAE;YACrD,OAAO,IAAA,qBAAU,EACf,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;gBACF,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;oBAC9B,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACtC,CAAC;gBAED,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;oBAChC,IACE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACnC,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CACnD,EACD,CAAC;wBACD,OAAO,IAAI,CACT,IAAI,mBAAQ,CACV,yCAAyC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,EACrF,GAAG,EACH,EAAE,EACF,+BAA+B,CAChC,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,IAAI,MAAM,CAAC,eAAe,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;oBAC5D,MAAM,IAAI,mBAAQ,CAChB,gDAAgD,MAAM,CAAC,aAAa,YAAY,EAChF,GAAG,CACJ,CAAC;gBACJ,CAAC;gBAED,IAAI,MAAM,CAAC,eAAe;oBAAE,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;gBAEzD,IAAI,WAAW,GAAG,IAAI,mBAAW,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAEvD,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACvC,QAAQ,OAAO,EAAE,CAAC;wBAChB,KAAK,QAAQ;4BACX,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;4BACnC,MAAM;wBACR,KAAK,MAAM;4BACT,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;4BACjC,MAAM;wBACR,KAAK,aAAa;4BAChB,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;4BACxC,MAAM;wBACR,KAAK,UAAU;4BACb,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;4BACrC,MAAM;oBACV,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC;gBAEvD,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU;oBAC1B,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;gBAE9D,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,CACrC,MAAM,EACN,GAAG,EACH,KAAK,EACL,YAAY,CACb,CAAC;gBAEF,IAAI,MAAM,CAAC,KAAK,EAAE,aAAa;oBAC7B,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBAEnE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAChC,MAAM,CAAC,aAAuC,CACnC,CAAC;gBACd,IAAI,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAElE,IAAI,MAAM,CAAC,KAAK,EAAE,YAAY;oBAC5B,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAExD,IAAI,IAAI,GAAG,MAAM,CAAC;gBAClB,IAAI,cAAc,GAAQ,IAAI,CAAC;gBAE/B,IAAI,MAAM,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;oBACxC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBACzC,MAAM;wBACN,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE;4BACxB,IAAI,EAAE,GAAG,EAAE,IAAI;4BACf,WAAW,EAAE,GAAG,EAAE,WAAW;yBAC9B,CAAC;qBACH,CAAC,CAAC;oBACH,IAAI,GAAG,OAAO,CAAC;oBACf,cAAc,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtD,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY;oBAC/B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;oBAChD,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBAE9D,IAAI,KAAK;oBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE9B,IAAI,YAAY,GAAG,MAAM,CAAC,eAAe;oBACvC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC;oBAC9C,CAAC,CAAC,IAAI,CAAC,sBAAsB,CACzB,IAAI,EACJ,cAAc,EACd,MAAM,CAAC,aAAa,CACrB,CAAC;gBAEN,IAAI,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;oBACjC,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBACtE,CAAC;gBAED,MAAM,eAAe,GAAG,QAAQ,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE/G,IAAI,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;oBACvC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;oBACnE,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBAED,IAAI,MAAM,CAAC,aAAa,KAAK,WAAW;oBACtC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEjD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACtD,CAAC,CACF,CAAC;QACJ,CAAC,CAAC;QAuLF,cAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAChC,aAAa,EAAE,WAAW;YAC1B,aAAa,EAAE,WAAW;YAC1B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,aAAa,CAAC;YAC9B,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAKH,eAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACjC,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,aAAa,CAAC;YAC9B,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAKH,aAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC/B,aAAa,EAAE,UAAU;YACzB,aAAa,EAAE,UAAU;YACzB,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC;SAC7D,CAAC,CAAC;QAKH,YAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC9B,aAAa,EAAE,SAAS;YACxB,aAAa,EAAE,SAAS;YACxB,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,aAAa,CAAC;YAC9B,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;QAKH,cAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAChC,aAAa,EAAE,WAAW;YAC1B,aAAa,EAAE,WAAW;YAC1B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,aAAa,CAAC;YAC9B,iBAAiB,EAAE,IAAI;YACvB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAKH,eAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACjC,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC;YAC5D,oBAAoB,EAAE,IAAI;YAC1B,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAKH,gBAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAClC,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,aAAa,CAAC;YAC9B,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAKH,cAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAChC,aAAa,EAAE,WAAW;YAC1B,aAAa,EAAE,WAAW;YAC1B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,EAAE;YACjB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;QAKH,eAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACjC,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,CAAC,QAAQ,CAAC;YACzB,oBAAoB,EAAE,IAAI;YAC1B,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAKH,gBAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAClC,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,EAAE;YACjB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAvaD,MAAM,UAAU,GAAG,IAAA,oCAAmB,EAAC,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,0BAAW,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,UAAU,EAAE,YAAY,IAAI,EAAE,CAAC;IACrD,CAAC;IAoIO,eAAe,CACrB,GAAiB,EACjB,GAAkB,EAClB,IAAS,EACT,MAAc;QAEd,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAG3B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;YAC1B,GAAG,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;QACnC,CAAC;IACH,CAAC;IAKO,gBAAgB,CACtB,MAAuB,EACvB,GAAiB,EACjB,KAAU,EACV,YAAiB;QAEjB,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;QACnE,MAAM,aAAa,GAAG,IAAA,0BAAS,EAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;QAE5E,QAAQ,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAE5C,KAAK,UAAU;gBACb,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAExC,KAAK,SAAS;gBACZ,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAE9C,KAAK,WAAW;gBACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAExD,KAAK,YAAY;gBAEf,OAAO,YAAY,CAAC,OAAO,CAAC;gBAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAElD,KAAK,aAAa;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAE5C,KAAK,WAAW;gBACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAE/B,KAAK,YAAY;gBACf,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAE1B,KAAK,aAAa;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE7B;gBACE,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAKO,mBAAmB,CACzB,IAAS,EACT,GAAiB,EACjB,aAAqB;QAErB,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAExD,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxE,OAAO,IAAI,mBAAQ,CACjB,0DAA0D,EAC1D,GAAG,EACH,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACnB,CAAC;YACJ,CAAC;YAED,IACE,aAAa,KAAK,SAAS;gBAC3B,aAAa,KAAK,WAAW;gBAC7B,aAAa,KAAK,WAAW,EAC7B,CAAC;gBACD,IACE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;oBACpC,IAAI,IAAI,GAAG,CAAC,MAAM;oBAClB,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,EACtB,CAAC;oBACD,OAAO,IAAI,mBAAQ,CACjB,GAAG,IAAA,gCAAU,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,EAAE,YAAY,EAC3E,GAAG,EACH,EAAE,EACF,UAAU,CACX,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,mBAAQ,CACjB,GAAG,IAAA,gCAAU,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,EACjD,GAAG,EACH,EAAE,EACF,UAAU,CACX,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,aAAa,KAAK,YAAY,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;gBACrE,MAAM,QAAQ,GAAG,aAAa,KAAK,YAAY,CAAC;gBAChD,OAAO,IAAI,mBAAQ,CACjB,QAAQ;oBACN,CAAC,CAAC,GAAG,IAAA,mBAAS,EAAC,IAAA,gCAAU,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;oBAC9D,CAAC,CAAC,4BAA4B,EAChC,GAAG,EACH,EAAE,EACF,UAAU,CACX,CAAC;YACJ,CAAC;QACH,CAAC;QAGD,IACE,IAAI;YACJ,OAAO,IAAI,KAAK,QAAQ;YACxB,OAAO,IAAI,IAAI;YACf,IAAI,CAAC,KAAK,KAAK,CAAC,EAChB,CAAC;YACD,OAAO,IAAI,mBAAQ,CACjB,aAAa,KAAK,YAAY;gBAC5B,CAAC,CAAC,GAAG,IAAA,mBAAS,EAAC,IAAA,gCAAU,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;gBAC9D,CAAC,CAAC,4BAA4B,EAChC,GAAG,EACH,EAAE,EACF,UAAU,CACX,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAKO,sBAAsB,CAC5B,IAAS,EACT,cAAmB,EACnB,aAAqB;QAErB,IAAI,aAAa,KAAK,UAAU,IAAI,cAAc,EAAE,CAAC;YACnD,OAAO;gBACL,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,OAAO,EAAE,cAAc,CAAC,OAAO;gBAC/B,IAAI;aACL,CAAC;QACJ,CAAC;QAED,IACE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9B,IAAI;YACJ,OAAO,IAAI,KAAK,QAAQ;YACxB,OAAO,IAAI,IAAI,EACf,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QAED,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;CAkHF;AAhcD,wCAgcC;AAYY,QAAA,qBAAqB,GAAG,IAAA,qBAAU,EAC7C,KAAK,EAAE,CAAM,EAAE,GAAkB,EAAE,EAAE;IACnC,cAAI,CAAC,IAAI,CACP,qHAAqH,CACtH,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,EAAE;YACJ,GAAG,8BAAkB;iBAClB,yBAAyB,EAAE;iBAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,+BAAS,EAAC,KAAK,CAAC,CAAC;YACnC,aAAa;SACd;KACF,CAAC,CAAC;AACL,CAAC,CACF,CAAC","sourcesContent":["import { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { BaseService } from \"./base.service\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { kebabCase, pascalCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport pluralize from \"pluralize\";\nimport sheu from \"../../utils/sheu\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\nimport { APIFeatures } from \"../../exports/utils\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\n\nexport interface OperationHooks {\n beforeQuery?: (req: ArkosRequest) => void | Promise<void>;\n afterQuery?: (\n queryData: { where: any; queryOptions: any },\n req: ArkosRequest\n ) => void | Promise<void>;\n beforeService?: (args: any[], req: ArkosRequest) => any[] | Promise<any[]>;\n afterService?: (data: any, req: ArkosRequest) => any | Promise<any>;\n beforeResponse?: (responseData: any, req: ArkosRequest) => any | Promise<any>;\n}\n\ninterface OperationConfig {\n operationType: string;\n serviceMethod: string;\n successStatus: number;\n queryFeatures: (\"filter\" | \"sort\" | \"limitFields\" | \"paginate\")[];\n requiresQueryForBulk?: boolean;\n preventORFilter?: boolean;\n responseBuilder?: (data: any, additionalData?: any) => any;\n errorHandler?: (\n data: any,\n req: ArkosRequest,\n modelName: string\n ) => AppError | null;\n usesRequestParams?: boolean;\n usesRequestBody?: boolean;\n hooks?: OperationHooks;\n}\n\n/**\n * The `BaseController` class provides standardized RESTful API endpoints\n * for any Prisma model based on its name. It supports automatic integration\n * with Prisma services and dynamic middleware hooks for extending behaviors.\n *\n * This controller includes:\n * - `createOne` / `createMany`\n * - `findOne` / `findMany`\n * - `updateOne` / `updateMany`\n * - `deleteOne` / `deleteMany`\n *\n * It handles:\n * - Prisma query options\n * - APIFeatures: filtering, sorting, pagination, field limiting\n * - Middleware hooks: `afterCreateOne`, `afterUpdateMany`, etc.\n *\n * @class BaseController\n *\n * @param {string} modelName - The Prisma model name this controller handles.\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-controller-class}\n *--\n * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport class BaseController {\n /**\n * Service instance to handle business logic operations\n * @private\n */\n private service: BaseService<any>;\n\n /**\n * Name of the model this controller handles\n * @private\n */\n private modelName: string;\n\n /**\n * Model-specific interceptors loaded from model modules\n * @private\n */\n private interceptors: any;\n\n /**\n * Creates a new BaseController instance\n * @param {string} modelName - The name of the model for which this controller will handle operations\n */\n constructor(modelName: string) {\n const components = getModuleComponents(modelName);\n\n this.modelName = modelName;\n this.service = new BaseService(modelName);\n this.interceptors = components?.interceptors || {};\n }\n\n private executeOperation = (config: OperationConfig) => {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (config.hooks?.beforeQuery) {\n await config.hooks.beforeQuery(req);\n }\n\n if (config.requiresQueryForBulk) {\n if (\n Object.keys(req.query).every((key) =>\n [\"filterMode\", \"prismaQueryOptions\"].includes(key)\n )\n ) {\n return next(\n new AppError(\n `Filter criteria not provided for bulk ${config.operationType.replace(/Many$/, \"\")}.`,\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n }\n\n if (config.preventORFilter && req.query.filterMode === \"OR\") {\n throw new AppError(\n `req.query.filterMode === OR is not valid for ${config.operationType} operation`,\n 400\n );\n }\n\n if (config.preventORFilter) req.query.filterMode = \"AND\";\n\n let apiFeatures = new APIFeatures(req, this.modelName);\n\n config.queryFeatures.forEach((feature) => {\n switch (feature) {\n case \"filter\":\n apiFeatures = apiFeatures.filter();\n break;\n case \"sort\":\n apiFeatures = apiFeatures.sort();\n break;\n case \"limitFields\":\n apiFeatures = apiFeatures.limitFields();\n break;\n case \"paginate\":\n apiFeatures = apiFeatures.paginate();\n break;\n }\n });\n\n const { where, ...queryOptions } = apiFeatures.filters;\n\n if (config.hooks?.afterQuery)\n await config.hooks.afterQuery({ where, queryOptions }, req);\n\n let serviceArgs = this.buildServiceArgs(\n config,\n req,\n where,\n queryOptions\n );\n\n if (config.hooks?.beforeService)\n serviceArgs = await config.hooks.beforeService(serviceArgs, req);\n\n const serviceMethod = this.service[\n config.serviceMethod as keyof BaseService<any>\n ] as Function;\n let result = await serviceMethod.apply(this.service, serviceArgs);\n\n if (config.hooks?.afterService)\n result = await config.hooks.afterService(result, req);\n\n let data = result;\n let additionalData: any = null;\n\n if (config.operationType === \"findMany\") {\n const [records, total] = await Promise.all([\n result,\n this.service.count(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n ]);\n data = records;\n additionalData = { total, results: records.length };\n }\n\n const error = config.errorHandler\n ? config.errorHandler(data, req, this.modelName)\n : this.defaultErrorHandler(data, req, config.operationType);\n\n if (error) return next(error);\n\n let responseData = config.responseBuilder\n ? config.responseBuilder(data, additionalData)\n : this.defaultResponseBuilder(\n data,\n additionalData,\n config.operationType\n );\n\n if (config.hooks?.beforeResponse) {\n responseData = await config.hooks.beforeResponse(responseData, req);\n }\n\n const interceptorName = `after${config.operationType.charAt(0).toUpperCase()}${config.operationType.slice(1)}`;\n\n if (this.interceptors[interceptorName]) {\n this.setResponseData(req, res, responseData, config.successStatus);\n return next();\n }\n\n if (config.operationType === \"deleteOne\")\n return res.status(config.successStatus).send();\n\n res.status(config.successStatus).json(responseData);\n }\n );\n };\n\n /**\n * Sets response data for both legacy (req.responseData) and modern (res.locals) support\n */\n private setResponseData(\n req: ArkosRequest,\n res: ArkosResponse,\n data: any,\n status: number\n ): void {\n req.responseData = data;\n res.locals.data = data;\n req.responseStatus = status;\n res.locals.status = status;\n\n // Special handling for deleteOne\n if (status === 204) {\n req.additionalData = data;\n res.locals.additionalData = data;\n }\n }\n\n /**\n * Builds service method arguments based on operation configuration\n */\n private buildServiceArgs(\n config: OperationConfig,\n req: ArkosRequest,\n where: any,\n queryOptions: any\n ): any[] {\n const context = { user: req?.user, accessToken: req?.accessToken };\n const mergedOptions = deepmerge(req.prismaQueryOptions || {}, queryOptions);\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return [req.body, mergedOptions, context];\n\n case \"findMany\":\n return [where, queryOptions, context];\n\n case \"findOne\":\n return [req.params, mergedOptions, context];\n\n case \"updateOne\":\n return [req.params, req.body, mergedOptions, context];\n\n case \"updateMany\":\n // Remove include for bulk operations\n delete queryOptions.include;\n return [where, req.body, queryOptions, context];\n\n case \"batchUpdate\":\n return [req.body, mergedOptions, context];\n\n case \"deleteOne\":\n return [req.params, context];\n\n case \"deleteMany\":\n return [where, context];\n\n case \"batchDelete\":\n return [req.body, context];\n\n default:\n throw new Error(`Unknown operation type: ${config.operationType}`);\n }\n }\n\n /**\n * Default error handler for operations\n */\n private defaultErrorHandler(\n data: any,\n req: ArkosRequest,\n operationType: string\n ): AppError | null {\n if (!data || (Array.isArray(data) && data.length === 0)) {\n // Handle different error scenarios\n if (operationType.includes(\"create\") || operationType.includes(\"batch\")) {\n return new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n { body: req.body }\n );\n }\n\n if (\n operationType === \"findOne\" ||\n operationType === \"updateOne\" ||\n operationType === \"deleteOne\"\n ) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return new AppError(\n `${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`,\n 404,\n {},\n \"NotFound\"\n );\n } else {\n return new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n if (operationType === \"updateMany\" || operationType === \"deleteMany\") {\n const isUpdate = operationType === \"updateMany\";\n return new AppError(\n isUpdate\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n // Special handling for operations that return count\n if (\n data &&\n typeof data === \"object\" &&\n \"count\" in data &&\n data.count === 0\n ) {\n return new AppError(\n operationType === \"updateMany\"\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n\n return null;\n }\n\n /**\n * Default response builder for operations\n */\n private defaultResponseBuilder(\n data: any,\n additionalData: any,\n operationType: string\n ): any {\n if (operationType === \"findMany\" && additionalData) {\n return {\n total: additionalData.total,\n results: additionalData.results,\n data,\n };\n }\n\n if (\n operationType.includes(\"Many\") &&\n data &&\n typeof data === \"object\" &&\n \"count\" in data\n ) {\n return { results: data.count, data };\n }\n\n if (operationType.includes(\"batch\") && Array.isArray(data)) {\n return { results: data.length, data };\n }\n\n return { data };\n }\n\n /**\n * Creates a single resource\n */\n createOne = this.executeOperation({\n operationType: \"createOne\",\n serviceMethod: \"createOne\",\n successStatus: 201,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Creates multiple resources in a single operation\n */\n createMany = this.executeOperation({\n operationType: \"createMany\",\n serviceMethod: \"createMany\",\n successStatus: 201,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n */\n findMany = this.executeOperation({\n operationType: \"findMany\",\n serviceMethod: \"findMany\",\n successStatus: 200,\n queryFeatures: [\"filter\", \"sort\", \"limitFields\", \"paginate\"],\n });\n\n /**\n * Retrieves a single resource by its identifier\n */\n findOne = this.executeOperation({\n operationType: \"findOne\",\n serviceMethod: \"findOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n });\n\n /**\n * Updates a single resource by its identifier\n */\n updateOne = this.executeOperation({\n operationType: \"updateOne\",\n serviceMethod: \"updateOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources that match specified criteria\n */\n updateMany = this.executeOperation({\n operationType: \"updateMany\",\n serviceMethod: \"updateMany\",\n successStatus: 200,\n queryFeatures: [\"filter\", \"sort\", \"limitFields\", \"paginate\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources with different data in a single transaction\n */\n batchUpdate = this.executeOperation({\n operationType: \"batchUpdate\",\n serviceMethod: \"batchUpdate\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Deletes a single resource by its identifier\n */\n deleteOne = this.executeOperation({\n operationType: \"deleteOne\",\n serviceMethod: \"deleteOne\",\n successStatus: 204,\n queryFeatures: [],\n usesRequestParams: true,\n });\n\n /**\n * Deletes multiple resources that match specified criteria\n */\n deleteMany = this.executeOperation({\n operationType: \"deleteMany\",\n serviceMethod: \"deleteMany\",\n successStatus: 200,\n queryFeatures: [\"filter\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n });\n\n /**\n * Deletes multiple resources with different filters in a single transaction\n */\n batchDelete = this.executeOperation({\n operationType: \"batchDelete\",\n serviceMethod: \"batchDelete\",\n successStatus: 200,\n queryFeatures: [],\n usesRequestBody: true,\n });\n}\n\n/**\n * Returns a list of all available resource endpoints based on the application's models\n *\n * Will soon be removed\n *\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\nexport const getAvailableResources = catchAsync(\n async (_: any, res: ArkosResponse) => {\n sheu.warn(\n \"This route `/api/available-resources` will be deprecated from 1.4.0-beta, consider using /api/auth-actions instead.\"\n );\n\n res.status(200).json({\n data: [\n ...prismaSchemaParser\n .getModelsAsArrayOfStrings()\n .map((model) => kebabCase(model)),\n \"file-upload\",\n ],\n });\n }\n);\n"]}
|
|
1
|
+
{"version":3,"file":"base.controller.js","sourceRoot":"","sources":["../../../../src/modules/base/base.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { BaseService } from \"./base.service\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { kebabCase, pascalCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport pluralize from \"pluralize\";\nimport sheu from \"../../utils/sheu\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\nimport { APIFeatures } from \"../../exports/utils\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\n\nexport interface OperationHooks {\n beforeQuery?: (req: ArkosRequest) => void | Promise<void>;\n afterQuery?: (\n queryData: { where: any; queryOptions: any },\n req: ArkosRequest\n ) => void | Promise<void>;\n beforeService?: (args: any[], req: ArkosRequest) => any[] | Promise<any[]>;\n afterService?: (data: any, req: ArkosRequest) => any | Promise<any>;\n beforeResponse?: (responseData: any, req: ArkosRequest) => any | Promise<any>;\n}\n\ninterface OperationConfig {\n operationType: string;\n serviceMethod: string;\n successStatus: number;\n queryFeatures: (\"filter\" | \"sort\" | \"limitFields\" | \"paginate\")[];\n requiresQueryForBulk?: boolean;\n preventORFilter?: boolean;\n responseBuilder?: (data: any, additionalData?: any) => any;\n errorHandler?: (\n data: any,\n req: ArkosRequest,\n modelName: string\n ) => AppError | null;\n usesRequestParams?: boolean;\n usesRequestBody?: boolean;\n hooks?: OperationHooks;\n}\n\n/**\n * The `BaseController` class provides standardized RESTful API endpoints\n * for any Prisma model based on its name. It supports automatic integration\n * with Prisma services and dynamic middleware hooks for extending behaviors.\n *\n * This controller includes:\n * - `createOne` / `createMany`\n * - `findOne` / `findMany`\n * - `updateOne` / `updateMany`\n * - `deleteOne` / `deleteMany`\n *\n * It handles:\n * - Prisma query options\n * - APIFeatures: filtering, sorting, pagination, field limiting\n * - Middleware hooks: `afterCreateOne`, `afterUpdateMany`, etc.\n *\n * @class BaseController\n *\n * @param {string} modelName - The Prisma model name this controller handles.\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-controller-class}\n *--\n * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport class BaseController {\n /**\n * Service instance to handle business logic operations\n * @private\n */\n private service: BaseService<any>;\n\n /**\n * Name of the model this controller handles\n * @private\n */\n private modelName: string;\n\n /**\n * Model-specific interceptors loaded from model modules\n * @private\n */\n private interceptors: any;\n\n /**\n * Creates a new BaseController instance\n * @param {string} modelName - The name of the model for which this controller will handle operations\n */\n constructor(modelName: string) {\n const components = getModuleComponents(modelName);\n\n this.modelName = modelName;\n this.service = new BaseService(modelName);\n this.interceptors = components?.interceptors || {};\n }\n\n private executeOperation = (config: OperationConfig) => {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (config.hooks?.beforeQuery) await config.hooks.beforeQuery(req);\n\n if (config.requiresQueryForBulk) {\n if (\n Object.keys(req.query).every((key) =>\n [\"filterMode\", \"prismaQueryOptions\"].includes(key)\n )\n ) {\n return next(\n new AppError(\n `Filter criteria not provided for bulk ${config.operationType.replace(/Many$/, \"\")}.`,\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n }\n\n if (config.preventORFilter && req.query.filterMode === \"OR\") {\n throw new AppError(\n `req.query.filterMode === OR is not valid for ${config.operationType} operation`,\n 400\n );\n }\n\n if (config.preventORFilter) req.query.filterMode = \"AND\";\n\n let apiFeatures = new APIFeatures(req, this.modelName);\n\n config.queryFeatures.forEach((feature) => {\n switch (feature) {\n case \"filter\":\n apiFeatures = apiFeatures.filter();\n break;\n case \"sort\":\n apiFeatures = apiFeatures.sort();\n break;\n case \"limitFields\":\n apiFeatures = apiFeatures.limitFields();\n break;\n case \"paginate\":\n apiFeatures = apiFeatures.paginate();\n break;\n }\n });\n\n const { where, ...queryOptions } = apiFeatures.filters;\n\n if (config.hooks?.afterQuery)\n await config.hooks.afterQuery({ where, queryOptions }, req);\n\n let serviceArgs = this.buildServiceArgs(\n config,\n req,\n where,\n queryOptions\n );\n\n if (config.hooks?.beforeService)\n serviceArgs = await config.hooks.beforeService(serviceArgs, req);\n\n const serviceMethod = this.service[\n config.serviceMethod as keyof BaseService<any>\n ] as Function;\n let result = await serviceMethod.apply(this.service, serviceArgs);\n\n if (config.hooks?.afterService)\n result = await config.hooks.afterService(result, req);\n\n let data = result;\n let additionalData: any = null;\n\n if (config.operationType === \"findMany\") {\n const [records, total] = await Promise.all([\n result,\n this.service.count(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n ]);\n data = records;\n additionalData = { total, results: records.length };\n }\n\n const error = config.errorHandler\n ? config.errorHandler(data, req, this.modelName)\n : this.defaultErrorHandler(data, req, config.operationType);\n\n if (error) return next(error);\n\n let responseData = config.responseBuilder\n ? config.responseBuilder(data, additionalData)\n : this.defaultResponseBuilder(\n data,\n additionalData,\n config.operationType\n );\n\n if (config.hooks?.beforeResponse) {\n responseData = await config.hooks.beforeResponse(responseData, req);\n }\n\n const interceptorName = `after${config.operationType.charAt(0).toUpperCase()}${config.operationType.slice(1)}`;\n\n if (this.interceptors[interceptorName]) {\n this.setResponseData(req, res, responseData, config.successStatus);\n return next();\n }\n\n if (config.operationType === \"deleteOne\")\n return res.status(config.successStatus).send();\n\n res.status(config.successStatus).json(responseData);\n }\n );\n };\n\n /**\n * Sets response data for both legacy (req.responseData) and modern (res.locals) support\n */\n private setResponseData(\n req: ArkosRequest,\n res: ArkosResponse,\n data: any,\n status: number\n ): void {\n (res as any).originalData = data;\n req.responseData = data;\n res.locals.data = data;\n (res as any).originalStatus = status;\n req.responseStatus = status;\n res.locals.status = status;\n\n // Special handling for deleteOne\n if (status === 204) {\n req.additionalData = data;\n res.locals.additionalData = data;\n (res as any).originalAdditionalData = data;\n }\n }\n\n /**\n * Builds service method arguments based on operation configuration\n */\n private buildServiceArgs(\n config: OperationConfig,\n req: ArkosRequest,\n where: any,\n queryOptions: any\n ): any[] {\n const context = { user: req?.user, accessToken: req?.accessToken };\n const mergedOptions = deepmerge(req.prismaQueryOptions || {}, queryOptions);\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return [req.body, mergedOptions, context];\n\n case \"findMany\":\n return [where, queryOptions, context];\n\n case \"findOne\":\n return [req.params, mergedOptions, context];\n\n case \"updateOne\":\n return [req.params, req.body, mergedOptions, context];\n\n case \"updateMany\":\n // Remove include for bulk operations\n delete queryOptions.include;\n return [where, req.body, queryOptions, context];\n\n case \"batchUpdate\":\n return [req.body, mergedOptions, context];\n\n case \"deleteOne\":\n return [req.params, context];\n\n case \"deleteMany\":\n return [where, context];\n\n case \"batchDelete\":\n return [req.body, context];\n\n default:\n throw new Error(`Unknown operation type: ${config.operationType}`);\n }\n }\n\n /**\n * Default error handler for operations\n */\n private defaultErrorHandler(\n data: any,\n req: ArkosRequest,\n operationType: string\n ): AppError | null {\n if (!data || (Array.isArray(data) && data.length === 0)) {\n // Handle different error scenarios\n if (operationType.includes(\"create\") || operationType.includes(\"batch\")) {\n return new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n { body: req.body }\n );\n }\n\n if (\n operationType === \"findOne\" ||\n operationType === \"updateOne\" ||\n operationType === \"deleteOne\"\n ) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return new AppError(\n `${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`,\n 404,\n {},\n \"NotFound\"\n );\n } else {\n return new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n if (operationType === \"updateMany\" || operationType === \"deleteMany\") {\n const isUpdate = operationType === \"updateMany\";\n return new AppError(\n isUpdate\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n // Special handling for operations that return count\n if (\n data &&\n typeof data === \"object\" &&\n \"count\" in data &&\n data.count === 0\n ) {\n return new AppError(\n operationType === \"updateMany\"\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n\n return null;\n }\n\n /**\n * Default response builder for operations\n */\n private defaultResponseBuilder(\n data: any,\n additionalData: any,\n operationType: string\n ): any {\n if (operationType === \"findMany\" && additionalData) {\n return {\n total: additionalData.total,\n results: additionalData.results,\n data,\n };\n }\n\n if (\n operationType.includes(\"Many\") &&\n data &&\n typeof data === \"object\" &&\n \"count\" in data\n ) {\n return { results: data.count, data };\n }\n\n if (operationType.includes(\"batch\") && Array.isArray(data)) {\n return { results: data.length, data };\n }\n\n return { data };\n }\n\n /**\n * Creates a single resource\n */\n createOne = this.executeOperation({\n operationType: \"createOne\",\n serviceMethod: \"createOne\",\n successStatus: 201,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Creates multiple resources in a single operation\n */\n createMany = this.executeOperation({\n operationType: \"createMany\",\n serviceMethod: \"createMany\",\n successStatus: 201,\n queryFeatures: [],\n usesRequestBody: true,\n });\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n */\n findMany = this.executeOperation({\n operationType: \"findMany\",\n serviceMethod: \"findMany\",\n successStatus: 200,\n queryFeatures: [\"filter\", \"sort\", \"limitFields\", \"paginate\"],\n });\n\n /**\n * Retrieves a single resource by its identifier\n */\n findOne = this.executeOperation({\n operationType: \"findOne\",\n serviceMethod: \"findOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n });\n\n /**\n * Updates a single resource by its identifier\n */\n updateOne = this.executeOperation({\n operationType: \"updateOne\",\n serviceMethod: \"updateOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources that match specified criteria\n */\n updateMany = this.executeOperation({\n operationType: \"updateMany\",\n serviceMethod: \"updateMany\",\n successStatus: 200,\n queryFeatures: [\"filter\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources with different data in a single transaction\n */\n batchUpdate = this.executeOperation({\n operationType: \"batchUpdate\",\n serviceMethod: \"batchUpdate\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Deletes a single resource by its identifier\n */\n deleteOne = this.executeOperation({\n operationType: \"deleteOne\",\n serviceMethod: \"deleteOne\",\n successStatus: 204,\n queryFeatures: [],\n usesRequestParams: true,\n });\n\n /**\n * Deletes multiple resources that match specified criteria\n */\n deleteMany = this.executeOperation({\n operationType: \"deleteMany\",\n serviceMethod: \"deleteMany\",\n successStatus: 200,\n queryFeatures: [\"filter\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n });\n\n /**\n * Deletes multiple resources with different filters in a single transaction\n */\n batchDelete = this.executeOperation({\n operationType: \"batchDelete\",\n serviceMethod: \"batchDelete\",\n successStatus: 200,\n queryFeatures: [],\n usesRequestBody: true,\n });\n}\n\n/**\n * Returns a list of all available resource endpoints based on the application's models\n *\n * Will soon be removed\n *\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\nexport const getAvailableResources = catchAsync(\n async (_: any, res: ArkosResponse) => {\n sheu.warn(\n \"This route `/api/available-resources` will be deprecated from 1.4.0-beta, consider using /api/auth-actions instead.\"\n );\n\n res.status(200).json({\n data: [\n ...prismaSchemaParser\n .getModelsAsArrayOfStrings()\n .map((model) => kebabCase(model)),\n \"file-upload\",\n ],\n });\n }\n);\n"]}
|
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.callNext = callNext;
|
|
7
7
|
exports.sendResponse = sendResponse;
|
|
8
|
-
exports.addRouteMiddlwaresAndConfigs = addRouteMiddlwaresAndConfigs;
|
|
9
8
|
exports.addPrismaQueryOptionsToRequest = addPrismaQueryOptionsToRequest;
|
|
10
9
|
exports.handleRequestLogs = handleRequestLogs;
|
|
11
10
|
exports.handleRequestBodyValidationAndTransformation = handleRequestBodyValidationAndTransformation;
|
|
@@ -21,19 +20,78 @@ const dynamic_loader_1 = require("../../utils/dynamic-loader");
|
|
|
21
20
|
function callNext(_, _1, next) {
|
|
22
21
|
next();
|
|
23
22
|
}
|
|
23
|
+
function deepEqual(a, b) {
|
|
24
|
+
if (a === b)
|
|
25
|
+
return true;
|
|
26
|
+
if (a == null || b == null)
|
|
27
|
+
return false;
|
|
28
|
+
if (typeof a !== "object" || typeof b !== "object")
|
|
29
|
+
return a === b;
|
|
30
|
+
const keysA = Object.keys(a);
|
|
31
|
+
const keysB = Object.keys(b);
|
|
32
|
+
if (keysA.length !== keysB.length)
|
|
33
|
+
return false;
|
|
34
|
+
for (const key of keysA) {
|
|
35
|
+
if (!keysB.includes(key))
|
|
36
|
+
return false;
|
|
37
|
+
if (!deepEqual(a[key], b[key]))
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
24
42
|
function sendResponse(req, res) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
43
|
+
let responseData;
|
|
44
|
+
let responseStatus;
|
|
45
|
+
const originalData = res.originalData;
|
|
46
|
+
const originalStatus = res.originalStatus;
|
|
47
|
+
const currentReqData = req.responseData;
|
|
48
|
+
const currentReqStatus = req.responseStatus;
|
|
49
|
+
const currentLocalsData = res.locals?.data;
|
|
50
|
+
const currentLocalsStatus = res.locals?.status;
|
|
51
|
+
if (currentReqData !== undefined &&
|
|
52
|
+
!deepEqual(currentReqData, originalData)) {
|
|
53
|
+
responseData = currentReqData;
|
|
54
|
+
}
|
|
55
|
+
else if (currentLocalsData !== undefined &&
|
|
56
|
+
!deepEqual(currentLocalsData, originalData)) {
|
|
57
|
+
responseData = currentLocalsData;
|
|
58
|
+
}
|
|
59
|
+
else if (originalData !== undefined) {
|
|
60
|
+
responseData = originalData;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
responseData = currentReqData ?? currentLocalsData;
|
|
64
|
+
}
|
|
65
|
+
if (currentReqStatus !== undefined && currentReqStatus !== originalStatus) {
|
|
66
|
+
responseStatus = currentReqStatus;
|
|
67
|
+
}
|
|
68
|
+
else if (currentLocalsStatus !== undefined &&
|
|
69
|
+
currentLocalsStatus !== originalStatus) {
|
|
70
|
+
responseStatus = currentLocalsStatus;
|
|
71
|
+
}
|
|
72
|
+
else if (originalStatus !== undefined) {
|
|
73
|
+
responseStatus = originalStatus;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
responseStatus = currentReqStatus ?? currentLocalsStatus;
|
|
77
|
+
}
|
|
78
|
+
if (Number(responseStatus) === 204) {
|
|
79
|
+
res.status(Number(responseStatus)).send();
|
|
80
|
+
}
|
|
81
|
+
else if ((responseData !== undefined || responseData !== null) &&
|
|
82
|
+
responseStatus) {
|
|
83
|
+
res.status(Number(responseStatus)).json(responseData);
|
|
84
|
+
}
|
|
85
|
+
else if (Number(responseStatus) &&
|
|
86
|
+
(responseData === undefined || responseData === null)) {
|
|
87
|
+
res.status(Number(responseStatus)).send();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
res.status(500).json({
|
|
91
|
+
message: "No status or data attached to the response",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
35
94
|
}
|
|
36
|
-
function addRouteMiddlwaresAndConfigs() { }
|
|
37
95
|
function addPrismaQueryOptionsToRequest(prismaQueryOptions, action) {
|
|
38
96
|
return (req, _, next) => {
|
|
39
97
|
const configs = (0, server_1.getArkosConfig)();
|
|
@@ -92,13 +150,22 @@ function handleRequestBodyValidationAndTransformation(schemaOrDtoClass, classVal
|
|
|
92
150
|
next();
|
|
93
151
|
});
|
|
94
152
|
}
|
|
95
|
-
function validateRequestInputs(
|
|
153
|
+
function validateRequestInputs(routeConfig) {
|
|
96
154
|
const arkosConfig = (0, server_1.getArkosConfig)();
|
|
97
155
|
const validationConfig = arkosConfig.validation;
|
|
98
156
|
const strictValidation = validationConfig?.strict;
|
|
99
|
-
const validators =
|
|
157
|
+
const validators = routeConfig?.validation;
|
|
158
|
+
const openapi = routeConfig?.experimental?.openapi;
|
|
159
|
+
const validationToParameterMapping = {
|
|
160
|
+
query: "query",
|
|
161
|
+
params: "path",
|
|
162
|
+
headers: "header",
|
|
163
|
+
cookies: "cookie",
|
|
164
|
+
};
|
|
100
165
|
if (!validationConfig?.resolver && validators)
|
|
101
|
-
throw Error("Trying to pass validators into route config validation option without choosing a validation resolver under arkos
|
|
166
|
+
throw Error("Trying to pass validators into route config validation option without choosing a validation resolver under arkos config { validation: {} }.");
|
|
167
|
+
if (validators === true)
|
|
168
|
+
throw Error(`Invalid value ${validators} passed to validation option, it can only receive false or object of { query, body, params }.`);
|
|
102
169
|
const validatorFn = validationConfig?.resolver == "zod" ? validate_schema_1.default : validate_dto_1.default;
|
|
103
170
|
const validatorsKey = [
|
|
104
171
|
"body",
|
|
@@ -106,22 +173,38 @@ function validateRequestInputs(validationRouteConfig) {
|
|
|
106
173
|
"params",
|
|
107
174
|
];
|
|
108
175
|
const isValidValidator = validationConfig?.resolver == "zod" ? dynamic_loader_1.isZodSchema : dynamic_loader_1.isClass;
|
|
109
|
-
const validatorName = validationConfig?.resolver == "zod" ? "
|
|
176
|
+
const validatorName = validationConfig?.resolver == "zod" ? "zod schema" : "class-validator dto";
|
|
110
177
|
const validatorNameType = validationConfig?.resolver == "zod" ? "Schema" : "Dto";
|
|
111
|
-
if (validators)
|
|
178
|
+
if (typeof validators === "object")
|
|
112
179
|
validatorsKey.forEach((key) => {
|
|
180
|
+
if (openapi &&
|
|
181
|
+
typeof openapi === "object" &&
|
|
182
|
+
key != "body" &&
|
|
183
|
+
openapi.parameters?.some((parameter) => parameter.in === validationToParameterMapping[key]) &&
|
|
184
|
+
validators[key]) {
|
|
185
|
+
throw Error(`When usign validation.${key} you must not define parameters under openapi.parameters as documentation of req.${key} because the ${validatorName} you passed under validation.${key} will be added as jsonSchema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`);
|
|
186
|
+
}
|
|
187
|
+
if (openapi &&
|
|
188
|
+
typeof openapi === "object" &&
|
|
189
|
+
openapi.requestBody &&
|
|
190
|
+
validators[key] &&
|
|
191
|
+
key === "body") {
|
|
192
|
+
throw Error(`When usign validation.${key} you must not define json-schema under openapi.requestBody as documentation for req.${key}, because the ${validatorName} you passed under validation.${key} will be added as json-schema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`);
|
|
193
|
+
}
|
|
113
194
|
if (strictValidation && !(key in validators))
|
|
114
195
|
throw Error(`No { validation: { ${key}: ${validatorNameType} } } was found, while using strict validation you will need to pass undefined into ${key} in order to deny any request ${key} input.`);
|
|
115
196
|
if (key in validators &&
|
|
116
197
|
validators?.[key] !== undefined &&
|
|
117
198
|
!isValidValidator(validators[key]))
|
|
118
|
-
throw Error(`
|
|
199
|
+
throw Error(`Your validation resolver is set to ${arkosConfig.validation.resolver}, please provide a valid ${validatorName} in order to use in { validation: { ${key}: ${validatorNameType} } } under route ${routeConfig.route}`);
|
|
119
200
|
});
|
|
120
201
|
return (0, error_handler_1.catchAsync)(async (req, _, next) => {
|
|
121
202
|
for (const key of validatorsKey) {
|
|
203
|
+
if (typeof validators === "boolean" && validators === false)
|
|
204
|
+
throw new error_handler_1.AppError(`No request ${key} is allowed on this route`, 400, `NoRequest${(0, text_helpers_1.capitalize)(key)}Allowed`, { [key]: req[key] });
|
|
122
205
|
const validator = validators?.[key];
|
|
123
206
|
if (strictValidation && !validator && Object.keys(req[key]).length > 0)
|
|
124
|
-
throw new error_handler_1.AppError(`No request ${key} is allowed on this route`, 400,
|
|
207
|
+
throw new error_handler_1.AppError(`No request ${key} is allowed on this route`, 400, `NoRequest${(0, text_helpers_1.capitalize)(key)}Allowed`, { [key]: req[key] });
|
|
125
208
|
if (validator)
|
|
126
209
|
req[key] = await validatorFn(validator, req[key]);
|
|
127
210
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AppError, catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\nimport { ArkosRouteConfig } from \"../../utils/arkos-router/types\";\nimport { capitalize } from \"../../utils/helpers/text.helpers\";\nimport { isClass, isZodSchema } from \"../../utils/dynamic-loader\";\n\nexport function callNext(_: Request, _1: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(req: ArkosRequest, res: ArkosResponse) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, _: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now();\n\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\";\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime;\n\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\";\n const statusColor = getStatusColor(res.statusCode);\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next();\n}\n\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n\nexport function validateRequestInputs(\n validationRouteConfig: Pick<ArkosRouteConfig, \"validation\">\n) {\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const strictValidation = validationConfig?.strict;\n const validators = validationRouteConfig?.validation;\n\n if (!validationConfig?.resolver && validators)\n throw Error(\n \"Trying to pass validators into route config validation option without choosing a validation resolver under arkos.init({ validation: {} }).\"\n );\n\n const validatorFn: (validator: any, data: any) => Promise<any> =\n validationConfig?.resolver == \"zod\" ? validateSchema : validateDto;\n const validatorsKey: (\"body\" | \"query\" | \"params\")[] = [\n \"body\",\n \"query\",\n \"params\",\n ];\n\n const isValidValidator =\n validationConfig?.resolver == \"zod\" ? isZodSchema : isClass;\n const validatorName =\n validationConfig?.resolver == \"zod\" ? \"Zod Schema\" : \"Class-Validator Dto\";\n const validatorNameType =\n validationConfig?.resolver == \"zod\" ? \"Schema\" : \"Dto\";\n\n if (validators)\n validatorsKey.forEach((key) => {\n if (strictValidation && !(key in validators))\n throw Error(\n `No { validation: { ${key}: ${validatorNameType} } } was found, while using strict validation you will need to pass undefined into ${key} in order to deny any request ${key} input.`\n );\n\n if (\n key in validators &&\n validators?.[key] !== undefined &&\n !isValidValidator(validators[key])\n )\n throw Error(\n `Please provide a valid ${validatorName} in order to use in { validation: { ${key}: ${validatorNameType} } }`\n );\n });\n\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n for (const key of validatorsKey) {\n const validator = validators?.[key];\n\n if (strictValidation && !validator && Object.keys(req[key]).length > 0)\n throw new AppError(\n `No request ${key} is allowed on this route`,\n 400,\n { [key]: req[key] },\n `NoRequest${capitalize(key)}Allowed`\n );\n\n if (validator) req[key] = await validatorFn(validator, req[key]);\n }\n\n next();\n }\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AppError, catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\nimport { ArkosRouteConfig } from \"../../utils/arkos-router/types\";\nimport { capitalize } from \"../../utils/helpers/text.helpers\";\nimport { isClass, isZodSchema } from \"../../utils/dynamic-loader\";\n\nexport function callNext(_: Request, _1: Response, next: NextFunction) {\n next();\n}\n\n/**\n * Deep comparison helper for objects\n */\nfunction deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== \"object\" || typeof b !== \"object\") return a === b;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n}\n\n/**\n * Sends response with backward compatibility support\n * Compares current values against original values to detect middleware changes\n * If values were modified by subsequent middleware, use the modified version\n */\nexport function sendResponse(req: ArkosRequest, res: ArkosResponse) {\n let responseData;\n let responseStatus;\n\n const originalData = (res as any).originalData;\n const originalStatus = (res as any).originalStatus;\n\n const currentReqData = req.responseData;\n const currentReqStatus = req.responseStatus;\n const currentLocalsData = res.locals?.data;\n const currentLocalsStatus = res.locals?.status;\n\n if (\n currentReqData !== undefined &&\n !deepEqual(currentReqData, originalData)\n ) {\n responseData = currentReqData;\n } else if (\n currentLocalsData !== undefined &&\n !deepEqual(currentLocalsData, originalData)\n ) {\n responseData = currentLocalsData;\n } else if (originalData !== undefined) {\n responseData = originalData;\n } else {\n responseData = currentReqData ?? currentLocalsData;\n }\n\n if (currentReqStatus !== undefined && currentReqStatus !== originalStatus) {\n responseStatus = currentReqStatus;\n } else if (\n currentLocalsStatus !== undefined &&\n currentLocalsStatus !== originalStatus\n ) {\n responseStatus = currentLocalsStatus;\n } else if (originalStatus !== undefined) {\n responseStatus = originalStatus;\n } else {\n responseStatus = currentReqStatus ?? currentLocalsStatus;\n }\n\n // Send response\n\n if (Number(responseStatus) === 204) {\n res.status(Number(responseStatus)).send();\n } else if (\n (responseData !== undefined || responseData !== null) &&\n responseStatus\n ) {\n res.status(Number(responseStatus)).json(responseData);\n } else if (\n Number(responseStatus) &&\n (responseData === undefined || responseData === null)\n ) {\n res.status(Number(responseStatus)).send();\n } else {\n res.status(500).json({\n message: \"No status or data attached to the response\",\n });\n }\n}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, _: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now();\n\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\";\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\";\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\";\n if (statusCode >= 500) return \"\\x1b[31m\";\n return \"\\x1b[0m\";\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime;\n\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\";\n const statusColor = getStatusColor(res.statusCode);\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next();\n}\n\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n\nexport function validateRequestInputs(routeConfig: ArkosRouteConfig) {\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const strictValidation = validationConfig?.strict;\n const validators = routeConfig?.validation;\n const openapi = routeConfig?.experimental?.openapi;\n\n const validationToParameterMapping = {\n query: \"query\",\n params: \"path\",\n headers: \"header\",\n cookies: \"cookie\",\n };\n\n if (!validationConfig?.resolver && validators)\n throw Error(\n \"Trying to pass validators into route config validation option without choosing a validation resolver under arkos config { validation: {} }.\"\n );\n\n if ((validators as any) === true)\n throw Error(\n `Invalid value ${validators} passed to validation option, it can only receive false or object of { query, body, params }.`\n );\n\n const validatorFn: (validator: any, data: any) => Promise<any> =\n validationConfig?.resolver == \"zod\" ? validateSchema : validateDto;\n const validatorsKey: (\"body\" | \"query\" | \"params\")[] = [\n \"body\",\n \"query\",\n \"params\",\n ];\n\n const isValidValidator =\n validationConfig?.resolver == \"zod\" ? isZodSchema : isClass;\n const validatorName =\n validationConfig?.resolver == \"zod\" ? \"zod schema\" : \"class-validator dto\";\n const validatorNameType =\n validationConfig?.resolver == \"zod\" ? \"Schema\" : \"Dto\";\n\n if (typeof validators === \"object\")\n validatorsKey.forEach((key) => {\n if (\n openapi &&\n typeof openapi === \"object\" &&\n key != \"body\" &&\n openapi.parameters?.some(\n (parameter: any) => parameter.in === validationToParameterMapping[key]\n ) &&\n validators[key]\n ) {\n throw Error(\n `When usign validation.${key} you must not define parameters under openapi.parameters as documentation of req.${key} because the ${validatorName} you passed under validation.${key} will be added as jsonSchema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`\n );\n }\n\n if (\n openapi &&\n typeof openapi === \"object\" &&\n openapi.requestBody &&\n validators[key] &&\n key === \"body\"\n ) {\n throw Error(\n `When usign validation.${key} you must not define json-schema under openapi.requestBody as documentation for req.${key}, because the ${validatorName} you passed under validation.${key} will be added as json-schema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`\n );\n }\n\n if (strictValidation && !(key in validators))\n throw Error(\n `No { validation: { ${key}: ${validatorNameType} } } was found, while using strict validation you will need to pass undefined into ${key} in order to deny any request ${key} input.`\n );\n\n if (\n key in validators &&\n validators?.[key] !== undefined &&\n !isValidValidator(validators[key])\n )\n throw Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, please provide a valid ${validatorName} in order to use in { validation: { ${key}: ${validatorNameType} } } under route ${routeConfig.route}`\n );\n });\n\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n for (const key of validatorsKey) {\n if (typeof validators === \"boolean\" && validators === false)\n throw new AppError(\n `No request ${key} is allowed on this route`,\n 400,\n `NoRequest${capitalize(key)}Allowed`,\n { [key]: req[key] }\n );\n\n const validator = validators?.[key];\n\n if (strictValidation && !validator && Object.keys(req[key]).length > 0)\n throw new AppError(\n `No request ${key} is allowed on this route`,\n 400,\n `NoRequest${capitalize(key)}Allowed`,\n { [key]: req[key] }\n );\n\n if (validator) req[key] = await validatorFn(validator, req[key]);\n }\n\n next();\n }\n );\n}\n"]}
|
|
@@ -9,9 +9,10 @@ const express_1 = require("express");
|
|
|
9
9
|
const base_controller_1 = require("./base.controller");
|
|
10
10
|
const auth_service_1 = __importDefault(require("../auth/auth.service"));
|
|
11
11
|
const base_router_helpers_1 = require("./utils/helpers/base.router.helpers");
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
const exports_1 = require("../../exports");
|
|
13
|
+
function getPrismaModelsRouter(arkosConfigs) {
|
|
14
|
+
const router = (0, exports_1.ArkosRouter)();
|
|
15
|
+
(0, base_router_helpers_1.setupRouters)(router, arkosConfigs);
|
|
15
16
|
return router;
|
|
16
17
|
}
|
|
17
18
|
function getAvailableResourcesAndRoutesRouter() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.router.js","sourceRoot":"","sources":["../../../../src/modules/base/base.router.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"base.router.js","sourceRoot":"","sources":["../../../../src/modules/base/base.router.ts"],"names":[],"mappings":";;;;;AAOA,sDAMC;AAED,oFAUC;AAzBD,qCAAiC;AACjC,uDAA0D;AAC1D,wEAA+C;AAE/C,6EAAmE;AACnE,2CAA4C;AAE5C,SAAgB,qBAAqB,CAAC,YAAyB;IAC7D,MAAM,MAAM,GAAG,IAAA,qBAAW,GAAE,CAAC;IAE7B,IAAA,kCAAY,EAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,oCAAoC;IAClD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CACR,sBAAsB,EACtB,sBAAW,EAAE,YAAY,EACzB,uCAAqB,CACtB,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { Router } from \"express\";\nimport { getAvailableResources } from \"./base.controller\";\nimport authService from \"../auth/auth.service\";\nimport { ArkosConfig } from \"../../types/new-arkos-config\";\nimport { setupRouters } from \"./utils/helpers/base.router.helpers\";\nimport { ArkosRouter } from \"../../exports\";\n\nexport function getPrismaModelsRouter(arkosConfigs: ArkosConfig) {\n const router = ArkosRouter();\n\n setupRouters(router, arkosConfigs);\n\n return router;\n}\n\nexport function getAvailableResourcesAndRoutesRouter(): Router {\n const router = Router();\n\n router.get(\n \"/available-resources\",\n authService?.authenticate,\n getAvailableResources\n );\n\n return router;\n}\n"]}
|