arkos 1.2.31-test → 1.3.0-beta
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/README.md +2 -2
- package/dist/cjs/app.js +1 -1
- package/dist/cjs/app.js.map +1 -1
- package/dist/cjs/exports/auth/index.js +1 -6
- package/dist/cjs/exports/controllers/index.js +1 -11
- package/dist/cjs/exports/error-handler/index.js +1 -11
- package/dist/cjs/exports/index.js +1 -12
- package/dist/cjs/exports/middlewares/index.js +1 -7
- package/dist/cjs/exports/prisma/index.js +1 -6
- package/dist/cjs/exports/prisma/index.js.map +1 -1
- package/dist/cjs/exports/services/index.js +1 -49
- package/dist/cjs/exports/services/index.js.map +1 -1
- package/dist/cjs/exports/utils/index.js +1 -44
- package/dist/cjs/exports/validation/index.js +1 -11
- package/dist/cjs/modules/auth/auth.controller.js +1 -194
- package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
- package/dist/cjs/modules/auth/auth.router.js +1 -50
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +1 -185
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/auth/utils/auth-error-objects.js +1 -0
- package/dist/cjs/modules/auth/utils/auth-error-objects.js.map +1 -0
- package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +1 -83
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js +1 -0
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -0
- package/dist/cjs/modules/base/base.controller.js +1 -158
- package/dist/cjs/modules/base/base.controller.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +1 -92
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/base/base.router.js +1 -24
- package/dist/cjs/modules/base/base.router.js.map +1 -1
- package/dist/cjs/modules/base/base.service.js +1 -128
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/modules/base/types/base.service.types.js +1 -0
- package/dist/cjs/modules/base/types/base.service.types.js.map +1 -0
- package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js +1 -82
- package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js.map +1 -1
- package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +1 -50
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +1 -97
- 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 +1 -171
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/cjs/modules/base/utils/router-validator.js +1 -0
- package/dist/cjs/modules/base/utils/router-validator.js.map +1 -0
- package/dist/cjs/modules/base/utils/service-hooks-manager.js +1 -0
- package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +1 -0
- package/dist/cjs/modules/email/email.service.js +1 -104
- package/dist/cjs/modules/error-handler/error-handler.controller.js +4 -146
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js +1 -17
- package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/catch-async.js +1 -12
- package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +3 -201
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.controller.js +1 -271
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +1 -44
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.service.js +1 -322
- package/dist/cjs/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +1 -97
- package/dist/cjs/modules/swagger/swagger.router.js +1 -99
- package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -250
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -66
- package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -41
- 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 +1 -22
- 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-system-json-schemas.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +1 -94
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/server.js +4 -2
- package/dist/cjs/server.js.map +1 -1
- package/dist/cjs/types/arkos-config.js +1 -3
- package/dist/cjs/types/arkos-config.js.map +1 -1
- package/dist/cjs/types/auth.js +1 -3
- package/dist/cjs/types/auth.js.map +1 -1
- package/dist/cjs/types/index.js +1 -11
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/router-config.js +1 -3
- package/dist/cjs/types/router-config.js.map +1 -1
- package/dist/cjs/utils/arkos-env.js +1 -9
- package/dist/cjs/utils/cli/build.js +5 -212
- package/dist/cjs/utils/cli/build.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +3 -256
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/generate.js +1 -189
- package/dist/cjs/utils/cli/generate.js.map +1 -1
- package/dist/cjs/utils/cli/index.js +1 -81
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/start.js +1 -93
- package/dist/cjs/utils/cli/start.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -24
- package/dist/cjs/utils/cli/utils/smart-fs-watcher.js +1 -0
- package/dist/cjs/utils/cli/utils/smart-fs-watcher.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +5 -20
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +9 -18
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-hooks-template.js +144 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-hooks-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +156 -135
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +9 -37
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js +11 -36
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js +6 -32
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generators.js +2 -28
- package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/cjs/utils/cli/utils/watermark-stamper.js +3 -0
- package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +1 -0
- package/dist/cjs/utils/dotenv.helpers.js +1 -43
- package/dist/cjs/utils/dynamic-loader.js +9 -0
- package/dist/cjs/utils/dynamic-loader.js.map +1 -0
- package/dist/cjs/utils/features/api.features.js +1 -167
- package/dist/cjs/utils/features/api.features.js.map +1 -1
- package/dist/cjs/utils/features/change-case.features.js +1 -67
- package/dist/cjs/utils/features/port-and-host-allocator.js +1 -0
- package/dist/cjs/utils/features/port-and-host-allocator.js.map +1 -0
- package/dist/cjs/utils/helpers/api.features.helpers.js +1 -106
- package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/change-case.helpers.js +1 -177
- package/dist/cjs/utils/helpers/deepmerge.helper.js +1 -115
- package/dist/cjs/utils/helpers/dynamic-loader.helpers.js +1 -0
- package/dist/cjs/utils/helpers/dynamic-loader.helpers.js.map +1 -0
- package/dist/cjs/utils/helpers/fs.helpers.js +1 -61
- package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/global.helpers.js +1 -92
- package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +1 -52
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/query-parser.helpers.js +1 -45
- package/dist/cjs/utils/helpers/routers.helpers.js +1 -21
- package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/text.helpers.js +1 -28
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +1 -0
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -0
- package/dist/cjs/utils/prisma/prisma-schema-parser.js +4 -0
- package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -0
- package/dist/cjs/utils/prisma/types.js +1 -0
- package/dist/cjs/utils/prisma/types.js.map +1 -0
- package/dist/cjs/utils/sheu.js +1 -119
- package/dist/cjs/utils/sheu.js.map +1 -1
- package/dist/cjs/utils/validate-dto.js +1 -17
- package/dist/cjs/utils/validate-dto.js.map +1 -1
- package/dist/cjs/utils/validate-schema.js +1 -15
- package/dist/cjs/utils/validate-schema.js.map +1 -1
- package/dist/esm/app.js +1 -1
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/exports/auth/index.js +1 -2
- package/dist/esm/exports/controllers/index.js +1 -4
- package/dist/esm/exports/error-handler/index.js +1 -4
- package/dist/esm/exports/index.js +1 -8
- package/dist/esm/exports/middlewares/index.js +1 -2
- package/dist/esm/exports/prisma/index.js +1 -3
- package/dist/esm/exports/prisma/index.js.map +1 -1
- package/dist/esm/exports/services/index.js +1 -9
- package/dist/esm/exports/services/index.js.map +1 -1
- package/dist/esm/exports/utils/index.js +1 -4
- package/dist/esm/exports/validation/index.js +1 -4
- package/dist/esm/modules/auth/auth.controller.js +1 -187
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +1 -44
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +1 -178
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/auth/utils/auth-error-objects.js +1 -0
- package/dist/esm/modules/auth/utils/auth-error-objects.js.map +1 -0
- package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +1 -73
- package/dist/esm/modules/auth/utils/services/auth-action.service.js +1 -0
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -0
- package/dist/esm/modules/base/base.controller.js +1 -150
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +1 -81
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/base.router.js +1 -17
- package/dist/esm/modules/base/base.router.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +1 -120
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/types/base.service.types.js +1 -0
- package/dist/esm/modules/base/types/base.service.types.js.map +1 -0
- package/dist/esm/modules/base/utils/helpers/base.controller.helpers.js +1 -77
- package/dist/esm/modules/base/utils/helpers/base.controller.helpers.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.middlewares.helpers.js +1 -44
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +1 -89
- 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 +1 -165
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/esm/modules/base/utils/router-validator.js +1 -0
- package/dist/esm/modules/base/utils/router-validator.js.map +1 -0
- package/dist/esm/modules/base/utils/service-hooks-manager.js +1 -0
- package/dist/esm/modules/base/utils/service-hooks-manager.js.map +1 -0
- package/dist/esm/modules/email/email.service.js +1 -97
- package/dist/esm/modules/error-handler/error-handler.controller.js +4 -107
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/app-error.js +1 -15
- package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/catch-async.js +1 -10
- package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +3 -160
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.controller.js +1 -266
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +1 -38
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.service.js +1 -314
- package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +1 -87
- package/dist/esm/modules/swagger/swagger.router.js +1 -93
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -247
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -63
- package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -38
- 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 +1 -19
- 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-system-json-schemas.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +1 -84
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/esm/package.json +3 -0
- package/dist/esm/server.js +4 -2
- package/dist/esm/server.js.map +1 -1
- package/dist/esm/types/arkos-config.js +1 -2
- package/dist/esm/types/arkos-config.js.map +1 -1
- package/dist/esm/types/auth.js +1 -2
- package/dist/esm/types/auth.js.map +1 -1
- package/dist/esm/types/index.js +1 -8
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/router-config.js +1 -2
- package/dist/esm/types/router-config.js.map +1 -1
- package/dist/esm/utils/arkos-env.js +1 -7
- package/dist/esm/utils/cli/build.js +5 -206
- package/dist/esm/utils/cli/build.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +3 -249
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +1 -183
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +1 -74
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/start.js +1 -86
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -16
- package/dist/esm/utils/cli/utils/smart-fs-watcher.js +1 -0
- package/dist/esm/utils/cli/utils/smart-fs-watcher.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +5 -17
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +9 -15
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-hooks-template.js +144 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-hooks-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js +156 -132
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +9 -34
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js +11 -30
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js +6 -29
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js +2 -25
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/cli/utils/watermark-stamper.js +3 -0
- package/dist/esm/utils/cli/utils/watermark-stamper.js.map +1 -0
- package/dist/esm/utils/dotenv.helpers.js +1 -37
- package/dist/esm/utils/dynamic-loader.js +9 -0
- package/dist/esm/utils/dynamic-loader.js.map +1 -0
- package/dist/esm/utils/features/api.features.js +1 -160
- package/dist/esm/utils/features/api.features.js.map +1 -1
- package/dist/esm/utils/features/change-case.features.js +1 -31
- package/dist/esm/utils/features/port-and-host-allocator.js +1 -0
- package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -0
- package/dist/esm/utils/helpers/api.features.helpers.js +1 -103
- package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/change-case.helpers.js +1 -161
- package/dist/esm/utils/helpers/deepmerge.helper.js +1 -113
- package/dist/esm/utils/helpers/dynamic-loader.helpers.js +1 -0
- package/dist/esm/utils/helpers/dynamic-loader.helpers.js.map +1 -0
- package/dist/esm/utils/helpers/fs.helpers.js +1 -52
- package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/global.helpers.js +1 -50
- package/dist/esm/utils/helpers/global.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +1 -44
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/query-parser.helpers.js +1 -40
- package/dist/esm/utils/helpers/routers.helpers.js +1 -16
- package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/text.helpers.js +1 -22
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +1 -0
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -0
- package/dist/esm/utils/prisma/prisma-schema-parser.js +4 -0
- package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -0
- package/dist/esm/utils/prisma/types.js +1 -0
- package/dist/esm/utils/prisma/types.js.map +1 -0
- package/dist/esm/utils/sheu.js +1 -117
- package/dist/esm/utils/sheu.js.map +1 -1
- package/dist/esm/utils/validate-dto.js +1 -11
- package/dist/esm/utils/validate-dto.js.map +1 -1
- package/dist/esm/utils/validate-schema.js +1 -9
- package/dist/esm/utils/validate-schema.js.map +1 -1
- package/dist/types/exports/prisma/index.d.ts +3 -2
- package/dist/types/exports/services/index.d.ts +3 -2
- package/dist/types/modules/auth/auth.controller.d.ts +10 -9
- package/dist/types/modules/auth/auth.service.d.ts +7 -3
- package/dist/types/modules/auth/utils/auth-error-objects.d.ts +3 -0
- package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +23 -0
- package/dist/types/modules/base/base.controller.d.ts +10 -12
- package/dist/types/modules/base/base.middlewares.d.ts +4 -4
- package/dist/types/modules/base/base.service.d.ts +14 -68
- package/dist/types/modules/base/types/base.service.types.d.ts +215 -0
- package/dist/types/modules/base/utils/helpers/base.controller.helpers.d.ts +0 -2
- package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +3 -3
- package/dist/types/modules/base/utils/helpers/base.service.helpers.d.ts +9 -2
- package/dist/types/modules/base/utils/router-validator.d.ts +5 -0
- package/dist/types/modules/base/utils/service-hooks-manager.d.ts +7 -0
- package/dist/types/modules/error-handler/error-handler.controller.d.ts +1 -1
- package/dist/types/modules/error-handler/utils/catch-async.d.ts +4 -2
- package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +18 -17
- package/dist/types/modules/file-upload/file-upload.controller.d.ts +4 -6
- package/dist/types/modules/file-upload/file-upload.service.d.ts +4 -5
- package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +3 -1
- package/dist/types/modules/swagger/utils/helpers/get-swagger-default-configs.d.ts +46 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +2 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.d.ts +4 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.d.ts +1 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.d.ts +3 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.d.ts +3 -0
- package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +34 -0
- package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +4 -2
- package/dist/types/server.d.ts +4 -1
- package/dist/types/types/arkos-config.d.ts +5 -3
- package/dist/types/types/auth.d.ts +7 -1
- package/dist/types/types/index.d.ts +4 -1
- package/dist/types/types/router-config.d.ts +24 -1
- package/dist/types/utils/cli/generate.d.ts +2 -1
- package/dist/types/utils/cli/utils/smart-fs-watcher.d.ts +11 -0
- package/dist/types/utils/cli/utils/template-generator/templates/generate-hooks-template.d.ts +2 -0
- package/dist/types/utils/cli/utils/watermark-stamper.d.ts +9 -0
- package/dist/types/utils/dynamic-loader.d.ts +104 -0
- package/dist/types/utils/features/port-and-host-allocator.d.ts +21 -0
- package/dist/types/utils/helpers/dynamic-loader.helpers.d.ts +3 -0
- package/dist/types/utils/helpers/fs.helpers.d.ts +0 -4
- package/dist/types/utils/helpers/global.helpers.d.ts +1 -0
- package/dist/types/utils/helpers/prisma.helpers.d.ts +0 -1
- package/dist/types/utils/helpers/routers.helpers.d.ts +6 -2
- package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +34 -0
- package/dist/types/utils/prisma/prisma-schema-parser.d.ts +28 -0
- package/dist/types/utils/prisma/types.d.ts +49 -0
- package/dist/types/utils/sheu.d.ts +15 -15
- package/package.json +32 -18
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +0 -30
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +0 -442
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +0 -165
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +0 -1
- package/dist/cjs/utils/helpers/models.helpers.js +0 -313
- package/dist/cjs/utils/helpers/models.helpers.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +0 -24
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +0 -436
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +0 -159
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +0 -1
- package/dist/esm/utils/helpers/models.helpers.js +0 -296
- package/dist/esm/utils/helpers/models.helpers.js.map +0 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.d.ts +0 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.d.ts +0 -2
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.d.ts +0 -2
- package/dist/types/utils/helpers/models.helpers.d.ts +0 -107
|
@@ -0,0 +1 @@
|
|
|
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 { 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 if (!this.getOne(action, resource)) {\n const transformedAction = this.transformAccessControlToValidAuthAction(\n action,\n resource,\n accessControl\n );\n this.authActions.push(transformedAction);\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: `${action} ${resource}`,\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 // If accessControl is not provided, return the base action\n if (!accessControl) {\n return baseAuthAction;\n }\n\n // If accessControl is an array of roles, just return the base action\n if (Array.isArray(accessControl)) {\n return baseAuthAction;\n }\n\n // If accessControl is an object with specific rules\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.find(\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"]}
|
|
@@ -1,150 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import APIFeatures from "../../utils/features/api.features.js";
|
|
3
|
-
import { BaseService } from "./base.service.js";
|
|
4
|
-
import AppError from "../error-handler/utils/app-error.js";
|
|
5
|
-
import { kebabCase, pascalCase } from "../../utils/helpers/change-case.helpers.js";
|
|
6
|
-
import { getModelModules, getModels } from "../../utils/helpers/models.helpers.js";
|
|
7
|
-
import { getAppRoutes } from "./utils/helpers/base.controller.helpers.js";
|
|
8
|
-
import pluralize from "pluralize";
|
|
9
|
-
export class BaseController {
|
|
10
|
-
constructor(modelName) {
|
|
11
|
-
this.createOne = catchAsync(async (req, res, next) => {
|
|
12
|
-
const data = await this.service.createOne(req.body, req.prismaQueryOptions);
|
|
13
|
-
if (this.middlewares.afterCreateOne) {
|
|
14
|
-
req.responseData = { data };
|
|
15
|
-
req.responseStatus = 201;
|
|
16
|
-
return next();
|
|
17
|
-
}
|
|
18
|
-
res.status(201).json({ data });
|
|
19
|
-
});
|
|
20
|
-
this.createMany = catchAsync(async (req, res, next) => {
|
|
21
|
-
const data = await this.service.createMany(req.body, req.prismaQueryOptions);
|
|
22
|
-
if (!data)
|
|
23
|
-
return next(new AppError("Failed to create the resources. Please check your input.", 400, {}, "MissingRequestBody"));
|
|
24
|
-
if (this.middlewares.afterCreateMany) {
|
|
25
|
-
req.responseData = { data };
|
|
26
|
-
req.responseStatus = 201;
|
|
27
|
-
return next();
|
|
28
|
-
}
|
|
29
|
-
res.status(201).json({ data });
|
|
30
|
-
});
|
|
31
|
-
this.findMany = catchAsync(async (req, res, next) => {
|
|
32
|
-
const { filters: { where, ...queryOptions }, } = new APIFeatures(req, this.modelName)
|
|
33
|
-
.filter()
|
|
34
|
-
.sort()
|
|
35
|
-
.limitFields()
|
|
36
|
-
.paginate();
|
|
37
|
-
const [data, total] = (await Promise.all([
|
|
38
|
-
this.service.findMany(where, queryOptions),
|
|
39
|
-
this.service.count(where),
|
|
40
|
-
]));
|
|
41
|
-
if (this.middlewares.afterFindMany) {
|
|
42
|
-
req.responseData = { total, results: data.length, data };
|
|
43
|
-
req.responseStatus = 200;
|
|
44
|
-
return next();
|
|
45
|
-
}
|
|
46
|
-
res.status(200).json({ total, results: data.length, data });
|
|
47
|
-
});
|
|
48
|
-
this.findOne = catchAsync(async (req, res, next) => {
|
|
49
|
-
const data = await this.service.findOne(req.params, req.prismaQueryOptions);
|
|
50
|
-
if (!data) {
|
|
51
|
-
if (Object.keys(req.params).length === 1 &&
|
|
52
|
-
"id" in req.params &&
|
|
53
|
-
req.params.id !== "me") {
|
|
54
|
-
return next(new AppError(`${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`, 404, {}, "NotFound"));
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return next(new AppError(`${pascalCase(String(this.modelName))} not found`, 404, {}, "NotFound"));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
if (this.middlewares.afterFindOne) {
|
|
61
|
-
req.responseData = { data };
|
|
62
|
-
req.responseStatus = 200;
|
|
63
|
-
return next();
|
|
64
|
-
}
|
|
65
|
-
res.status(200).json({ data });
|
|
66
|
-
});
|
|
67
|
-
this.updateOne = catchAsync(async (req, res, next) => {
|
|
68
|
-
const data = await this.service.updateOne(req.params, req.body, req.prismaQueryOptions);
|
|
69
|
-
if (!data) {
|
|
70
|
-
if (Object.keys(req.params).length === 1 && "id" in req.params) {
|
|
71
|
-
return next(new AppError(`${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`, 404, {}, "NotFound"));
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
return next(new AppError(`${pascalCase(String(this.modelName))} not found`, 404, {}, "NotFound"));
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (this.middlewares.afterUpdateOne) {
|
|
78
|
-
req.responseData = { data };
|
|
79
|
-
req.responseStatus = 200;
|
|
80
|
-
return next();
|
|
81
|
-
}
|
|
82
|
-
res.status(200).json({ data });
|
|
83
|
-
});
|
|
84
|
-
this.updateMany = catchAsync(async (req, res, next) => {
|
|
85
|
-
if (!Object.keys(req.query).some((key) => key !== "prismaQueryOptions")) {
|
|
86
|
-
return next(new AppError("Filter criteria not provided for bulk update.", 400, {}, "MissingRequestQueryParameters"));
|
|
87
|
-
}
|
|
88
|
-
req.query.filterMode = req.query?.filterMode || "AND";
|
|
89
|
-
const { filters: { where, ...queryOptions }, } = new APIFeatures(req, this.modelName).filter().sort();
|
|
90
|
-
delete queryOptions.include;
|
|
91
|
-
const data = (await this.service.updateMany(where, req.body, queryOptions));
|
|
92
|
-
if (!data || data.count === 0)
|
|
93
|
-
return next(new AppError(`${pluralize(pascalCase(String(this.modelName)))} not found`, 404));
|
|
94
|
-
if (this.middlewares.afterUpdateMany) {
|
|
95
|
-
req.responseData = { results: data.count, data };
|
|
96
|
-
req.responseStatus = 200;
|
|
97
|
-
return next();
|
|
98
|
-
}
|
|
99
|
-
res.status(200).json({ results: data.count, data });
|
|
100
|
-
});
|
|
101
|
-
this.deleteOne = catchAsync(async (req, res, next) => {
|
|
102
|
-
const data = await this.service.deleteOne(req.params);
|
|
103
|
-
if (!data) {
|
|
104
|
-
if (Object.keys(req.params).length === 1 && "id" in req.params) {
|
|
105
|
-
return next(new AppError(`${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`, 404, {}, "NotFound"));
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
return next(new AppError(`${pascalCase(String(this.modelName))} not found`, 404, {}, "NotFound"));
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (this.middlewares.afterDeleteOne) {
|
|
112
|
-
req.additionalData = { data };
|
|
113
|
-
req.responseStatus = 204;
|
|
114
|
-
return next();
|
|
115
|
-
}
|
|
116
|
-
res.status(204).send();
|
|
117
|
-
});
|
|
118
|
-
this.deleteMany = catchAsync(async (req, res, next) => {
|
|
119
|
-
if (!Object.keys(req.query).some((key) => key !== "prismaQueryOptions")) {
|
|
120
|
-
return next(new AppError("Filter criteria not provided for bulk deletion.", 400, {}, "MissingRequestQueryParameters"));
|
|
121
|
-
}
|
|
122
|
-
req.query.filterMode = req.query?.filterMode || "AND";
|
|
123
|
-
const { filters: { where }, } = new APIFeatures(req, this.modelName).filter().sort();
|
|
124
|
-
const data = await this.service.deleteMany(where);
|
|
125
|
-
if (!data || data.count === 0) {
|
|
126
|
-
return next(new AppError(`No records found to delete`, 404, {}, "NotFound"));
|
|
127
|
-
}
|
|
128
|
-
if (this.middlewares.afterDeleteMany) {
|
|
129
|
-
req.responseData = { results: data.count, data };
|
|
130
|
-
req.responseStatus = 200;
|
|
131
|
-
return next();
|
|
132
|
-
}
|
|
133
|
-
res.status(200).json({ results: data.count, data });
|
|
134
|
-
});
|
|
135
|
-
this.modelName = modelName;
|
|
136
|
-
this.service = new BaseService(modelName);
|
|
137
|
-
this.middlewares = getModelModules(modelName)?.middlewares || {};
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
export function getAvalibleRoutes(req, res, next) {
|
|
141
|
-
const routes = getAppRoutes();
|
|
142
|
-
res.json(routes);
|
|
143
|
-
}
|
|
144
|
-
export const getAvailableResources = catchAsync(async (req, res, next) => {
|
|
145
|
-
const models = getModels();
|
|
146
|
-
res.status(200).json({
|
|
147
|
-
data: [...models.map((model) => kebabCase(model)), "file-upload"],
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
//# sourceMappingURL=base.controller.js.map
|
|
1
|
+
"use strict";import i from"../error-handler/utils/catch-async.js";import l from"../../utils/features/api.features.js";import{BaseService as f}from"./base.service.js";import o from"../error-handler/utils/app-error.js";import{kebabCase as h,pascalCase as u}from"../../utils/helpers/change-case.helpers.js";import{getModuleComponents as y}from"../../utils/dynamic-loader.js";import w from"pluralize";import k from"../../utils/sheu.js";import O from"../../utils/prisma/prisma-schema-parser.js";export class BaseController{constructor(c){this.createOne=i(async(e,a,s)=>{const t=await this.service.createOne(e.body,e.prismaQueryOptions,{user:e?.user,accessToken:e?.accessToken});if(this.interceptors.afterCreateOne)return e.responseData={data:t},e.responseStatus=201,s();a.status(201).json({data:t})}),this.createMany=i(async(e,a,s)=>{const t=await this.service.createMany(e.body,e.prismaQueryOptions,{user:e?.user,accessToken:e?.accessToken});if(!t)return s(new o("Failed to create the resources. Please check your input.",400,{},"MissingRequestBody"));if(this.interceptors.afterCreateMany)return e.responseData={data:t},e.responseStatus=201,s();a.status(201).json({data:t})}),this.findMany=i(async(e,a,s)=>{const{filters:{where:t,...r}}=new l(e,this.modelName).filter().sort().limitFields().paginate(),[n,d]=await Promise.all([this.service.findMany(t,r,{user:e?.user,accessToken:e?.accessToken}),this.service.count(t,{user:e?.user,accessToken:e?.accessToken})]);if(this.interceptors.afterFindMany)return e.responseData={total:d,results:n.length,data:n},e.responseStatus=200,s();a.status(200).json({total:d,results:n.length,data:n})}),this.findOne=i(async(e,a,s)=>{const t=await this.service.findOne(e.params,e.prismaQueryOptions,{user:e?.user,accessToken:e?.accessToken});if(!t)return Object.keys(e.params).length===1&&"id"in e.params&&e.params.id!=="me"?s(new o(`${u(String(this.modelName))} with ID ${e.params?.id} not found`,404,{},"NotFound")):s(new o(`${u(String(this.modelName))} not found`,404,{},"NotFound"));if(this.interceptors.afterFindOne)return e.responseData={data:t},e.responseStatus=200,s();a.status(200).json({data:t})}),this.updateOne=i(async(e,a,s)=>{const t=await this.service.updateOne(e.params,e.body,e.prismaQueryOptions,{user:e?.user,accessToken:e?.accessToken});if(!t)return Object.keys(e.params).length===1&&"id"in e.params?s(new o(`${u(String(this.modelName))} with ID ${e.params?.id} not found`,404,{},"NotFound")):s(new o(`${u(String(this.modelName))} not found`,404,{},"NotFound"));if(this.interceptors.afterUpdateOne)return e.responseData={data:t},e.responseStatus=200,s();a.status(200).json({data:t})}),this.updateMany=i(async(e,a,s)=>{if(!Object.keys(e.query).some(d=>d!=="prismaQueryOptions"))return s(new o("Filter criteria not provided for bulk update.",400,{},"MissingRequestQueryParameters"));e.query.filterMode=e.query?.filterMode||"AND";const{filters:{where:t,...r}}=new l(e,this.modelName).filter().sort();delete r.include;const n=await this.service.updateMany(t,e.body,r,{user:e?.user,accessToken:e?.accessToken});if(!n||n.count===0)return s(new o(`${w(u(String(this.modelName)))} not found`,404));if(this.interceptors.afterUpdateMany)return e.responseData={results:n.count,data:n},e.responseStatus=200,s();a.status(200).json({results:n.count,data:n})}),this.deleteOne=i(async(e,a,s)=>{const t=await this.service.deleteOne(e.params,{user:e?.user,accessToken:e?.accessToken});if(!t)return Object.keys(e.params).length===1&&"id"in e.params?s(new o(`${u(String(this.modelName))} with ID ${e.params?.id} not found`,404,{},"NotFound")):s(new o(`${u(String(this.modelName))} not found`,404,{},"NotFound"));if(this.interceptors.afterDeleteOne)return e.additionalData={data:t},e.responseStatus=204,s();a.status(204).send()}),this.deleteMany=i(async(e,a,s)=>{if(!Object.keys(e.query).some(n=>n!=="prismaQueryOptions"))return s(new o("Filter criteria not provided for bulk deletion.",400,{},"MissingRequestQueryParameters"));e.query.filterMode=e.query?.filterMode||"AND";const{filters:{where:t}}=new l(e,this.modelName).filter().sort(),r=await this.service.deleteMany(t,{user:e?.user,accessToken:e?.accessToken});if(!r||r.count===0)return s(new o("No records found to delete",404,{},"NotFound"));if(this.interceptors.afterDeleteMany)return e.responseData={results:r.count,data:r},e.responseStatus=200,s();a.status(200).json({results:r.count,data:r})});const p=y(c);this.modelName=c,this.service=new f(c),this.interceptors=p?.interceptors||{}}}export const getAvailableResources=i(async(m,c)=>{k.warn("This route `/api/available-routes` will be deprecated from 1.4.0-beta, consider using /api/auth-actions instead."),c.status(200).json({data:[...O.getModelsAsArrayOfStrings().map(p=>h(p)),"file-upload"]})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.controller.js","sourceRoot":"","sources":["../../../../src/modules/base/base.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport APIFeatures from \"../../utils/features/api.features\";\nimport { BaseService } from \"./base.service\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { kebabCase, pascalCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModelModules, getModels } from \"../../utils/helpers/models.helpers\";\nimport { getAppRoutes } from \"./utils/helpers/base.controller.helpers\";\nimport pluralize from \"pluralize\";\n\n/**\n * The `BaseController` class provides standardized RESTful API endpoints\n * for any Prisma model based on its name. It supports automatic integration\n * with Prisma services and dynamic middleware hooks for extending behaviors.\n *\n * This controller includes:\n * - `createOne` / `createMany`\n * - `findOne` / `findMany`\n * - `updateOne` / `updateMany`\n * - `deleteOne` / `deleteMany`\n *\n * It handles:\n * - Prisma query options\n * - APIFeatures: filtering, sorting, pagination, field limiting\n * - Middleware hooks: `afterCreateOne`, `afterUpdateMany`, etc.\n *\n * @class BaseController\n * @example\n *\n * **Extending the Controller**\n *\n * ```ts\n * // src/modules/product/product.controller.ts\n *\n * class ProductController extends BaseController {}\n *\n * const productController = new ProcutController(\"product\")\n *\n * export default productController\n *\n * ```\n *\n * @param {string} modelName - The Prisma model name this controller handles.\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-controller-class}\n *--\n *\n * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport class BaseController {\n /**\n * Service instance to handle business logic operations\n * @private\n */\n private service: BaseService<any>;\n\n /**\n * Name of the model this controller handles\n * @private\n */\n private modelName: string;\n\n /**\n * Model-specific middlewares loaded from model modules\n * @private\n */\n private middlewares: any;\n\n /**\n * Creates a new BaseController instance\n * @param {string} modelName - The name of the model for which this controller will handle operations\n */\n constructor(modelName: string) {\n this.modelName = modelName;\n this.service = new BaseService(modelName);\n this.middlewares = getModelModules(modelName)?.middlewares || {};\n }\n\n /**\n * Creates a single resource\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createOne(\n req.body,\n req.prismaQueryOptions\n );\n\n if (this.middlewares.afterCreateOne) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Creates multiple resources in a single operation\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createMany(\n req.body,\n req.prismaQueryOptions\n );\n\n if (!data)\n return next(\n new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n {},\n \"MissingRequestBody\"\n )\n );\n\n if (this.middlewares.afterCreateMany) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName)\n .filter()\n .sort()\n .limitFields()\n .paginate();\n\n // Execute both operations separately\n const [data, total] = (await Promise.all([\n this.service.findMany(where, queryOptions),\n this.service.count(where),\n ])) as [Record<string, any>[], number];\n\n // if (total === 0)\n // throw new AppError(\n // `${kebabCase(pluralize(String(this.modelName))).replaceAll(\"-\", \"\")}`,\n // 404,\n // { query: req?.query },\n // \"NotFound\"\n // );\n\n if (this.middlewares.afterFindMany) {\n req.responseData = { total, results: data.length, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ total, results: data.length, data });\n }\n );\n\n /**\n * Retrieves a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.findOne(\n req.params,\n req.prismaQueryOptions\n );\n\n if (!data) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.middlewares.afterFindOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.updateOne(\n req.params,\n req.body,\n req.prismaQueryOptions\n );\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.middlewares.afterUpdateOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk update.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName).filter().sort();\n delete queryOptions.include;\n\n const data = (await this.service.updateMany(\n where,\n req.body,\n queryOptions\n )) as { count: number };\n\n if (!data || data.count === 0)\n return next(\n new AppError(\n `${pluralize(pascalCase(String(this.modelName)))} not found`,\n 404\n )\n );\n\n if (this.middlewares.afterUpdateMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n\n /**\n * Deletes a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.deleteOne(req.params);\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.middlewares.afterDeleteOne) {\n req.additionalData = { data };\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).send();\n }\n );\n\n /**\n * Deletes multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk deletion.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where },\n } = new APIFeatures(req, this.modelName).filter().sort();\n\n const data = await this.service.deleteMany(where);\n\n if (!data || data.count === 0) {\n return next(\n new AppError(`No records found to delete`, 404, {}, \"NotFound\")\n );\n }\n\n if (this.middlewares.afterDeleteMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n}\n\n/**\n * Returns a list of all registered API routes in the Express application\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {void}\n */\nexport function getAvalibleRoutes(\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n) {\n const routes = getAppRoutes();\n\n res.json(routes);\n}\n\n/**\n * Returns a list of all available resource endpoints based on the application's models\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\nexport const getAvailableResources = catchAsync(async (req, res, next) => {\n const models = getModels();\n res.status(200).json({\n data: [...models.map((model) => kebabCase(model)), \"file-upload\"],\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"base.controller.js","sourceRoot":"","sources":["../../../../src/modules/base/base.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport APIFeatures from \"../../utils/features/api.features\";\nimport { BaseService } from \"./base.service\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { kebabCase, pascalCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport pluralize from \"pluralize\";\nimport sheu from \"../../utils/sheu\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\n\n/**\n * The `BaseController` class provides standardized RESTful API endpoints\n * for any Prisma model based on its name. It supports automatic integration\n * with Prisma services and dynamic middleware hooks for extending behaviors.\n *\n * This controller includes:\n * - `createOne` / `createMany`\n * - `findOne` / `findMany`\n * - `updateOne` / `updateMany`\n * - `deleteOne` / `deleteMany`\n *\n * It handles:\n * - Prisma query options\n * - APIFeatures: filtering, sorting, pagination, field limiting\n * - Middleware hooks: `afterCreateOne`, `afterUpdateMany`, etc.\n *\n * @class BaseController\n * @example\n *\n * **Extending the Controller**\n *\n * ```ts\n * // src/modules/product/product.controller.ts\n *\n * class ProductController extends BaseController {}\n *\n * const productController = new ProcutController(\"product\")\n *\n * export default productController\n *\n * ```\n *\n * @param {string} modelName - The Prisma model name this controller handles.\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-controller-class}\n *--\n *\n * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport class BaseController {\n /**\n * Service instance to handle business logic operations\n * @private\n */\n private service: BaseService<any>;\n\n /**\n * Name of the model this controller handles\n * @private\n */\n private modelName: string;\n\n /**\n * Model-specific 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 /**\n * Creates a single resource\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createOne(\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (this.interceptors.afterCreateOne) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Creates multiple resources in a single operation\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createMany(\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data)\n return next(\n new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n {},\n \"MissingRequestBody\"\n )\n );\n\n if (this.interceptors.afterCreateMany) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName)\n .filter()\n .sort()\n .limitFields()\n .paginate();\n\n const [data, total] = (await Promise.all([\n this.service.findMany(where, queryOptions, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n this.service.count(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n ])) as [Record<string, any>[], number];\n\n if (this.interceptors.afterFindMany) {\n req.responseData = { total, results: data.length, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ total, results: data.length, data });\n }\n );\n\n /**\n * Retrieves a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.findOne(\n req.params,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterFindOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.updateOne(\n req.params,\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterUpdateOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk update.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName).filter().sort();\n delete queryOptions.include;\n\n const data = (await this.service.updateMany(\n where,\n req.body,\n queryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n )) as { count: number };\n\n if (!data || data.count === 0)\n return next(\n new AppError(\n `${pluralize(pascalCase(String(this.modelName)))} not found`,\n 404\n )\n );\n\n if (this.interceptors.afterUpdateMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n\n /**\n * Deletes a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.deleteOne(req.params, {\n user: req?.user,\n accessToken: req?.accessToken,\n });\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterDeleteOne) {\n req.additionalData = { data };\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).send();\n }\n );\n\n /**\n * Deletes multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk deletion.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where },\n } = new APIFeatures(req, this.modelName).filter().sort();\n\n const data = await this.service.deleteMany(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n });\n\n if (!data || data.count === 0) {\n return next(\n new AppError(`No records found to delete`, 404, {}, \"NotFound\")\n );\n }\n\n if (this.interceptors.afterDeleteMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n}\n\n/**\n * Returns a list of all 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-routes` 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,81 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import deepmerge from "../../utils/helpers/deepmerge.helper.js";
|
|
3
|
-
import { catchAsync } from "../../exports/error-handler/index.js";
|
|
4
|
-
import validateDto from "../../utils/validate-dto.js";
|
|
5
|
-
import validateSchema from "../../utils/validate-schema.js";
|
|
6
|
-
import { resolvePrismaQueryOptions } from "./utils/helpers/base.middlewares.helpers.js";
|
|
7
|
-
export function callNext(req, res, next) {
|
|
8
|
-
next();
|
|
9
|
-
}
|
|
10
|
-
export function sendResponse(req, res, next) {
|
|
11
|
-
if (Number(req?.responseStatus) === 204)
|
|
12
|
-
res.status(Number(req?.responseStatus)).send();
|
|
13
|
-
else if (req.responseData && req?.responseStatus)
|
|
14
|
-
res.status(Number(req?.responseStatus)).json(req.responseData);
|
|
15
|
-
else if (Number(req?.responseStatus) && !req.responseData)
|
|
16
|
-
res.status(Number(req?.responseStatus)).send();
|
|
17
|
-
else
|
|
18
|
-
res
|
|
19
|
-
.status(500)
|
|
20
|
-
.json({ message: "No status or data attached to the response" });
|
|
21
|
-
}
|
|
22
|
-
export function addRouteMiddlwaresAndConfigs() { }
|
|
23
|
-
export function addPrismaQueryOptionsToRequest(prismaQueryOptions, action) {
|
|
24
|
-
return (req, res, next) => {
|
|
25
|
-
const configs = getArkosConfig();
|
|
26
|
-
const resolvedOptions = resolvePrismaQueryOptions(prismaQueryOptions, action);
|
|
27
|
-
const requestQueryOptions = configs?.request?.parameters
|
|
28
|
-
?.allowDangerousPrismaQueryOptions
|
|
29
|
-
? JSON.parse(req.query?.prismaQueryOptions || "{}")
|
|
30
|
-
: {};
|
|
31
|
-
req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);
|
|
32
|
-
next();
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
export function handleRequestLogs(req, res, next) {
|
|
36
|
-
const startTime = Date.now();
|
|
37
|
-
const methodColors = {
|
|
38
|
-
GET: "\x1b[36m",
|
|
39
|
-
POST: "\x1b[32m",
|
|
40
|
-
PUT: "\x1b[33m",
|
|
41
|
-
PATCH: "\x1b[33m",
|
|
42
|
-
DELETE: "\x1b[31m",
|
|
43
|
-
HEAD: "\x1b[34m",
|
|
44
|
-
OPTIONS: "\x1b[34m",
|
|
45
|
-
};
|
|
46
|
-
const getStatusColor = (statusCode) => {
|
|
47
|
-
if (statusCode >= 200 && statusCode < 300)
|
|
48
|
-
return "\x1b[32m";
|
|
49
|
-
if (statusCode >= 300 && statusCode < 400)
|
|
50
|
-
return "\x1b[33m";
|
|
51
|
-
if (statusCode >= 400 && statusCode < 500)
|
|
52
|
-
return "\x1b[33m";
|
|
53
|
-
if (statusCode >= 500)
|
|
54
|
-
return "\x1b[31m";
|
|
55
|
-
return "\x1b[0m";
|
|
56
|
-
};
|
|
57
|
-
res.on("finish", () => {
|
|
58
|
-
const duration = Date.now() - startTime;
|
|
59
|
-
const now = new Date();
|
|
60
|
-
const time = now.toTimeString().split(" ")[0];
|
|
61
|
-
const methodColor = methodColors[req.method] || "\x1b[0m";
|
|
62
|
-
const statusColor = getStatusColor(res.statusCode);
|
|
63
|
-
console.info(`[\x1b[36mINFO\x1b[0m] \x1b[90m${time}\x1b[0m ${methodColor}${req.method}\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${res.statusCode}\x1b[0m \x1b[35m${duration}ms\x1b[0m`);
|
|
64
|
-
});
|
|
65
|
-
next();
|
|
66
|
-
}
|
|
67
|
-
export function handleRequestBodyValidationAndTransformation(schemaOrDtoClass, classValidatorValidationOptions) {
|
|
68
|
-
return catchAsync(async (req, res, next) => {
|
|
69
|
-
const validationConfigs = getArkosConfig()?.validation;
|
|
70
|
-
let body = req.body;
|
|
71
|
-
if (validationConfigs?.resolver === "class-validator" && schemaOrDtoClass)
|
|
72
|
-
req.body = await validateDto(schemaOrDtoClass, body, deepmerge({
|
|
73
|
-
whitelist: true,
|
|
74
|
-
...classValidatorValidationOptions,
|
|
75
|
-
}, validationConfigs?.validationOptions || {}));
|
|
76
|
-
else if (validationConfigs?.resolver === "zod" && schemaOrDtoClass)
|
|
77
|
-
req.body = await validateSchema(schemaOrDtoClass, body);
|
|
78
|
-
next();
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=base.middlewares.js.map
|
|
1
|
+
"use strict";import{getArkosConfig as m}from"../../server.js";import u from"../../utils/helpers/deepmerge.helper.js";import{catchAsync as l}from"../../exports/error-handler/index.js";import f from"../../utils/validate-dto.js";import x from"../../utils/validate-schema.js";import{resolvePrismaQueryOptions as c}from"./utils/helpers/base.middlewares.helpers.js";export function callNext(t,e,n){n()}export function sendResponse(t,e){Number(t?.responseStatus)===204?e.status(Number(t?.responseStatus)).send():t.responseData&&t?.responseStatus?e.status(Number(t?.responseStatus)).json(t.responseData):Number(t?.responseStatus)&&!t.responseData?e.status(Number(t?.responseStatus)).send():e.status(500).json({message:"No status or data attached to the response"})}export function addRouteMiddlwaresAndConfigs(){}export function addPrismaQueryOptionsToRequest(t,e){return(n,i,r)=>{const s=m(),o=c(t,e),a=s?.request?.parameters?.allowDangerousPrismaQueryOptions?JSON.parse(n.query?.prismaQueryOptions||"{}"):{};n.prismaQueryOptions=u(o,a),r()}}export function handleRequestLogs(t,e,n){const i=Date.now(),r={GET:"\x1B[36m",POST:"\x1B[32m",PUT:"\x1B[33m",PATCH:"\x1B[33m",DELETE:"\x1B[31m",HEAD:"\x1B[34m",OPTIONS:"\x1B[34m"},s=o=>o>=200&&o<300?"\x1B[32m":o>=300&&o<400||o>=400&&o<500?"\x1B[33m":o>=500?"\x1B[31m":"\x1B[0m";e.on("finish",()=>{const o=Date.now()-i,p=new Date().toTimeString().split(" ")[0],d=r[t.method]||"\x1B[0m",b=s(e.statusCode);console.info(`[\x1B[36mInfo\x1B[0m] \x1B[90m${p}\x1B[0m ${d}${t.method}\x1B[0m ${decodeURIComponent(t.originalUrl)} ${b}${e.statusCode}\x1B[0m \x1B[35m${o}ms\x1B[0m`)}),n()}export function handleRequestBodyValidationAndTransformation(t,e){return l(async(n,i,r)=>{const s=m()?.validation;let o=n.body;s?.resolver==="class-validator"&&t?n.body=await f(t,o,u({whitelist:!0,...e},s?.validationOptions||{})):s?.resolver==="zod"&&t&&(n.body=await x(t,o)),r()})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,SAAS,MAAM,sCAAsC,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,WAAW,MAAM,0BAA0B,CAAC;AACnD,OAAO,cAAc,MAAM,6BAA6B,CAAC;AAIzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAErF,MAAM,UAAU,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\n\nexport function callNext(_: 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 // Resolve and merge all applicable options using the helper\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n // Parse and merge any dangerous query options from request if allowed\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n // Final merge with request options having the highest priority\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
|
|
@@ -1,17 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getAvalibleRoutes, getAvailableResources } from "./base.controller.js";
|
|
3
|
-
import { getModels } from "../../utils/helpers/models.helpers.js";
|
|
4
|
-
import authService from "../auth/auth.service.js";
|
|
5
|
-
import { setupRouters } from "./utils/helpers/base.router.helpers.js";
|
|
6
|
-
export async function getPrismaModelsRouter(arkosConfigs) {
|
|
7
|
-
const router = Router();
|
|
8
|
-
await Promise.all(setupRouters(getModels(), router, arkosConfigs));
|
|
9
|
-
return router;
|
|
10
|
-
}
|
|
11
|
-
export function getAvailableResourcesAndRoutesRouter() {
|
|
12
|
-
const router = Router();
|
|
13
|
-
router.get("/available-routes", authService?.authenticate, getAvalibleRoutes);
|
|
14
|
-
router.get("/available-resources", authService?.authenticate, getAvailableResources);
|
|
15
|
-
return router;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=base.router.js.map
|
|
1
|
+
"use strict";import{Router as r}from"express";import{getAvailableResources as o}from"./base.controller.js";import a from"../auth/auth.service.js";import{setupRouters as u}from"./utils/helpers/base.router.helpers.js";export async function getPrismaModelsRouter(e){const t=r();return await Promise.all(await u(t,e)),t}export function getAvailableResourcesAndRoutesRouter(){const e=r();return e.get("/available-resources",a?.authenticate,o),e}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.router.js","sourceRoot":"","sources":["../../../../src/modules/base/base.router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"base.router.js","sourceRoot":"","sources":["../../../../src/modules/base/base.router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,YAAyB;IACnE,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAE5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oCAAoC;IAClD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CACR,sBAAsB,EACtB,WAAW,EAAE,YAAY,EACzB,qBAAqB,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/arkos-config\";\nimport { setupRouters } from \"./utils/helpers/base.router.helpers\";\n\nexport async function getPrismaModelsRouter(arkosConfigs: ArkosConfig) {\n const router: Router = Router();\n\n await Promise.all(await 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"]}
|
|
@@ -1,120 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { getModels, getPrismaModelRelations, } from "../../utils/helpers/models.helpers.js";
|
|
3
|
-
import deepmerge from "../../utils/helpers/deepmerge.helper.js";
|
|
4
|
-
import { handleRelationFieldsInBody } from "./utils/helpers/base.service.helpers.js";
|
|
5
|
-
import { getPrismaInstance } from "../../utils/helpers/prisma.helpers.js";
|
|
6
|
-
import authService from "../auth/auth.service.js";
|
|
7
|
-
export class BaseService {
|
|
8
|
-
constructor(modelName) {
|
|
9
|
-
this.modelName = camelCase(modelName);
|
|
10
|
-
this.relationFields = getPrismaModelRelations(pascalCase(modelName));
|
|
11
|
-
}
|
|
12
|
-
async createOne(data, queryOptions) {
|
|
13
|
-
if (kebabCase(this.modelName) === "user" && data.password)
|
|
14
|
-
if (!authService.isPasswordHashed(data.password))
|
|
15
|
-
data.password = await authService.hashPassword(data.password);
|
|
16
|
-
const prisma = getPrismaInstance();
|
|
17
|
-
const dataWithRelationFieldsHandled = handleRelationFieldsInBody(data, {
|
|
18
|
-
...this.relationFields,
|
|
19
|
-
}, ["delete", "disconnect", "update"]);
|
|
20
|
-
return await prisma[this.modelName].create(deepmerge({
|
|
21
|
-
data: dataWithRelationFieldsHandled,
|
|
22
|
-
}, queryOptions || {}));
|
|
23
|
-
}
|
|
24
|
-
async createMany(data, queryOptions) {
|
|
25
|
-
const prisma = getPrismaInstance();
|
|
26
|
-
const dataWithRelationFieldsHandled = [];
|
|
27
|
-
if (Array.isArray(data))
|
|
28
|
-
await new Promise((resolve) => {
|
|
29
|
-
data.forEach(async (curr, i) => {
|
|
30
|
-
if ("password" in curr && this.modelName === "user")
|
|
31
|
-
if (!authService.isPasswordHashed(curr.password))
|
|
32
|
-
data[i].password = await authService.hashPassword(curr?.password);
|
|
33
|
-
dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(data[i], {
|
|
34
|
-
...this.relationFields,
|
|
35
|
-
}, ["delete", "disconnect", "update"]);
|
|
36
|
-
if (i === data.length - 1)
|
|
37
|
-
resolve(null);
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
return await prisma[this.modelName].createMany(deepmerge({ data: dataWithRelationFieldsHandled }, queryOptions || {}));
|
|
41
|
-
}
|
|
42
|
-
async count(filters) {
|
|
43
|
-
const prisma = getPrismaInstance();
|
|
44
|
-
return await prisma[this.modelName].count({
|
|
45
|
-
where: filters,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
async findMany(filters, queryOptions) {
|
|
49
|
-
const prisma = getPrismaInstance();
|
|
50
|
-
return await prisma[this.modelName].findMany(deepmerge({ where: filters }, queryOptions || {}));
|
|
51
|
-
}
|
|
52
|
-
async findById(id, queryOptions) {
|
|
53
|
-
const prisma = getPrismaInstance();
|
|
54
|
-
return await prisma[this.modelName].findUnique(deepmerge({
|
|
55
|
-
where: { id },
|
|
56
|
-
}, queryOptions || {}));
|
|
57
|
-
}
|
|
58
|
-
async findOne(filters, queryOptions) {
|
|
59
|
-
const prisma = getPrismaInstance();
|
|
60
|
-
if (Object.keys(filters).length === 1 &&
|
|
61
|
-
"id" in filters &&
|
|
62
|
-
filters.id !== "me")
|
|
63
|
-
return prisma[this.modelName].findUnique(deepmerge({
|
|
64
|
-
where: filters,
|
|
65
|
-
}, queryOptions || {}));
|
|
66
|
-
return await prisma[this.modelName].findFirst(deepmerge({
|
|
67
|
-
where: filters,
|
|
68
|
-
}, queryOptions || {}));
|
|
69
|
-
}
|
|
70
|
-
async updateOne(filters, data, queryOptions) {
|
|
71
|
-
const prisma = getPrismaInstance();
|
|
72
|
-
if (kebabCase(this.modelName) === "user" && data?.password) {
|
|
73
|
-
if (!authService.isPasswordHashed(data.password))
|
|
74
|
-
data.password = await authService.hashPassword(data?.password);
|
|
75
|
-
}
|
|
76
|
-
const dataWithRelationFieldsHandled = handleRelationFieldsInBody(data, {
|
|
77
|
-
...this.relationFields,
|
|
78
|
-
});
|
|
79
|
-
return await prisma[this.modelName].update(deepmerge({
|
|
80
|
-
where: filters,
|
|
81
|
-
data: dataWithRelationFieldsHandled,
|
|
82
|
-
}, queryOptions || {}));
|
|
83
|
-
}
|
|
84
|
-
async updateMany(filters, data, queryOptions) {
|
|
85
|
-
const prisma = getPrismaInstance();
|
|
86
|
-
if (Array.isArray(data) && this.modelName === "user")
|
|
87
|
-
await new Promise((resolve) => {
|
|
88
|
-
data.forEach(async (curr, i) => {
|
|
89
|
-
if ("password" in data[i])
|
|
90
|
-
if (!authService.isPasswordHashed(curr.password))
|
|
91
|
-
data[i].password = await authService.hashPassword(curr.password);
|
|
92
|
-
if (i === data.length - 1)
|
|
93
|
-
resolve(undefined);
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
const firstMerge = deepmerge({ data }, queryOptions || {});
|
|
97
|
-
return await prisma[this.modelName].updateMany(deepmerge({ where: filters }, firstMerge));
|
|
98
|
-
}
|
|
99
|
-
async deleteOne(filters) {
|
|
100
|
-
const prisma = getPrismaInstance();
|
|
101
|
-
return await prisma[this.modelName].delete({
|
|
102
|
-
where: filters,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
async deleteMany(filters) {
|
|
106
|
-
const prisma = getPrismaInstance();
|
|
107
|
-
return await prisma[this.modelName].deleteMany({
|
|
108
|
-
where: filters,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
export function getBaseServices() {
|
|
113
|
-
const models = getModels();
|
|
114
|
-
const baseServices = {};
|
|
115
|
-
models.forEach((model) => {
|
|
116
|
-
baseServices[`${camelCase(model)}`] = new BaseService(model);
|
|
117
|
-
});
|
|
118
|
-
return baseServices;
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=base.service.js.map
|
|
1
|
+
"use strict";import{camelCase as p,kebabCase as u}from"../../utils/helpers/change-case.helpers.js";import{getModuleComponents as l}from"../../utils/dynamic-loader.js";import f from"../../utils/helpers/deepmerge.helper.js";import{handleRelationFieldsInBody as k}from"./utils/helpers/base.service.helpers.js";import{getPrismaInstance as h}from"../../utils/helpers/prisma.helpers.js";import w from"../auth/auth.service.js";import i from"./utils/service-hooks-manager.js";import c from"../../utils/prisma/prisma-schema-parser.js";export class BaseService{constructor(a){this.modelName=p(a);const r=c.getModelRelations(a);this.relationFields={singular:r?.filter(e=>e.isRelation&&!e.isArray)||[],list:r?.filter(e=>e.isRelation&&e.isArray)||[]}}async createOne(a,r,e){const o=l(this.modelName)?.hooks;try{o?.beforeCreateOne&&!e?.skip?.includes("before")&&await i.handleHook(o.beforeCreateOne,{data:a,queryOptions:r,context:e}),u(this.modelName)==="user"&&a.password&&(w.isPasswordHashed(a.password)||(a.password=await w.hashPassword(a.password)));const s=h(),n=k(a,{...this.relationFields},["delete","disconnect","update"]),t=await s[this.modelName].create(f({data:n},r||{}));return o?.afterCreateOne&&!e?.skip?.includes("after")&&await i.handleHook(o.afterCreateOne,{result:t,data:a,queryOptions:r,context:e}),t}catch(s){if(o?.onCreateOneError&&!e?.skip?.includes("error")&&await i.handleHook(o.onCreateOneError,{error:s,data:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw s;return}}async createMany(a,r,e){const o=l(this.modelName)?.hooks;try{o?.beforeCreateMany&&!e?.skip?.includes("before")&&await i.handleHook(o.beforeCreateMany,{data:a,queryOptions:r,context:e});const s=h(),n=[];if(Array.isArray(a))for(let d=0;d<a.length;d++){const m=a[d];"password"in m&&this.modelName==="user"&&(w.isPasswordHashed(m.password)||(a[d].password=await w.hashPassword(m?.password))),n[d]=k(a[d],{...this.relationFields},["delete","disconnect","update"])}const t=await s[this.modelName].createMany(f({data:n},r||{}));return o?.afterCreateMany&&!e?.skip?.includes("after")&&await i.handleHook(o.afterCreateMany,{result:t,data:a,queryOptions:r,context:e}),t}catch(s){if(o?.onCreateManyError&&!e?.skip?.includes("error")&&await i.handleHook(o.onCreateManyError,{error:s,data:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw s;return}}async count(a,r){const e=l(this.modelName)?.hooks;try{e?.beforeCount&&!r?.skip?.includes("before")&&await i.handleHook(e.beforeCount,{filters:a,context:r});const s=await h()[this.modelName].count({where:a});return e?.afterCount&&!r?.skip?.includes("after")&&await i.handleHook(e.afterCount,{result:s,filters:a,context:r}),s}catch(o){if(e?.onCountError&&!r?.skip?.includes("error")&&await i.handleHook(e.onCountError,{error:o,filters:a,context:r}),r?.throwOnError!==!1)throw o;return 0}}async findMany(a,r,e){const o=l(this.modelName)?.hooks;try{o?.beforeFindMany&&!e?.skip?.includes("before")&&await i.handleHook(o.beforeFindMany,{filters:a,queryOptions:r,context:e});const n=await h()[this.modelName].findMany(f({where:a},r||{}));return o?.afterFindMany&&!e?.skip?.includes("after")&&await i.handleHook(o.afterFindMany,{result:n,filters:a,queryOptions:r,context:e}),n}catch(s){if(o?.onFindManyError&&!e?.skip?.includes("error")&&await i.handleHook(o.onFindManyError,{error:s,filters:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw s;return[]}}async findById(a,r,e){const o=l(this.modelName)?.hooks;try{o?.beforeFindById&&!e?.skip?.includes("before")&&await i.handleHook(o.beforeFindById,{id:a,queryOptions:r,context:e});const n=await h()[this.modelName].findUnique(f({where:{id:a}},r||{}));return o?.afterFindById&&!e?.skip?.includes("after")&&await i.handleHook(o.afterFindById,{result:n,id:a,queryOptions:r,context:e}),n}catch(s){if(o?.onFindByIdError&&!e?.skip?.includes("error")&&await i.handleHook(o.onFindByIdError,{error:s,id:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw s;return}}async findOne(a,r,e){const o=l(this.modelName)?.hooks;try{o?.beforeFindOne&&!e?.skip?.includes("before")&&await i.handleHook(o.beforeFindOne,{filters:a,queryOptions:r,context:e});const s=h();let n;return Object.keys(a).length===1&&"id"in a&&a.id!=="me"?n=await s[this.modelName].findUnique(f({where:a},r||{})):n=await s[this.modelName].findFirst(f({where:a},r||{})),o?.afterFindOne&&!e?.skip?.includes("after")&&await i.handleHook(o.afterFindOne,{result:n,filters:a,queryOptions:r,context:e}),n}catch(s){if(o?.onFindOneError&&!e?.skip?.includes("error")&&await i.handleHook(o.onFindOneError,{error:s,filters:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw s;return}}async updateOne(a,r,e,o){const s=l(this.modelName)?.hooks;try{s?.beforeUpdateOne&&!o?.skip?.includes("before")&&await i.handleHook(s.beforeUpdateOne,{filters:a,data:r,queryOptions:e,context:o}),u(this.modelName)==="user"&&r?.password&&(w.isPasswordHashed(r.password)||(r.password=await w.hashPassword(r?.password)));const n=h(),t=k(r,{...this.relationFields}),d=await n[this.modelName].update(f({where:a,data:t},e||{}));return s?.afterUpdateOne&&!o?.skip?.includes("after")&&await i.handleHook(s.afterUpdateOne,{result:d,filters:a,data:r,queryOptions:e,context:o}),d}catch(n){if(s?.onUpdateOneError&&!o?.skip?.includes("error")&&await i.handleHook(s.onUpdateOneError,{error:n,filters:a,data:r,queryOptions:e,context:o}),o?.throwOnError!==!1)throw n;return}}async updateMany(a,r,e,o){const s=l(this.modelName)?.hooks;try{s?.beforeUpdateMany&&!o?.skip?.includes("before")&&await i.handleHook(s.beforeUpdateMany,{filters:a,data:r,queryOptions:e,context:o});const n=h();this.modelName==="user"&&"password"in r&&r?.password&&(w.isPasswordHashed(r.password)||(r.password=await w.hashPassword(r?.password)));const t=f({data:r},e||{}),d=await n[this.modelName].updateMany(f({where:a},t));return s?.afterUpdateMany&&!o?.skip?.includes("after")&&await i.handleHook(s.afterUpdateMany,{result:d,filters:a,data:r,queryOptions:e,context:o}),d}catch(n){if(s?.onUpdateManyError&&!o?.skip?.includes("error")&&await i.handleHook(s.onUpdateManyError,{error:n,filters:a,data:r,queryOptions:e,context:o}),o?.throwOnError!==!1)throw n;return}}async deleteOne(a,r){const e=l(this.modelName)?.hooks;try{e?.beforeDeleteOne&&!r?.skip?.includes("before")&&await i.handleHook(e.beforeDeleteOne,{filters:a,context:r});const s=await h()[this.modelName].delete({where:a});return e?.afterDeleteOne&&!r?.skip?.includes("after")&&await i.handleHook(e.afterDeleteOne,{result:s,filters:a,context:r}),s}catch(o){if(e?.onDeleteOneError&&!r?.skip?.includes("error")&&await i.handleHook(e.onDeleteOneError,{error:o,filters:a,context:r}),r?.throwOnError!==!1)throw o;return}}async deleteMany(a,r){const e=l(this.modelName)?.hooks;try{e?.beforeDeleteMany&&!r?.skip?.includes("before")&&await i.handleHook(e.beforeDeleteMany,{filters:a,context:r});const s=await h()[this.modelName].deleteMany({where:a});return e?.afterDeleteMany&&!r?.skip?.includes("after")&&await i.handleHook(e.afterDeleteMany,{result:s,filters:a,context:r}),s}catch(o){if(e?.onDeleteManyError&&!r?.skip?.includes("error")&&await i.handleHook(e.onDeleteManyError,{error:o,filters:a,context:r}),r?.throwOnError!==!1)throw o;return}}}
|