arkos 1.3.1-beta → 1.3.2-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/dist/cjs/app.js +139 -1
- package/dist/cjs/exports/auth/index.js +6 -1
- package/dist/cjs/exports/controllers/index.js +11 -1
- package/dist/cjs/exports/error-handler/index.js +11 -1
- package/dist/cjs/exports/index.js +12 -1
- package/dist/cjs/exports/middlewares/index.js +7 -1
- package/dist/cjs/exports/prisma/index.js +13 -1
- package/dist/cjs/exports/services/index.js +48 -1
- package/dist/cjs/exports/utils/index.js +44 -1
- package/dist/cjs/exports/validation/index.js +11 -1
- package/dist/cjs/modules/auth/auth.controller.js +229 -1
- package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
- package/dist/cjs/modules/auth/auth.router.js +82 -1
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +226 -1
- package/dist/cjs/modules/auth/utils/auth-error-objects.js +10 -1
- package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +83 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js +92 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/cjs/modules/base/base.controller.js +172 -1
- package/dist/cjs/modules/base/base.middlewares.js +92 -1
- package/dist/cjs/modules/base/base.router.js +22 -1
- package/dist/cjs/modules/base/base.service.js +507 -1
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/modules/base/types/base.service.types.js +3 -1
- package/dist/cjs/modules/base/types/base.service.types.js.map +1 -1
- package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js +80 -1
- package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +50 -1
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +104 -1
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +208 -1
- package/dist/cjs/modules/base/utils/router-validator.js +16 -1
- package/dist/cjs/modules/base/utils/service-hooks-manager.js +19 -1
- package/dist/cjs/modules/email/email.service.js +104 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +146 -4
- package/dist/cjs/modules/error-handler/utils/app-error.js +17 -1
- package/dist/cjs/modules/error-handler/utils/catch-async.js +21 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +205 -3
- package/dist/cjs/modules/file-upload/file-upload.controller.js +233 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +60 -1
- package/dist/cjs/modules/file-upload/file-upload.service.js +322 -1
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +97 -1
- package/dist/cjs/modules/swagger/swagger.router.js +38 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +338 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +64 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +37 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +48 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +32 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js +49 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +34 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +471 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +572 -1
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +260 -1
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +112 -1
- package/dist/cjs/paths.js +9 -1
- package/dist/cjs/server.js +94 -5
- package/dist/cjs/types/arkos-config.js +3 -1
- package/dist/cjs/types/arkos-config.js.map +1 -1
- package/dist/cjs/types/auth.js +3 -1
- package/dist/cjs/types/index.js +11 -1
- package/dist/cjs/types/router-config.js +3 -1
- package/dist/cjs/utils/arkos-env.js +9 -1
- package/dist/cjs/utils/cli/build.js +214 -5
- package/dist/cjs/utils/cli/dev.js +154 -3
- package/dist/cjs/utils/cli/generate.js +109 -1
- package/dist/cjs/utils/cli/index.js +104 -1
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/prisma-generate.js +120 -0
- package/dist/cjs/utils/cli/prisma-generate.js.map +1 -0
- package/dist/cjs/utils/cli/start.js +103 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +24 -1
- package/dist/cjs/utils/cli/utils/smart-fs-watcher.js +73 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js +36 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js +21 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js +201 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js +288 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/{generate-middlewares.js.map → middlewares-template.js.map} +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js +64 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +45 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +29 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generators.js +34 -2
- package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/cjs/utils/cli/utils/watermark-stamper.js +17 -3
- package/dist/cjs/utils/dotenv.helpers.js +43 -1
- package/dist/cjs/utils/dynamic-loader.js +270 -9
- package/dist/cjs/utils/features/api.features.js +169 -1
- package/dist/cjs/utils/features/change-case.features.js +67 -1
- package/dist/cjs/utils/features/port-and-host-allocator.js +105 -1
- package/dist/cjs/utils/helpers/api.features.helpers.js +112 -1
- package/dist/cjs/utils/helpers/change-case.helpers.js +177 -1
- package/dist/cjs/utils/helpers/deepmerge.helper.js +115 -1
- package/dist/cjs/utils/helpers/dynamic-loader.helpers.js +76 -1
- package/dist/cjs/utils/helpers/fs.helpers.js +57 -1
- package/dist/cjs/utils/helpers/global.helpers.js +94 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +40 -1
- package/dist/cjs/utils/helpers/query-parser.helpers.js +45 -1
- package/dist/cjs/utils/helpers/routers.helpers.js +37 -1
- package/dist/cjs/utils/helpers/text.helpers.js +28 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +455 -1
- package/dist/cjs/utils/prisma/prisma-schema-parser.js +216 -4
- package/dist/cjs/utils/prisma/types.js +3 -1
- package/dist/cjs/utils/sheu.js +120 -1
- package/dist/cjs/utils/validate-dto.js +17 -1
- package/dist/cjs/utils/validate-schema.js +15 -1
- package/dist/esm/app.js +132 -1
- package/dist/esm/exports/auth/index.js +2 -1
- package/dist/esm/exports/controllers/index.js +4 -1
- package/dist/esm/exports/error-handler/index.js +4 -1
- package/dist/esm/exports/index.js +8 -1
- package/dist/esm/exports/middlewares/index.js +2 -1
- package/dist/esm/exports/prisma/index.js +6 -1
- package/dist/esm/exports/services/index.js +9 -1
- package/dist/esm/exports/utils/index.js +4 -1
- package/dist/esm/exports/validation/index.js +4 -1
- package/dist/esm/modules/auth/auth.controller.js +222 -1
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +76 -1
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +219 -1
- package/dist/esm/modules/auth/utils/auth-error-objects.js +4 -1
- package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +73 -1
- package/dist/esm/modules/auth/utils/services/auth-action.service.js +90 -1
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +165 -1
- package/dist/esm/modules/base/base.middlewares.js +81 -1
- package/dist/esm/modules/base/base.router.js +15 -1
- package/dist/esm/modules/base/base.service.js +500 -1
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/types/base.service.types.js +2 -1
- package/dist/esm/modules/base/types/base.service.types.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.controller.helpers.js +76 -1
- package/dist/esm/modules/base/utils/helpers/base.middlewares.helpers.js +44 -1
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +96 -1
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +198 -1
- package/dist/esm/modules/base/utils/router-validator.js +14 -1
- package/dist/esm/modules/base/utils/service-hooks-manager.js +17 -1
- package/dist/esm/modules/email/email.service.js +97 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +107 -4
- package/dist/esm/modules/error-handler/utils/app-error.js +15 -1
- package/dist/esm/modules/error-handler/utils/catch-async.js +19 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +163 -3
- package/dist/esm/modules/file-upload/file-upload.controller.js +228 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +54 -1
- package/dist/esm/modules/file-upload/file-upload.service.js +314 -1
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +87 -1
- package/dist/esm/modules/swagger/swagger.router.js +32 -1
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +333 -1
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +58 -1
- package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js +34 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +42 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +26 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js +46 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +28 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +465 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +566 -1
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +255 -1
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +101 -1
- package/dist/esm/paths.js +3 -1
- package/dist/esm/server.js +85 -5
- package/dist/esm/types/arkos-config.js +2 -1
- package/dist/esm/types/arkos-config.js.map +1 -1
- package/dist/esm/types/auth.js +2 -1
- package/dist/esm/types/index.js +8 -1
- package/dist/esm/types/router-config.js +2 -1
- package/dist/esm/utils/arkos-env.js +7 -1
- package/dist/esm/utils/cli/build.js +208 -5
- package/dist/esm/utils/cli/dev.js +147 -3
- package/dist/esm/utils/cli/generate.js +103 -1
- package/dist/esm/utils/cli/index.js +94 -1
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/prisma-generate.js +114 -0
- package/dist/esm/utils/cli/prisma-generate.js.map +1 -0
- package/dist/esm/utils/cli/start.js +96 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +16 -1
- package/dist/esm/utils/cli/utils/smart-fs-watcher.js +68 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js +33 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js +18 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js +198 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js +285 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/{generate-middlewares.js.map → middlewares-template.js.map} +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js +61 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +39 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +26 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generators.js +28 -2
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/cli/utils/watermark-stamper.js +15 -3
- package/dist/esm/utils/dotenv.helpers.js +37 -1
- package/dist/esm/utils/dynamic-loader.js +254 -9
- package/dist/esm/utils/features/api.features.js +162 -1
- package/dist/esm/utils/features/change-case.features.js +31 -1
- package/dist/esm/utils/features/port-and-host-allocator.js +67 -1
- package/dist/esm/utils/helpers/api.features.helpers.js +106 -1
- package/dist/esm/utils/helpers/change-case.helpers.js +161 -1
- package/dist/esm/utils/helpers/deepmerge.helper.js +113 -1
- package/dist/esm/utils/helpers/dynamic-loader.helpers.js +69 -1
- package/dist/esm/utils/helpers/fs.helpers.js +48 -1
- package/dist/esm/utils/helpers/global.helpers.js +51 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +32 -1
- package/dist/esm/utils/helpers/query-parser.helpers.js +40 -1
- package/dist/esm/utils/helpers/routers.helpers.js +29 -1
- package/dist/esm/utils/helpers/text.helpers.js +22 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +448 -1
- package/dist/esm/utils/prisma/prisma-schema-parser.js +209 -4
- package/dist/esm/utils/prisma/types.js +2 -1
- package/dist/esm/utils/sheu.js +118 -1
- package/dist/esm/utils/validate-dto.js +11 -1
- package/dist/esm/utils/validate-schema.js +9 -1
- package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +1 -1
- package/dist/types/modules/base/types/base.service.types.d.ts +12 -9
- package/dist/types/types/arkos-config.d.ts +3 -2
- package/dist/types/utils/cli/prisma-generate.d.ts +1 -0
- package/package.json +2 -2
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +0 -21
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -12
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-hooks-template.js +0 -144
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-hooks-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +0 -256
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +0 -36
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js +0 -18
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js +0 -9
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +0 -21
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -12
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-hooks-template.js +0 -144
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-hooks-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js +0 -256
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +0 -36
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js +0 -18
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js +0 -9
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js.map +0 -1
- /package/dist/types/utils/cli/utils/template-generator/templates/{generate-auth-configs-template.d.ts → auth-configs-template.d.ts} +0 -0
- /package/dist/types/utils/cli/utils/template-generator/templates/{generate-controller-template.d.ts → controller-template.d.ts} +0 -0
- /package/dist/types/utils/cli/utils/template-generator/templates/{generate-hooks-template.d.ts → hooks-template.d.ts} +0 -0
- /package/dist/types/utils/cli/utils/template-generator/templates/{generate-middlewares.d.ts → middlewares-template.d.ts} +0 -0
- /package/dist/types/utils/cli/utils/template-generator/templates/{generate-prisma-query-options.d.ts → query-options-template.d.ts} +0 -0
- /package/dist/types/utils/cli/utils/template-generator/templates/{generate-router-template.d.ts → router-template.d.ts} +0 -0
- /package/dist/types/utils/cli/utils/template-generator/templates/{generate-service-template.d.ts → service-template.d.ts} +0 -0
|
@@ -1 +1,314 @@
|
|
|
1
|
-
|
|
1
|
+
import multer from "multer";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import AppError from "../error-handler/utils/app-error.js";
|
|
5
|
+
import { promisify } from "util";
|
|
6
|
+
import { getArkosConfig } from "../../server.js";
|
|
7
|
+
import deepmerge from "../../utils/helpers/deepmerge.helper.js";
|
|
8
|
+
import { processFile, processImage } from "./utils/helpers/file-upload.helpers.js";
|
|
9
|
+
import { removeBothSlashes } from "../../utils/helpers/text.helpers.js";
|
|
10
|
+
export class FileUploadService {
|
|
11
|
+
constructor(uploadDir, fileSizeLimit = 1024 * 1024 * 5, allowedFileTypes = /.*/, maxCount = 30) {
|
|
12
|
+
this.fileFilter = (_, 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: (_, _1, cb) => {
|
|
33
|
+
cb(null, this.uploadDir);
|
|
34
|
+
},
|
|
35
|
+
filename: (_, 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 (_, _1, 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
|
+
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
|
+
`${protocol}://${req.get("host")}`;
|
|
198
|
+
const dirParts = this.uploadDir.split("/");
|
|
199
|
+
(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
|
|
@@ -1 +1,87 @@
|
|
|
1
|
-
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import sharp from "sharp";
|
|
4
|
+
import { promisify } from "util";
|
|
5
|
+
import { getArkosConfig } from "../../../../server.js";
|
|
6
|
+
import mimetype from "mimetype";
|
|
7
|
+
import { fullCleanCwd } from "../../../../utils/helpers/fs.helpers.js";
|
|
8
|
+
export function adjustRequestUrl(req, _, next) {
|
|
9
|
+
const { fileUpload } = getArkosConfig();
|
|
10
|
+
req.url = req.url.replace(fileUpload?.baseRoute + "/" || "/api/uploads/", "/");
|
|
11
|
+
req.url = req.url.replace(fileUpload?.baseRoute || "/api/uploads/", "/");
|
|
12
|
+
next();
|
|
13
|
+
}
|
|
14
|
+
export function extractRequestInfo(req) {
|
|
15
|
+
const { fileUpload } = getArkosConfig();
|
|
16
|
+
const protocol = req.headers["x-forwarded-proto"] === "https" ? "https" : "http";
|
|
17
|
+
const baseURL = `${protocol}://${req.get?.("host")}`;
|
|
18
|
+
const baseRoute = fileUpload?.baseRoute || "/api/uploads";
|
|
19
|
+
return { baseURL, baseRoute };
|
|
20
|
+
}
|
|
21
|
+
const generateRelativePath = (filePath, fileType) => {
|
|
22
|
+
const { fileUpload } = getArkosConfig();
|
|
23
|
+
const baseUploadDir = fileUpload?.baseUploadDir || "/uploads";
|
|
24
|
+
if (baseUploadDir.startsWith("..")) {
|
|
25
|
+
return path.join(fileType, path.basename(filePath));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return fullCleanCwd(filePath
|
|
29
|
+
.replace(`${baseUploadDir}/`, "")
|
|
30
|
+
.replace(`/${baseUploadDir}/`, "")
|
|
31
|
+
.replace(`/${baseUploadDir}`, "")
|
|
32
|
+
.replace(`${baseUploadDir}`, ""));
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
export const processFile = async (req, filePath) => {
|
|
36
|
+
const { baseURL, baseRoute } = extractRequestInfo(req);
|
|
37
|
+
const relativePath = generateRelativePath(filePath, req.params.fileType);
|
|
38
|
+
return `${baseURL}${baseRoute === "/" ? "" : baseRoute}/${relativePath}`;
|
|
39
|
+
};
|
|
40
|
+
export const processImage = async (req, filePath, options) => {
|
|
41
|
+
const { baseURL, baseRoute } = extractRequestInfo(req);
|
|
42
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
43
|
+
const originalFormat = ext.replace(".", "");
|
|
44
|
+
const outputFormat = options.format || originalFormat;
|
|
45
|
+
if (!mimetype.lookup(ext)?.includes?.("image")) {
|
|
46
|
+
const relativePath = generateRelativePath(filePath, req.params.fileType);
|
|
47
|
+
return `${baseURL}${baseRoute}/${relativePath}`;
|
|
48
|
+
}
|
|
49
|
+
const tempName = `${path.basename(filePath, ext)}_${Date.now()}${ext}`;
|
|
50
|
+
const tempPath = path.join(path.dirname(filePath), tempName);
|
|
51
|
+
try {
|
|
52
|
+
let transformer = sharp(filePath);
|
|
53
|
+
const metadata = await transformer.metadata();
|
|
54
|
+
if (options.resizeTo && metadata.width && metadata.height) {
|
|
55
|
+
const targetSize = options.resizeTo;
|
|
56
|
+
const scaleFactor = targetSize / Math.min(metadata.width, metadata.height);
|
|
57
|
+
const newWidth = Math.round(metadata.width * scaleFactor);
|
|
58
|
+
const newHeight = Math.round(metadata.height * scaleFactor);
|
|
59
|
+
transformer = transformer.resize(newWidth, newHeight);
|
|
60
|
+
}
|
|
61
|
+
else if (options.width || options.height) {
|
|
62
|
+
transformer = transformer.resize(options.width || null, options.height || null, {
|
|
63
|
+
fit: "inside",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (outputFormat === "webp") {
|
|
67
|
+
transformer = transformer.toFormat("webp");
|
|
68
|
+
}
|
|
69
|
+
else if (outputFormat === "jpeg" || outputFormat === "jpg") {
|
|
70
|
+
transformer = transformer.toFormat("jpeg");
|
|
71
|
+
}
|
|
72
|
+
await transformer.toFile(tempPath);
|
|
73
|
+
await promisify(fs.rename)(tempPath, filePath);
|
|
74
|
+
const relativePath = generateRelativePath(filePath, req?.params.fileType);
|
|
75
|
+
return `${baseURL}${baseRoute}/${relativePath}`;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
try {
|
|
79
|
+
await promisify(fs.stat)(tempPath);
|
|
80
|
+
await promisify(fs.unlink)(tempPath);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
}
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=file-upload.helpers.js.map
|
|
@@ -1 +1,32 @@
|
|
|
1
|
-
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
import swaggerJsdoc from "swagger-jsdoc";
|
|
3
|
+
import deepmerge from "../../utils/helpers/deepmerge.helper.js";
|
|
4
|
+
import { generatePathsForModels, getOpenAPIJsonSchemasByConfigMode, } from "./utils/helpers/swagger.router.helpers.js";
|
|
5
|
+
import missingJsonSchemaGenerator from "./utils/helpers/missing-json-schemas-generator.js";
|
|
6
|
+
import getSwaggerDefaultConfig from "./utils/helpers/get-swagger-default-configs.js";
|
|
7
|
+
import { importEsmPreventingTsTransformation } from "../../utils/helpers/global.helpers.js";
|
|
8
|
+
import generateSystemJsonSchemas from "./utils/helpers/json-schema-generators/generate-system-json-schemas.js";
|
|
9
|
+
const swaggerRouter = Router();
|
|
10
|
+
export async function getSwaggerRouter(arkosConfig) {
|
|
11
|
+
let defaultJsonSchemas = await getOpenAPIJsonSchemasByConfigMode(arkosConfig);
|
|
12
|
+
const defaultModelsPaths = await generatePathsForModels(arkosConfig);
|
|
13
|
+
defaultJsonSchemas = {
|
|
14
|
+
...defaultJsonSchemas,
|
|
15
|
+
...(await missingJsonSchemaGenerator.generateMissingJsonSchemas(defaultModelsPaths, defaultJsonSchemas, arkosConfig)),
|
|
16
|
+
...generateSystemJsonSchemas(arkosConfig),
|
|
17
|
+
};
|
|
18
|
+
const swaggerConfigs = deepmerge((await getSwaggerDefaultConfig(defaultModelsPaths, defaultJsonSchemas)) ||
|
|
19
|
+
{}, arkosConfig.swagger || {});
|
|
20
|
+
const { definition, ...options } = swaggerConfigs?.options;
|
|
21
|
+
const swaggerSpecification = swaggerJsdoc({
|
|
22
|
+
definition: definition,
|
|
23
|
+
...options,
|
|
24
|
+
});
|
|
25
|
+
const scalar = await importEsmPreventingTsTransformation("@scalar/express-api-reference");
|
|
26
|
+
swaggerRouter.use(swaggerConfigs.endpoint, scalar.apiReference({
|
|
27
|
+
content: swaggerSpecification,
|
|
28
|
+
...swaggerConfigs?.scalarApiReferenceConfiguration,
|
|
29
|
+
}));
|
|
30
|
+
return swaggerRouter;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=swagger.router.js.map
|