arkos 1.2.14-test → 1.2.14-test.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -14
- package/cli.js +2 -11
- 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/services/index.js +1 -49
- 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.router.js +1 -124
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +1 -192
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +1 -83
- package/dist/cjs/modules/base/base.controller.js +1 -159
- 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/utils/helpers/base.controller.helpers.js +1 -82
- 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 -167
- 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/email/email.service.js +1 -104
- package/dist/cjs/modules/error-handler/error-handler.controller.js +4 -144
- 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/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 -195
- 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.router.js +1 -56
- 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/utils/helpers/file-upload.helpers.js +1 -90
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
- package/dist/cjs/modules/swagger/swagger.router.js +1 -141
- 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 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.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 -0
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
- 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/index.js +1 -11
- package/dist/cjs/types/router-config.js +1 -3
- package/dist/cjs/utils/arkos-env.js +1 -9
- package/dist/cjs/utils/cli/build.js +6 -229
- package/dist/cjs/utils/cli/build.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +5 -271
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/generate.js +12 -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/start.js +5 -93
- package/dist/cjs/utils/cli/start.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -26
- package/dist/cjs/utils/cli/utils/cli.helpers.js.map +1 -1
- 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 +6 -15
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +71 -133
- 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 +24 -46
- 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 +12 -32
- 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 +7 -27
- 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/dotenv.helpers.js +1 -43
- package/dist/cjs/utils/features/api.features.js +1 -161
- 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/helpers/api.features.helpers.js +1 -106
- 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/fs.helpers.js +1 -54
- package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/global.helpers.js +1 -40
- package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/models.helpers.js +11 -325
- package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +1 -49
- 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 -0
- package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -0
- package/dist/cjs/utils/helpers/text.helpers.js +1 -28
- package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js +1 -0
- package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
- 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 +3 -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 -0
- package/dist/cjs/utils/sheu.js.map +1 -0
- package/dist/cjs/utils/validate-dto.js +1 -17
- package/dist/cjs/utils/validate-schema.js +1 -15
- package/dist/esm/app.js +1 -0
- package/dist/esm/app.js.map +1 -0
- package/dist/esm/exports/auth/index.js +1 -0
- package/dist/esm/exports/controllers/index.js +1 -0
- package/dist/esm/exports/error-handler/index.js +1 -0
- package/dist/esm/exports/index.js +1 -0
- package/dist/esm/exports/middlewares/index.js +1 -0
- package/dist/esm/exports/prisma/index.js +1 -0
- package/dist/esm/exports/services/index.js +1 -0
- package/dist/esm/exports/utils/index.js +1 -0
- package/dist/esm/exports/validation/index.js +1 -0
- package/dist/esm/modules/auth/auth.controller.js +1 -0
- package/dist/esm/modules/auth/auth.router.js +1 -0
- package/dist/esm/modules/auth/auth.router.js.map +1 -0
- package/dist/esm/modules/auth/auth.service.js +1 -0
- package/dist/esm/modules/auth/auth.service.js.map +1 -0
- package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +1 -0
- package/dist/esm/modules/base/base.controller.js +1 -0
- package/dist/esm/modules/base/base.controller.js.map +1 -0
- package/dist/esm/modules/base/base.middlewares.js +1 -0
- package/dist/esm/modules/base/base.middlewares.js.map +1 -0
- package/dist/esm/modules/base/base.router.js +1 -0
- package/dist/esm/modules/base/base.router.js.map +1 -0
- package/dist/esm/modules/base/base.service.js +1 -0
- package/dist/{es2020 → esm}/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.controller.helpers.js +1 -0
- package/dist/esm/modules/base/utils/helpers/base.middlewares.helpers.js +1 -0
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +1 -0
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -0
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +1 -0
- package/dist/esm/modules/email/email.service.js +1 -0
- package/dist/esm/modules/error-handler/error-handler.controller.js +4 -0
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -0
- package/dist/esm/modules/error-handler/utils/app-error.js +1 -0
- package/dist/esm/modules/error-handler/utils/catch-async.js +1 -0
- package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -0
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +3 -0
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -0
- package/dist/esm/modules/file-upload/file-upload.controller.js +1 -0
- package/dist/esm/modules/file-upload/file-upload.router.js +1 -0
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -0
- package/dist/esm/modules/file-upload/file-upload.service.js +1 -0
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +1 -0
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -0
- package/dist/esm/modules/swagger/swagger.router.js +1 -0
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.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 -0
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/server.js +5 -0
- package/dist/esm/server.js.map +1 -0
- package/dist/esm/types/arkos-config.js +1 -0
- package/dist/esm/types/arkos-config.js.map +1 -0
- package/dist/esm/types/auth.js +1 -0
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/types/router-config.js +1 -0
- package/dist/esm/utils/arkos-env.js +1 -0
- package/dist/esm/utils/cli/build.js +6 -0
- package/dist/esm/utils/cli/build.js.map +1 -0
- package/dist/esm/utils/cli/dev.js +5 -0
- package/dist/esm/utils/cli/dev.js.map +1 -0
- package/dist/esm/utils/cli/generate.js +12 -0
- package/dist/{es2020 → esm}/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +1 -0
- package/dist/esm/utils/cli/start.js +5 -0
- package/dist/esm/utils/cli/start.js.map +1 -0
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -0
- package/dist/esm/utils/cli/utils/cli.helpers.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +21 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +12 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js +206 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +36 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js +18 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js +15 -0
- package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js +2 -0
- package/dist/esm/utils/dotenv.helpers.js +1 -0
- package/dist/esm/utils/features/api.features.js +1 -0
- package/dist/esm/utils/features/api.features.js.map +1 -0
- package/dist/esm/utils/features/change-case.features.js +1 -0
- package/dist/esm/utils/helpers/api.features.helpers.js +1 -0
- package/dist/esm/utils/helpers/change-case.helpers.js +1 -0
- package/dist/esm/utils/helpers/deepmerge.helper.js +1 -0
- package/dist/esm/utils/helpers/fs.helpers.js +1 -0
- package/dist/esm/utils/helpers/fs.helpers.js.map +1 -0
- package/dist/esm/utils/helpers/global.helpers.js +1 -0
- package/dist/esm/utils/helpers/global.helpers.js.map +1 -0
- package/dist/esm/utils/helpers/models.helpers.js +11 -0
- package/dist/esm/utils/helpers/models.helpers.js.map +1 -0
- package/dist/esm/utils/helpers/prisma.helpers.js +1 -0
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -0
- package/dist/esm/utils/helpers/query-parser.helpers.js +1 -0
- package/dist/esm/utils/helpers/routers.helpers.js +1 -0
- package/dist/esm/utils/helpers/routers.helpers.js.map +1 -0
- package/dist/esm/utils/helpers/text.helpers.js +1 -0
- package/dist/esm/utils/prisma/enhaced-prisma-json-schema-generator.js +1 -0
- package/dist/esm/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
- 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 +3 -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 -0
- package/dist/esm/utils/sheu.js.map +1 -0
- package/dist/esm/utils/validate-dto.js +1 -0
- package/dist/esm/utils/validate-schema.js +1 -0
- package/dist/types/modules/base/base.middlewares.d.ts +4 -4
- package/dist/types/modules/base/base.service.d.ts +1 -1
- package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +4 -1
- package/dist/types/modules/error-handler/utils/catch-async.d.ts +1 -0
- package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +4 -0
- package/dist/types/modules/file-upload/file-upload.router.d.ts +1 -1
- package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +2 -1
- package/dist/types/modules/swagger/swagger.router.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +3 -0
- package/dist/types/modules/swagger/utils/helpers/get-system-json-schema-paths.d.ts +2 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +1 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +2 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.d.ts +1 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.d.ts +3 -0
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.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 +7 -0
- package/dist/types/server.d.ts +3 -0
- package/dist/types/types/arkos-config.d.ts +10 -5
- package/dist/types/utils/cli/utils/cli.helpers.d.ts +1 -1
- package/dist/types/utils/features/api.features.d.ts +1 -0
- package/dist/types/utils/helpers/global.helpers.d.ts +6 -1
- package/dist/types/utils/helpers/models.helpers.d.ts +31 -5
- package/dist/types/utils/helpers/routers.helpers.d.ts +2 -0
- package/dist/types/utils/prisma/enhaced-prisma-json-schema-generator.d.ts +34 -0
- package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +10 -0
- package/dist/types/utils/prisma/prisma-schema-parser.d.ts +18 -0
- package/dist/types/utils/prisma/types.d.ts +48 -0
- package/dist/types/utils/sheu.d.ts +70 -0
- package/package.json +34 -35
- package/dist/es2020/app.js +0 -1
- package/dist/es2020/app.js.map +0 -1
- package/dist/es2020/exports/auth/index.js +0 -2
- package/dist/es2020/exports/controllers/index.js +0 -4
- package/dist/es2020/exports/error-handler/index.js +0 -4
- package/dist/es2020/exports/index.js +0 -8
- package/dist/es2020/exports/middlewares/index.js +0 -2
- package/dist/es2020/exports/prisma/index.js +0 -3
- package/dist/es2020/exports/services/index.js +0 -9
- package/dist/es2020/exports/utils/index.js +0 -4
- package/dist/es2020/exports/validation/index.js +0 -4
- package/dist/es2020/modules/auth/auth.controller.js +0 -187
- package/dist/es2020/modules/auth/auth.router.js +0 -118
- package/dist/es2020/modules/auth/auth.router.js.map +0 -1
- package/dist/es2020/modules/auth/auth.service.js +0 -185
- package/dist/es2020/modules/auth/auth.service.js.map +0 -1
- package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +0 -73
- package/dist/es2020/modules/base/base.controller.js +0 -151
- package/dist/es2020/modules/base/base.controller.js.map +0 -1
- package/dist/es2020/modules/base/base.middlewares.js +0 -81
- package/dist/es2020/modules/base/base.middlewares.js.map +0 -1
- package/dist/es2020/modules/base/base.router.js +0 -17
- package/dist/es2020/modules/base/base.router.js.map +0 -1
- package/dist/es2020/modules/base/base.service.js +0 -120
- package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js +0 -77
- package/dist/es2020/modules/base/utils/helpers/base.middlewares.helpers.js +0 -44
- package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +0 -161
- package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
- package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +0 -165
- package/dist/es2020/modules/email/email.service.js +0 -97
- package/dist/es2020/modules/error-handler/error-handler.controller.js +0 -105
- package/dist/es2020/modules/error-handler/error-handler.controller.js.map +0 -1
- package/dist/es2020/modules/error-handler/utils/app-error.js +0 -15
- package/dist/es2020/modules/error-handler/utils/catch-async.js +0 -10
- package/dist/es2020/modules/error-handler/utils/catch-async.js.map +0 -1
- package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +0 -155
- package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
- package/dist/es2020/modules/file-upload/file-upload.controller.js +0 -266
- package/dist/es2020/modules/file-upload/file-upload.router.js +0 -50
- package/dist/es2020/modules/file-upload/file-upload.router.js.map +0 -1
- package/dist/es2020/modules/file-upload/file-upload.service.js +0 -314
- package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -81
- package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
- package/dist/es2020/modules/swagger/swagger.router.js +0 -135
- package/dist/es2020/modules/swagger/swagger.router.js.map +0 -1
- package/dist/es2020/server.js +0 -3
- package/dist/es2020/server.js.map +0 -1
- package/dist/es2020/types/arkos-config.js +0 -2
- package/dist/es2020/types/arkos-config.js.map +0 -1
- package/dist/es2020/types/auth.js +0 -2
- package/dist/es2020/types/index.js +0 -8
- package/dist/es2020/types/router-config.js +0 -2
- package/dist/es2020/utils/arkos-env.js +0 -7
- package/dist/es2020/utils/cli/build.js +0 -223
- package/dist/es2020/utils/cli/build.js.map +0 -1
- package/dist/es2020/utils/cli/dev.js +0 -264
- package/dist/es2020/utils/cli/dev.js.map +0 -1
- package/dist/es2020/utils/cli/generate.js +0 -183
- package/dist/es2020/utils/cli/index.js +0 -74
- package/dist/es2020/utils/cli/start.js +0 -86
- package/dist/es2020/utils/cli/start.js.map +0 -1
- package/dist/es2020/utils/cli/utils/cli.helpers.js +0 -18
- package/dist/es2020/utils/cli/utils/cli.helpers.js.map +0 -1
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +0 -33
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -18
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js +0 -265
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +0 -1
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +0 -55
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +0 -1
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js +0 -32
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js.map +0 -1
- package/dist/es2020/utils/cli/utils/template-generator/templates/generate-service-template.js +0 -32
- package/dist/es2020/utils/cli/utils/template-generators.js +0 -25
- package/dist/es2020/utils/dotenv.helpers.js +0 -37
- package/dist/es2020/utils/features/api.features.js +0 -154
- package/dist/es2020/utils/features/api.features.js.map +0 -1
- package/dist/es2020/utils/features/change-case.features.js +0 -31
- package/dist/es2020/utils/helpers/api.features.helpers.js +0 -103
- package/dist/es2020/utils/helpers/change-case.helpers.js +0 -161
- package/dist/es2020/utils/helpers/deepmerge.helper.js +0 -113
- package/dist/es2020/utils/helpers/fs.helpers.js +0 -45
- package/dist/es2020/utils/helpers/fs.helpers.js.map +0 -1
- package/dist/es2020/utils/helpers/global.helpers.js +0 -4
- package/dist/es2020/utils/helpers/global.helpers.js.map +0 -1
- package/dist/es2020/utils/helpers/models.helpers.js +0 -276
- package/dist/es2020/utils/helpers/models.helpers.js.map +0 -1
- package/dist/es2020/utils/helpers/prisma.helpers.js +0 -41
- package/dist/es2020/utils/helpers/prisma.helpers.js.map +0 -1
- package/dist/es2020/utils/helpers/query-parser.helpers.js +0 -40
- package/dist/es2020/utils/helpers/text.helpers.js +0 -22
- package/dist/es2020/utils/validate-dto.js +0 -11
- package/dist/es2020/utils/validate-schema.js +0 -9
- /package/dist/{es2020 → esm}/exports/auth/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/controllers/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/error-handler/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/middlewares/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/prisma/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/services/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/utils/index.js.map +0 -0
- /package/dist/{es2020 → esm}/exports/validation/index.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/auth/auth.controller.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.controller.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.service.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/email/email.service.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/error-handler/utils/app-error.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/file-upload/file-upload.controller.js.map +0 -0
- /package/dist/{es2020 → esm}/modules/file-upload/file-upload.service.js.map +0 -0
- /package/dist/{es2020 → esm}/paths.js +0 -0
- /package/dist/{es2020 → esm}/paths.js.map +0 -0
- /package/dist/{es2020 → esm}/types/auth.js.map +0 -0
- /package/dist/{es2020 → esm}/types/index.js.map +0 -0
- /package/dist/{es2020 → esm}/types/router-config.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/arkos-env.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/cli/index.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/cli/utils/template-generators.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/dotenv.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/features/change-case.features.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/helpers/api.features.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/helpers/change-case.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/helpers/deepmerge.helper.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/helpers/query-parser.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/helpers/text.helpers.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/validate-dto.js.map +0 -0
- /package/dist/{es2020 → esm}/utils/validate-schema.js.map +0 -0
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import AppError from "../error-handler/utils/app-error";
|
|
2
|
-
import { getFileUploadServices, } from "./file-upload.service";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import fs from "fs";
|
|
5
|
-
import catchAsync from "../error-handler/utils/catch-async";
|
|
6
|
-
import { getArkosConfig } from "../../server";
|
|
7
|
-
import { processFile, processImage } from "./utils/helpers/file-upload.helpers";
|
|
8
|
-
import { accessAsync, mkdirAsync, statAsync, } from "../../utils/helpers/fs.helpers";
|
|
9
|
-
import { getModelModules } from "../../utils/helpers/models.helpers";
|
|
10
|
-
class FileUploadController {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.uploadFile = catchAsync(async (req, res, next) => {
|
|
13
|
-
this.middlewares = getModelModules("file-upload")?.middlewares || {};
|
|
14
|
-
const { fileType } = req.params;
|
|
15
|
-
const { format, width, height, resizeTo } = req.query;
|
|
16
|
-
const options = { format, width, height, resizeTo };
|
|
17
|
-
const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = getFileUploadServices();
|
|
18
|
-
const { fileUpload } = getArkosConfig();
|
|
19
|
-
const baseUploadDir = fileUpload?.baseUploadDir || "/uploads";
|
|
20
|
-
const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);
|
|
21
|
-
try {
|
|
22
|
-
await accessAsync(uploadPath);
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
await mkdirAsync(uploadPath, { recursive: true });
|
|
26
|
-
}
|
|
27
|
-
let uploader;
|
|
28
|
-
switch (fileType) {
|
|
29
|
-
case "images":
|
|
30
|
-
uploader = imageUploadService;
|
|
31
|
-
break;
|
|
32
|
-
case "videos":
|
|
33
|
-
uploader = videoUploadService;
|
|
34
|
-
break;
|
|
35
|
-
case "documents":
|
|
36
|
-
uploader = documentUploadService;
|
|
37
|
-
break;
|
|
38
|
-
case "files":
|
|
39
|
-
uploader = fileUploadService;
|
|
40
|
-
break;
|
|
41
|
-
default:
|
|
42
|
-
return next(new AppError("Invalid file type", 400));
|
|
43
|
-
}
|
|
44
|
-
uploader.handleMultipleUpload()(req, res, async (err) => {
|
|
45
|
-
if (err)
|
|
46
|
-
return next(err);
|
|
47
|
-
let data;
|
|
48
|
-
if (req.files && Array.isArray(req.files) && req.files.length > 0) {
|
|
49
|
-
if (fileType === "images") {
|
|
50
|
-
data = await Promise.all(req.files.map((file) => processImage(req, file.path, options)));
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
data = await Promise.all(req.files.map((file) => processFile(req, file.path)));
|
|
54
|
-
}
|
|
55
|
-
data = data.filter((url) => url !== null);
|
|
56
|
-
}
|
|
57
|
-
else if (req.file) {
|
|
58
|
-
if (fileType === "images") {
|
|
59
|
-
data = await processImage(req, req.file.path, options);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
data = await processFile(req, req.file.path);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
return next(new AppError("No file uploaded", 400));
|
|
67
|
-
}
|
|
68
|
-
const jsonContent = {
|
|
69
|
-
success: true,
|
|
70
|
-
data,
|
|
71
|
-
message: Array.isArray(data)
|
|
72
|
-
? `${data.length} files uploaded successfully`
|
|
73
|
-
: "File uploaded successfully",
|
|
74
|
-
};
|
|
75
|
-
if (this.middlewares?.afterUploadFile) {
|
|
76
|
-
req.responseData = jsonContent;
|
|
77
|
-
req.responseStatus = 200;
|
|
78
|
-
return next();
|
|
79
|
-
}
|
|
80
|
-
res.status(200).json(jsonContent);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
this.deleteFile = catchAsync(async (req, res, next) => {
|
|
84
|
-
this.middlewares = getModelModules("file-upload")?.middlewares || {};
|
|
85
|
-
const { fileType, fileName } = req.params;
|
|
86
|
-
const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = getFileUploadServices();
|
|
87
|
-
let uploader;
|
|
88
|
-
switch (fileType) {
|
|
89
|
-
case "images":
|
|
90
|
-
uploader = imageUploadService;
|
|
91
|
-
break;
|
|
92
|
-
case "videos":
|
|
93
|
-
uploader = videoUploadService;
|
|
94
|
-
break;
|
|
95
|
-
case "documents":
|
|
96
|
-
uploader = documentUploadService;
|
|
97
|
-
break;
|
|
98
|
-
case "files":
|
|
99
|
-
uploader = fileUploadService;
|
|
100
|
-
break;
|
|
101
|
-
default:
|
|
102
|
-
return next(new AppError("Invalid file type", 400));
|
|
103
|
-
}
|
|
104
|
-
try {
|
|
105
|
-
const { fileUpload } = getArkosConfig();
|
|
106
|
-
const baseUploadRoute = fileUpload?.baseRoute || "/api/uploads";
|
|
107
|
-
const urlPattern = new RegExp(`${baseUploadRoute}/${fileType}/${fileName}`);
|
|
108
|
-
const isExpectedUrlPattern = urlPattern.test(req.originalUrl);
|
|
109
|
-
if (isExpectedUrlPattern) {
|
|
110
|
-
const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
|
|
111
|
-
await uploader.deleteFileByUrl(fullUrl);
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
await uploader.deleteFileByName(fileName, fileType);
|
|
115
|
-
}
|
|
116
|
-
if (this.middlewares.afterDeleteFile) {
|
|
117
|
-
req.responseStatus = 204;
|
|
118
|
-
return next();
|
|
119
|
-
}
|
|
120
|
-
res.status(204).json();
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
if (error instanceof AppError) {
|
|
124
|
-
return next(error);
|
|
125
|
-
}
|
|
126
|
-
return next(new AppError("File not found", 404));
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
this.updateFile = catchAsync(async (req, res, next) => {
|
|
130
|
-
this.middlewares = getModelModules("file-upload")?.middlewares || {};
|
|
131
|
-
const { fileType, fileName } = req.params;
|
|
132
|
-
const { format, width, height, resizeTo } = req.query;
|
|
133
|
-
const options = { format, width, height, resizeTo };
|
|
134
|
-
const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = getFileUploadServices();
|
|
135
|
-
const { fileUpload } = getArkosConfig();
|
|
136
|
-
const baseUploadDir = fileUpload?.baseUploadDir || "/uploads";
|
|
137
|
-
const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);
|
|
138
|
-
try {
|
|
139
|
-
await accessAsync(uploadPath);
|
|
140
|
-
}
|
|
141
|
-
catch (err) {
|
|
142
|
-
await mkdirAsync(uploadPath, { recursive: true });
|
|
143
|
-
}
|
|
144
|
-
let uploader;
|
|
145
|
-
switch (fileType) {
|
|
146
|
-
case "images":
|
|
147
|
-
uploader = imageUploadService;
|
|
148
|
-
break;
|
|
149
|
-
case "videos":
|
|
150
|
-
uploader = videoUploadService;
|
|
151
|
-
break;
|
|
152
|
-
case "documents":
|
|
153
|
-
uploader = documentUploadService;
|
|
154
|
-
break;
|
|
155
|
-
case "files":
|
|
156
|
-
uploader = fileUploadService;
|
|
157
|
-
break;
|
|
158
|
-
default:
|
|
159
|
-
return next(new AppError("Invalid file type", 400));
|
|
160
|
-
}
|
|
161
|
-
uploader.handleMultipleUpload()(req, res, async (err) => {
|
|
162
|
-
if (err)
|
|
163
|
-
return next(err);
|
|
164
|
-
if (!req.file &&
|
|
165
|
-
(!req.files || !Array.isArray(req.files) || req.files.length === 0)) {
|
|
166
|
-
return next(new AppError("No new file uploaded", 400));
|
|
167
|
-
}
|
|
168
|
-
if (fileName && fileName.trim() !== "") {
|
|
169
|
-
try {
|
|
170
|
-
const baseUploadRoute = fileUpload?.baseRoute || "/api/uploads";
|
|
171
|
-
const urlPattern = new RegExp(`${baseUploadRoute}/${fileType}/${fileName}`);
|
|
172
|
-
const isExpectedUrlPattern = urlPattern.test(req.originalUrl);
|
|
173
|
-
if (isExpectedUrlPattern) {
|
|
174
|
-
const oldFileUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
|
|
175
|
-
await uploader.deleteFileByUrl(oldFileUrl);
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
await uploader.deleteFileByName(fileName, fileType);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
console.warn(`Could not delete old file: ${fileName}`, error);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
let data;
|
|
186
|
-
if (req.files && Array.isArray(req.files) && req.files.length > 0) {
|
|
187
|
-
if (fileType === "images") {
|
|
188
|
-
data = await Promise.all(req.files.map((file) => processImage(req, file.path, options)));
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
data = await Promise.all(req.files.map((file) => processFile(req, file.path)));
|
|
192
|
-
}
|
|
193
|
-
data = data.filter((url) => url !== null);
|
|
194
|
-
}
|
|
195
|
-
else if (req.file) {
|
|
196
|
-
if (fileType === "images") {
|
|
197
|
-
data = await processImage(req, req.file.path, options);
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
data = await processFile(req, req.file.path);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
const jsonContent = {
|
|
204
|
-
success: true,
|
|
205
|
-
data,
|
|
206
|
-
message: Array.isArray(data)
|
|
207
|
-
? fileName && fileName.trim() !== ""
|
|
208
|
-
? `File updated successfully. ${data.length} new files uploaded`
|
|
209
|
-
: `${data.length} files uploaded successfully`
|
|
210
|
-
: fileName && fileName.trim() !== ""
|
|
211
|
-
? "File updated successfully"
|
|
212
|
-
: "File uploaded successfully",
|
|
213
|
-
};
|
|
214
|
-
if (this.middlewares.afterUpdateFile) {
|
|
215
|
-
req.responseData = jsonContent;
|
|
216
|
-
req.responseStatus = 200;
|
|
217
|
-
return next();
|
|
218
|
-
}
|
|
219
|
-
res.status(200).json(jsonContent);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
this.streamFile = catchAsync(async (req, res, next) => {
|
|
223
|
-
const { fileName, fileType } = req.params;
|
|
224
|
-
const filePath = path.join(".", "uploads", fileType, fileName);
|
|
225
|
-
try {
|
|
226
|
-
await accessAsync(filePath);
|
|
227
|
-
}
|
|
228
|
-
catch (err) {
|
|
229
|
-
throw new AppError("File not found", 404);
|
|
230
|
-
}
|
|
231
|
-
const fileStat = await statAsync(filePath);
|
|
232
|
-
const fileSize = fileStat.size;
|
|
233
|
-
const range = req.headers.range;
|
|
234
|
-
if (range) {
|
|
235
|
-
const [partialStart, partialEnd] = range
|
|
236
|
-
.replace(/bytes=/, "")
|
|
237
|
-
.split("-");
|
|
238
|
-
const start = parseInt(partialStart, 10) || 0;
|
|
239
|
-
const end = partialEnd ? parseInt(partialEnd, 10) : fileSize - 1;
|
|
240
|
-
if (start >= fileSize || end >= fileSize) {
|
|
241
|
-
res.status(416).json({ error: "Range Not Satisfiable" });
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
res.writeHead(206, {
|
|
245
|
-
"Content-Range": `bytes ${start}-${end}/${fileSize}`,
|
|
246
|
-
"Accept-Ranges": "bytes",
|
|
247
|
-
"Content-Length": end - start + 1,
|
|
248
|
-
"Content-Type": "application/octet-stream",
|
|
249
|
-
"Content-Disposition": `inline; filename="${fileName}"`,
|
|
250
|
-
});
|
|
251
|
-
fs.createReadStream(filePath, { start, end }).pipe(res);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
res.writeHead(200, {
|
|
255
|
-
"Content-Length": fileSize,
|
|
256
|
-
"Content-Type": "application/octet-stream",
|
|
257
|
-
"Content-Disposition": `inline; filename="${fileName}"`,
|
|
258
|
-
});
|
|
259
|
-
fs.createReadStream(filePath).pipe(res);
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
const fileUploadController = new FileUploadController();
|
|
265
|
-
export default fileUploadController;
|
|
266
|
-
//# sourceMappingURL=file-upload.controller.js.map
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { Router } from "express";
|
|
2
|
-
import { importPrismaModelModules } from "../../utils/helpers/models.helpers";
|
|
3
|
-
import authService from "../auth/auth.service";
|
|
4
|
-
import fileUploadController from "./file-upload.controller";
|
|
5
|
-
import path from "path";
|
|
6
|
-
import express from "express";
|
|
7
|
-
import deepmerge from "../../utils/helpers/deepmerge.helper";
|
|
8
|
-
import { sendResponse } from "../base/base.middlewares";
|
|
9
|
-
const router = Router();
|
|
10
|
-
export async function getFileUploadRouter({ fileUpload }) {
|
|
11
|
-
const modelModules = await importPrismaModelModules("file-upload");
|
|
12
|
-
let { middlewares = {}, authConfigs = {} } = {};
|
|
13
|
-
if (modelModules) {
|
|
14
|
-
({ middlewares = {}, authConfigs = {} } = modelModules);
|
|
15
|
-
}
|
|
16
|
-
let basePathname = fileUpload?.baseRoute || "/api/uploads/";
|
|
17
|
-
if (!basePathname.startsWith("/"))
|
|
18
|
-
basePathname = "/" + basePathname;
|
|
19
|
-
if (!basePathname.endsWith("/"))
|
|
20
|
-
basePathname = basePathname + "/";
|
|
21
|
-
router.get(`${basePathname}*`, authService.handleAuthenticationControl("View", authConfigs.authenticationControl), authService.handleAccessControl("View", "file-upload", authConfigs.accessControl), ...(middlewares?.beforeFindFile ? [middlewares?.beforeFindFile] : []), (req, res, next) => {
|
|
22
|
-
req.url = req.url.replace(basePathname, "/");
|
|
23
|
-
next();
|
|
24
|
-
}, express.static(path.resolve(process.cwd(), fileUpload?.baseUploadDir || "uploads"), deepmerge({
|
|
25
|
-
maxAge: "1y",
|
|
26
|
-
etag: true,
|
|
27
|
-
lastModified: true,
|
|
28
|
-
dotfiles: "ignore",
|
|
29
|
-
fallthrough: true,
|
|
30
|
-
index: false,
|
|
31
|
-
cacheControl: true,
|
|
32
|
-
}, fileUpload?.expressStaticOptions || {})));
|
|
33
|
-
router.post(`${basePathname}:fileType`, authService.handleAuthenticationControl("Create", authConfigs.authenticationControl), authService.handleAccessControl("Create", "file-upload", authConfigs.accessControl), middlewares?.beforeUploadFile || fileUploadController.uploadFile, middlewares?.beforeUploadFile
|
|
34
|
-
? fileUploadController.uploadFile
|
|
35
|
-
: middlewares?.afterUploadFile || sendResponse, middlewares?.beforeUploadFile && middlewares?.afterUploadFile
|
|
36
|
-
? middlewares?.afterUploadFile
|
|
37
|
-
: sendResponse, sendResponse);
|
|
38
|
-
router.patch(`${basePathname}:fileType/:fileName`, authService.handleAuthenticationControl("Update", authConfigs.authenticationControl), authService.handleAccessControl("Update", "file-upload", authConfigs.accessControl), middlewares?.beforeUpdateFile || fileUploadController.updateFile, middlewares?.beforeUpdateFile
|
|
39
|
-
? fileUploadController.updateFile
|
|
40
|
-
: middlewares?.afterUpdateFile || sendResponse, middlewares?.beforeUpdateFile && middlewares?.afterUpdateFile
|
|
41
|
-
? middlewares?.afterUpdateFile
|
|
42
|
-
: sendResponse, sendResponse);
|
|
43
|
-
router.delete(`${basePathname}:fileType/:fileName`, authService.handleAuthenticationControl("Delete", authConfigs.authenticationControl), authService.handleAccessControl("Delete", "file-upload", authConfigs.accessControl), middlewares?.beforeDeleteFile || fileUploadController.deleteFile, middlewares?.beforeDeleteFile
|
|
44
|
-
? fileUploadController.deleteFile
|
|
45
|
-
: middlewares?.afterDeleteFile || sendResponse, middlewares?.beforeDeleteFile && middlewares?.afterDeleteFile
|
|
46
|
-
? middlewares?.afterDeleteFile
|
|
47
|
-
: sendResponse, sendResponse);
|
|
48
|
-
return router;
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=file-upload.router.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.router.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport authService from \"../auth/auth.service\";\nimport fileUploadController from \"./file-upload.controller\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport path from \"path\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthConfigs } from \"../../types/auth\";\nimport { sendResponse } from \"../base/base.middlewares\";\n\nconst router: Router = Router();\n\nexport async function getFileUploadRouter({ fileUpload }: ArkosConfig) {\n const modelModules = await importPrismaModelModules(\"file-upload\");\n let { middlewares = {} as any, authConfigs = {} as AuthConfigs } = {};\n\n if (modelModules) {\n ({ middlewares = {}, authConfigs = {} } = modelModules);\n }\n\n let basePathname = fileUpload?.baseRoute || \"/api/uploads/\";\n\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n // Static file serving route\n router.get(\n `${basePathname}*`,\n authService.handleAuthenticationControl(\n \"View\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"View\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...(middlewares?.beforeFindFile ? [middlewares?.beforeFindFile] : []),\n (req, res, next) => {\n req.url = req.url.replace(basePathname, \"/\");\n next();\n },\n express.static(\n path.resolve(process.cwd(), fileUpload?.baseUploadDir || \"uploads\"),\n deepmerge(\n {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: true,\n index: false,\n cacheControl: true,\n },\n fileUpload?.expressStaticOptions || {}\n )\n )\n );\n\n // POST /{basePathname}:fileType - Upload File\n router.post(\n `${basePathname}:fileType`,\n authService.handleAuthenticationControl(\n \"Create\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Create\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n middlewares?.beforeUploadFile || fileUploadController.uploadFile,\n middlewares?.beforeUploadFile\n ? fileUploadController.uploadFile\n : middlewares?.afterUploadFile || sendResponse,\n middlewares?.beforeUploadFile && middlewares?.afterUploadFile\n ? middlewares?.afterUploadFile\n : sendResponse,\n sendResponse\n );\n\n // PATCH /{basePathname}:fileType/:fileName - Update File\n router.patch(\n `${basePathname}:fileType/:fileName`,\n authService.handleAuthenticationControl(\n \"Update\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Update\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n middlewares?.beforeUpdateFile || fileUploadController.updateFile,\n middlewares?.beforeUpdateFile\n ? fileUploadController.updateFile\n : middlewares?.afterUpdateFile || sendResponse,\n middlewares?.beforeUpdateFile && middlewares?.afterUpdateFile\n ? middlewares?.afterUpdateFile\n : sendResponse,\n sendResponse\n );\n\n // DELETE /{basePathname}:fileType/:fileName - Delete File\n router.delete(\n `${basePathname}:fileType/:fileName`,\n authService.handleAuthenticationControl(\n \"Delete\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Delete\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n middlewares?.beforeDeleteFile || fileUploadController.deleteFile,\n middlewares?.beforeDeleteFile\n ? fileUploadController.deleteFile\n : middlewares?.afterDeleteFile || sendResponse,\n middlewares?.beforeDeleteFile && middlewares?.afterDeleteFile\n ? middlewares?.afterDeleteFile\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import multer from "multer";
|
|
2
|
-
import path from "path";
|
|
3
|
-
import fs from "fs";
|
|
4
|
-
import AppError from "../error-handler/utils/app-error";
|
|
5
|
-
import { promisify } from "util";
|
|
6
|
-
import { getArkosConfig } from "../../server";
|
|
7
|
-
import deepmerge from "../../utils/helpers/deepmerge.helper";
|
|
8
|
-
import { processFile, processImage } from "./utils/helpers/file-upload.helpers";
|
|
9
|
-
import { removeBothSlashes } from "../../utils/helpers/text.helpers";
|
|
10
|
-
export class FileUploadService {
|
|
11
|
-
constructor(uploadDir, fileSizeLimit = 1024 * 1024 * 5, allowedFileTypes = /.*/, maxCount = 30) {
|
|
12
|
-
this.fileFilter = (req, file, cb) => {
|
|
13
|
-
const extName = this.allowedFileTypes.test(path.extname(file.originalname).toLowerCase());
|
|
14
|
-
const mimeType = this.allowedFileTypes.test(file.mimetype);
|
|
15
|
-
if (mimeType && extName) {
|
|
16
|
-
cb(null, true);
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
cb(new AppError("Invalid file type", 400));
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
uploadDir = uploadDir.startsWith("/") ? uploadDir.substring(1) : uploadDir;
|
|
23
|
-
uploadDir = uploadDir.endsWith("/") ? uploadDir.slice(0, -1) : uploadDir;
|
|
24
|
-
this.uploadDir = path.resolve(process.cwd(), `${uploadDir}/`);
|
|
25
|
-
this.fileSizeLimit = fileSizeLimit;
|
|
26
|
-
this.allowedFileTypes = allowedFileTypes;
|
|
27
|
-
this.maxCount = maxCount;
|
|
28
|
-
if (!fs.existsSync(this.uploadDir)) {
|
|
29
|
-
fs.mkdirSync(this.uploadDir, { recursive: true });
|
|
30
|
-
}
|
|
31
|
-
this.storage = multer.diskStorage({
|
|
32
|
-
destination: (req, file, cb) => {
|
|
33
|
-
cb(null, this.uploadDir);
|
|
34
|
-
},
|
|
35
|
-
filename: (req, file, cb) => {
|
|
36
|
-
const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
|
|
37
|
-
cb(null, `${uniqueSuffix}${path.extname(file.originalname)}`);
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
getUpload() {
|
|
42
|
-
return multer({
|
|
43
|
-
storage: this.storage,
|
|
44
|
-
fileFilter: this.fileFilter,
|
|
45
|
-
limits: { fileSize: this.fileSizeLimit },
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
handleSingleUpload(oldFilePath) {
|
|
49
|
-
return (req, res, next) => {
|
|
50
|
-
const upload = this.getUpload().single(this.getFieldName());
|
|
51
|
-
upload(req, res, async (err) => {
|
|
52
|
-
if (err instanceof multer.MulterError) {
|
|
53
|
-
return next(err);
|
|
54
|
-
}
|
|
55
|
-
else if (err) {
|
|
56
|
-
return next(err);
|
|
57
|
-
}
|
|
58
|
-
if (oldFilePath) {
|
|
59
|
-
const { fileUpload: configs } = getArkosConfig();
|
|
60
|
-
const filePath = path.resolve(process.cwd(), removeBothSlashes(configs?.baseUploadDir), removeBothSlashes(oldFilePath));
|
|
61
|
-
try {
|
|
62
|
-
const stats = await promisify(fs.stat)(filePath);
|
|
63
|
-
if (stats)
|
|
64
|
-
await promisify(fs.unlink)(filePath);
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
console.error(err);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
next();
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
handleMultipleUpload() {
|
|
75
|
-
return (req, res, next) => {
|
|
76
|
-
const upload = this.getUpload().array(this.getFieldName(), this.maxCount);
|
|
77
|
-
upload(req, res, (err) => {
|
|
78
|
-
if (err instanceof multer.MulterError)
|
|
79
|
-
return next(err);
|
|
80
|
-
else if (err)
|
|
81
|
-
return next(err);
|
|
82
|
-
next();
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
handleDeleteSingleFile(oldFilePath) {
|
|
87
|
-
return async (req, res, next) => {
|
|
88
|
-
const filePath = path.join(oldFilePath);
|
|
89
|
-
try {
|
|
90
|
-
const stats = await promisify(fs.stat)(filePath);
|
|
91
|
-
if (stats) {
|
|
92
|
-
await promisify(fs.unlink)(filePath);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
catch (err) {
|
|
96
|
-
console.error(err);
|
|
97
|
-
}
|
|
98
|
-
next();
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
async deleteFileByUrl(fileUrl) {
|
|
102
|
-
try {
|
|
103
|
-
const { fileUpload } = getArkosConfig();
|
|
104
|
-
const baseRoute = fileUpload?.baseRoute || "/api/uploads";
|
|
105
|
-
let urlPath;
|
|
106
|
-
if (fileUrl.startsWith("http")) {
|
|
107
|
-
const url = new URL(fileUrl);
|
|
108
|
-
urlPath = url.pathname;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
urlPath = fileUrl;
|
|
112
|
-
}
|
|
113
|
-
const baseRouteIndex = urlPath.indexOf(baseRoute);
|
|
114
|
-
if (baseRouteIndex === -1) {
|
|
115
|
-
throw new AppError("Invalid file URL: base route not found", 400);
|
|
116
|
-
}
|
|
117
|
-
const pathAfterBaseRoute = urlPath.substring(baseRouteIndex + baseRoute.length);
|
|
118
|
-
const cleanPath = pathAfterBaseRoute.startsWith("/")
|
|
119
|
-
? pathAfterBaseRoute.substring(1)
|
|
120
|
-
: pathAfterBaseRoute;
|
|
121
|
-
const fileTypes = ["images", "videos", "documents", "files"];
|
|
122
|
-
let fileType = null;
|
|
123
|
-
let fileName = null;
|
|
124
|
-
for (const type of fileTypes) {
|
|
125
|
-
const typeIndex = cleanPath.indexOf(type + "/");
|
|
126
|
-
if (typeIndex !== -1) {
|
|
127
|
-
fileType = type;
|
|
128
|
-
fileName = cleanPath.substring(typeIndex + type.length + 1);
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if (!fileType || !fileName) {
|
|
133
|
-
throw new AppError("Unable to determine file type or file name from URL", 400);
|
|
134
|
-
}
|
|
135
|
-
const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = getFileUploadServices();
|
|
136
|
-
let filePath;
|
|
137
|
-
switch (fileType) {
|
|
138
|
-
case "images":
|
|
139
|
-
filePath = path.join(imageUploadService.uploadDir, fileName);
|
|
140
|
-
break;
|
|
141
|
-
case "videos":
|
|
142
|
-
filePath = path.join(videoUploadService.uploadDir, fileName);
|
|
143
|
-
break;
|
|
144
|
-
case "documents":
|
|
145
|
-
filePath = path.join(documentUploadService.uploadDir, fileName);
|
|
146
|
-
break;
|
|
147
|
-
case "files":
|
|
148
|
-
filePath = path.join(fileUploadService.uploadDir, fileName);
|
|
149
|
-
break;
|
|
150
|
-
default:
|
|
151
|
-
throw new AppError(`Unsupported file type: ${fileType}`, 400);
|
|
152
|
-
}
|
|
153
|
-
await promisify(fs.stat)(filePath);
|
|
154
|
-
await promisify(fs.unlink)(filePath);
|
|
155
|
-
return true;
|
|
156
|
-
}
|
|
157
|
-
catch (error) {
|
|
158
|
-
if (error instanceof AppError) {
|
|
159
|
-
throw error;
|
|
160
|
-
}
|
|
161
|
-
if (error.code === "ENOENT") {
|
|
162
|
-
throw new AppError("File not found", 404);
|
|
163
|
-
}
|
|
164
|
-
throw new AppError(`Failed to delete file: ${error.message}`, 500);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
getFieldName() {
|
|
168
|
-
let fieldName = "files";
|
|
169
|
-
if (this.uploadDir.endsWith("images") || this.uploadDir.endsWith("images/"))
|
|
170
|
-
fieldName = "images";
|
|
171
|
-
if (this.uploadDir.endsWith("videos") || this.uploadDir.endsWith("videos/"))
|
|
172
|
-
fieldName = "videos";
|
|
173
|
-
if (this.uploadDir.endsWith("documents") ||
|
|
174
|
-
this.uploadDir.endsWith("documents/"))
|
|
175
|
-
fieldName = "documents";
|
|
176
|
-
if (this.uploadDir.endsWith("files") || this.uploadDir.endsWith("files/"))
|
|
177
|
-
fieldName = "files";
|
|
178
|
-
return fieldName;
|
|
179
|
-
}
|
|
180
|
-
async upload(req, res, options = {}) {
|
|
181
|
-
const { fileUpload } = getArkosConfig();
|
|
182
|
-
const baseRoute = fileUpload?.baseRoute || "/api/uploads";
|
|
183
|
-
return new Promise((resolve, reject) => {
|
|
184
|
-
const isMultiple = Array.isArray(req.query.multiple)
|
|
185
|
-
? req.query.multiple[0] == "true"
|
|
186
|
-
: req.query.multiple == "true";
|
|
187
|
-
const uploadHandler = isMultiple
|
|
188
|
-
? this.getUpload().array(this.getFieldName(), this.maxCount)
|
|
189
|
-
: this.getUpload().single(this.getFieldName());
|
|
190
|
-
uploadHandler(req, res, async (err) => {
|
|
191
|
-
if (err)
|
|
192
|
-
return reject(err);
|
|
193
|
-
try {
|
|
194
|
-
const protocol = req.get("host")?.includes?.("localhost")
|
|
195
|
-
? "http"
|
|
196
|
-
: "https";
|
|
197
|
-
const baseURL = `${protocol}://${req.get("host")}`;
|
|
198
|
-
const dirParts = this.uploadDir.split("/");
|
|
199
|
-
const fileType = (this.uploadDir.endsWith("/")
|
|
200
|
-
? dirParts[dirParts.length - 2]
|
|
201
|
-
: dirParts[dirParts.length - 1]) || "files";
|
|
202
|
-
let data;
|
|
203
|
-
if (req.files && Array.isArray(req.files) && req.files.length > 0) {
|
|
204
|
-
const isImageUpload = this.uploadDir?.includes?.("/images");
|
|
205
|
-
if (isImageUpload) {
|
|
206
|
-
data = await Promise.all(req.files.map((file) => processImage(req, file.path, options)));
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
data = await Promise.all(req.files.map((file) => processFile(req, file.path)));
|
|
210
|
-
}
|
|
211
|
-
data = data.filter((url) => url !== null);
|
|
212
|
-
}
|
|
213
|
-
else if (req.file) {
|
|
214
|
-
const isImageUpload = this.uploadDir?.includes?.("/images");
|
|
215
|
-
if (isImageUpload) {
|
|
216
|
-
data = await processImage(req, req.file.path, options);
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
data = await processFile(req, req.file.path);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
return reject(new AppError("No file uploaded", 400));
|
|
224
|
-
}
|
|
225
|
-
resolve(data);
|
|
226
|
-
}
|
|
227
|
-
catch (error) {
|
|
228
|
-
reject(error);
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
async deleteFileByName(fileName, fileType) {
|
|
234
|
-
try {
|
|
235
|
-
if (!fileType)
|
|
236
|
-
throw new AppError("File type parameter is required", 400);
|
|
237
|
-
const validFileTypes = ["images", "videos", "documents", "files"];
|
|
238
|
-
if (!validFileTypes.includes(fileType)) {
|
|
239
|
-
throw new AppError(`Invalid file type: ${fileType}. Must be one of: ${validFileTypes.join(", ")}`, 400);
|
|
240
|
-
}
|
|
241
|
-
const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = getFileUploadServices();
|
|
242
|
-
let targetService;
|
|
243
|
-
switch (fileType) {
|
|
244
|
-
case "images":
|
|
245
|
-
targetService = imageUploadService;
|
|
246
|
-
break;
|
|
247
|
-
case "videos":
|
|
248
|
-
targetService = videoUploadService;
|
|
249
|
-
break;
|
|
250
|
-
case "documents":
|
|
251
|
-
targetService = documentUploadService;
|
|
252
|
-
break;
|
|
253
|
-
case "files":
|
|
254
|
-
targetService = fileUploadService;
|
|
255
|
-
break;
|
|
256
|
-
default:
|
|
257
|
-
throw new AppError(`Unsupported file type: ${fileType}`, 400);
|
|
258
|
-
}
|
|
259
|
-
const filePath = path.join(targetService.uploadDir, fileName);
|
|
260
|
-
await promisify(fs.stat)(filePath);
|
|
261
|
-
await promisify(fs.unlink)(filePath);
|
|
262
|
-
return true;
|
|
263
|
-
}
|
|
264
|
-
catch (error) {
|
|
265
|
-
if (error instanceof AppError) {
|
|
266
|
-
throw error;
|
|
267
|
-
}
|
|
268
|
-
if (error.code === "ENOENT") {
|
|
269
|
-
throw new AppError("File not found", 404);
|
|
270
|
-
}
|
|
271
|
-
throw new AppError(`Failed to delete file: ${error.message}`, 500);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
export const getFileUploadServices = () => {
|
|
276
|
-
const { fileUpload } = getArkosConfig();
|
|
277
|
-
const baseUploadDir = fileUpload?.baseUploadDir || "/uploads";
|
|
278
|
-
const defaultRestrictions = {
|
|
279
|
-
images: {
|
|
280
|
-
maxCount: 30,
|
|
281
|
-
maxSize: 1024 * 1024 * 15,
|
|
282
|
-
supportedFilesRegex: /jpeg|jpg|png|gif|webp|svg|bmp|tiff|heif|heic|ico|jfif|raw|cr2|nef|orf|sr2|arw|dng|pef|raf|rw2|psd|ai|eps|xcf|jxr|wdp|hdp|jp2|j2k|jpf|jpx|jpm|mj2|avif/,
|
|
283
|
-
},
|
|
284
|
-
videos: {
|
|
285
|
-
maxCount: 10,
|
|
286
|
-
maxSize: 1024 * 1024 * 5096,
|
|
287
|
-
supportedFilesRegex: /mp4|avi|mov|mkv|flv|wmv|webm|mpg|mpeg|3gp|m4v|ts|rm|rmvb|vob|ogv|dv|qt|asf|m2ts|mts|divx|f4v|swf|mxf|roq|nsv|mvb|svi|mpe|m2v|mp2|mpv|h264|h265|hevc/,
|
|
288
|
-
},
|
|
289
|
-
documents: {
|
|
290
|
-
maxCount: 30,
|
|
291
|
-
maxSize: 1024 * 1024 * 50,
|
|
292
|
-
supportedFilesRegex: /pdf|doc|docx|xls|xlsx|ppt|pptx|odt|ods|odg|odp|txt|rtf|csv|epub|md|tex|pages|numbers|key|xml|json|yaml|yml|ini|cfg|conf|log|html|htm|xhtml|djvu|mobi|azw|azw3|fb2|lit|ps|wpd|wps|dot|dotx|xlt|xltx|pot|potx|oft|one|onetoc2|opf|oxps|hwp/,
|
|
293
|
-
},
|
|
294
|
-
files: {
|
|
295
|
-
maxCount: 10,
|
|
296
|
-
maxSize: 1024 * 1024 * 5096,
|
|
297
|
-
supportedFilesRegex: /.*/,
|
|
298
|
-
},
|
|
299
|
-
};
|
|
300
|
-
const restrictions = fileUpload?.restrictions
|
|
301
|
-
? deepmerge(defaultRestrictions, fileUpload.restrictions)
|
|
302
|
-
: defaultRestrictions;
|
|
303
|
-
const imageUploadService = new FileUploadService(`${baseUploadDir}/images`, restrictions.images.maxSize, restrictions.images.supportedFilesRegex, restrictions.images.maxCount);
|
|
304
|
-
const videoUploadService = new FileUploadService(`${baseUploadDir}/videos`, restrictions.videos.maxSize, restrictions.videos.supportedFilesRegex, restrictions.videos.maxCount);
|
|
305
|
-
const documentUploadService = new FileUploadService(`${baseUploadDir}/documents`, restrictions.documents.maxSize, restrictions.documents.supportedFilesRegex, restrictions.documents.maxCount);
|
|
306
|
-
const fileUploadService = new FileUploadService(`${baseUploadDir}/files`, restrictions.files.maxSize, restrictions.files.supportedFilesRegex, restrictions.files.maxCount);
|
|
307
|
-
return {
|
|
308
|
-
imageUploadService,
|
|
309
|
-
videoUploadService,
|
|
310
|
-
documentUploadService,
|
|
311
|
-
fileUploadService,
|
|
312
|
-
};
|
|
313
|
-
};
|
|
314
|
-
//# sourceMappingURL=file-upload.service.js.map
|