arkos 2.0.0-next.13 → 2.0.0-next.16
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 +144 -145
- package/cli.js +1 -0
- package/dist/cjs/app.js +7 -0
- package/dist/cjs/app.js.map +1 -1
- package/dist/cjs/exports/error-handler/index.js +15 -0
- package/dist/cjs/exports/error-handler/index.js.map +1 -1
- package/dist/cjs/modules/auth/auth.router.js +3 -0
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +2 -0
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/base/base.controller.js +15 -3
- package/dist/cjs/modules/base/base.controller.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +19 -12
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/base/base.service.js +5 -1
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +9 -0
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +25 -42
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js +0 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +8 -9
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/errors.js +158 -0
- package/dist/cjs/modules/error-handler/utils/errors.js.map +1 -0
- package/dist/cjs/modules/error-handler/utils/multer-error-handler.js +39 -0
- package/dist/cjs/modules/error-handler/utils/multer-error-handler.js.map +1 -0
- package/dist/cjs/modules/file-upload/file-upload.controller.js +10 -14
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +2 -0
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/cjs/modules/swagger/swagger.router.js +8 -2
- package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js +18 -0
- package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +5 -5
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/cjs/types/arkos-prisma-input.js.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/new-arkos-config.js.map +1 -1
- package/dist/cjs/types/router-config.js.map +1 -1
- package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js +86 -28
- package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +11 -7
- package/dist/cjs/utils/arkos-router/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/types/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/types/upload-config.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +34 -28
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js +9 -6
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +334 -77
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/cjs/utils/bundler.js.map +1 -1
- package/dist/cjs/utils/cli/build.js +2 -3
- package/dist/cjs/utils/cli/build.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +11 -6
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/export-auth-action.js +5 -4
- package/dist/cjs/utils/cli/export-auth-action.js.map +1 -1
- package/dist/cjs/utils/cli/generate.js +6 -8
- package/dist/cjs/utils/cli/generate.js.map +1 -1
- package/dist/cjs/utils/cli/index.js +22 -19
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/start.js +4 -2
- package/dist/cjs/utils/cli/start.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +19 -7
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +7 -6
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +4 -4
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generators.js +0 -6
- package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/cjs/utils/define-config.js +5 -0
- package/dist/cjs/utils/define-config.js.map +1 -1
- package/dist/cjs/utils/dotenv.helpers.js +0 -6
- package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
- package/dist/cjs/utils/features/api.features.js +23 -5
- package/dist/cjs/utils/features/api.features.js.map +1 -1
- package/dist/cjs/utils/helpers/arkos-config.helpers.js +22 -2
- package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/exit-error.js +1 -0
- package/dist/cjs/utils/helpers/exit-error.js.map +1 -1
- package/dist/cjs/utils/helpers/fs.helpers.js +25 -24
- package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/global.helpers.js +3 -2
- package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +4 -5
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/url-helpers.js +14 -0
- package/dist/cjs/utils/helpers/url-helpers.js.map +1 -0
- package/dist/cjs/utils/initialize-app.js +35 -6
- package/dist/cjs/utils/initialize-app.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +12 -6
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-schema-parser.js +10 -3
- package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/cjs/utils/setup-app.js +58 -41
- package/dist/cjs/utils/setup-app.js.map +1 -1
- package/dist/esm/app.js +6 -0
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/exports/error-handler/index.js +1 -0
- package/dist/esm/exports/error-handler/index.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +3 -0
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +2 -0
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +15 -3
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +19 -12
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +5 -1
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +9 -0
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +22 -42
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/app-error.js +0 -1
- package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +8 -9
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/errors.js +127 -0
- package/dist/esm/modules/error-handler/utils/errors.js.map +1 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js +34 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js.map +1 -0
- package/dist/esm/modules/file-upload/file-upload.controller.js +10 -14
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +2 -0
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/swagger/swagger.router.js +8 -2
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +18 -0
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +5 -5
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/esm/types/arkos-prisma-input.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/new-arkos-config.js.map +1 -1
- package/dist/esm/types/router-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js +86 -28
- package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +11 -7
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +34 -28
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +9 -6
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +334 -77
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/esm/utils/bundler.js.map +1 -1
- package/dist/esm/utils/cli/build.js +3 -4
- package/dist/esm/utils/cli/build.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +12 -7
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/export-auth-action.js +5 -4
- package/dist/esm/utils/cli/export-auth-action.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +6 -8
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +22 -19
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/start.js +4 -2
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +16 -7
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +7 -6
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js +4 -4
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js +0 -6
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/define-config.js +5 -0
- package/dist/esm/utils/define-config.js.map +1 -1
- package/dist/esm/utils/dotenv.helpers.js +0 -6
- package/dist/esm/utils/dotenv.helpers.js.map +1 -1
- package/dist/esm/utils/features/api.features.js +23 -5
- package/dist/esm/utils/features/api.features.js.map +1 -1
- package/dist/esm/utils/helpers/arkos-config.helpers.js +20 -2
- package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/exit-error.js +1 -0
- package/dist/esm/utils/helpers/exit-error.js.map +1 -1
- package/dist/esm/utils/helpers/fs.helpers.js +25 -24
- package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/global.helpers.js +1 -1
- package/dist/esm/utils/helpers/global.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +4 -5
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/url-helpers.js +11 -0
- package/dist/esm/utils/helpers/url-helpers.js.map +1 -0
- package/dist/esm/utils/initialize-app.js +35 -6
- package/dist/esm/utils/initialize-app.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +12 -6
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-schema-parser.js +10 -3
- package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/esm/utils/setup-app.js +59 -42
- package/dist/esm/utils/setup-app.js.map +1 -1
- package/dist/types/app.d.ts +5 -6
- package/dist/types/exports/error-handler/index.d.ts +1 -0
- package/dist/types/modules/auth/auth.service.d.ts +2 -6
- package/dist/types/modules/base/base.service.d.ts +2 -1
- package/dist/types/modules/error-handler/utils/app-error.d.ts +0 -2
- package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +1 -1
- package/dist/types/modules/error-handler/utils/errors.d.ts +176 -0
- package/dist/types/modules/error-handler/utils/multer-error-handler.d.ts +7 -0
- package/dist/types/modules/file-upload/file-upload.controller.d.ts +0 -1
- package/dist/types/modules/swagger/utils/helpers/get-swagger-default-configs.d.ts +48 -2
- package/dist/types/types/arkos-prisma-input.d.ts +3 -2
- package/dist/types/types/index.d.ts +0 -21
- package/dist/types/types/new-arkos-config.d.ts +183 -14
- package/dist/types/types/router-config.d.ts +1 -1
- package/dist/types/utils/arkos-router/arkos-router-openapi-manager.d.ts +14 -1
- package/dist/types/utils/arkos-router/index.d.ts +76 -8
- package/dist/types/utils/arkos-router/types/index.d.ts +19 -6
- package/dist/types/utils/arkos-router/types/upload-config.d.ts +63 -7
- package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +1 -1
- package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +2 -0
- package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +0 -36
- package/dist/types/utils/bundler.d.ts +1 -1
- package/dist/types/utils/cli/generate.d.ts +0 -1
- package/dist/types/utils/cli/start.d.ts +1 -1
- package/dist/types/utils/helpers/arkos-config.helpers.d.ts +2 -0
- package/dist/types/utils/helpers/fs.helpers.d.ts +1 -1
- package/dist/types/utils/helpers/global.helpers.d.ts +1 -0
- package/dist/types/utils/helpers/url-helpers.d.ts +1 -0
- package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
- package/package.json +15 -15
- package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -39
- package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -32
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -36
- package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -29
- package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
- package/dist/types/utils/cli/utils/template-generator/templates/route-hook.template.d.ts +0 -2
- package/dist/types/utils/cli/utils/template-generator/templates/service-hook.template.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.service.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../utils/prisma/prisma-schema-parser\";\nimport { PrismaField } from \"../../../../utils/prisma/types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nexport function removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nconst prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n];\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => obj?.[op]);\n}\n\nexport function throwErrorIfApiActionIsInvalid(apiAction: string) {\n if (apiAction && !prismaOperations.includes(apiAction))\n throw new AppError(\n `Unknown value \"${apiAction}\" for apiAction field, available values are ${prismaOperations.join(\", \")}.`,\n 400,\n \"InvalidApiAction\"\n );\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {ModelGroupRelationFields} relationFields - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: ModelGroupRelationFields,\n ignoreActions: string[] = [],\n isRelation: boolean = false,\n parentOperation: \"create\" | \"update\" | null = null\n): Record<string, any> {\n body = JSON.parse(JSON.stringify(body));\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body?.[field.name]) return;\n\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\n\n if (isPrismaRelationFormat(body[field.name])) return;\n\n if (!Array.isArray(body[field.name])) return;\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions?.includes?.(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n throwErrorIfApiActionIsInvalid(apiAction);\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (\n bodyField?.apiAction !== \"update\" &&\n canBeUsedToConnect(field.type, bodyField)\n ) {\n const { apiAction, ...cleanedData } = bodyField;\n throwErrorIfApiActionIsInvalid(apiAction);\n connectData.push(cleanedData);\n } else if (bodyField?.apiAction !== \"update\" && !bodyField?.id) {\n let nestedRelations = getGroupedModelReations(field.type);\n let dataToPush = { ...bodyField };\n\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions,\n true,\n \"create\"\n );\n }\n\n if (dataToPush?.apiAction) {\n const { apiAction, ...rest } = dataToPush;\n throwErrorIfApiActionIsInvalid(apiAction);\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n if (parentOperation === \"create\") {\n const { apiAction, ...cleanedData } = bodyField;\n throwErrorIfApiActionIsInvalid(apiAction);\n connectData.push(cleanedData);\n return;\n }\n\n const { apiAction, ...data } = bodyField;\n let foreignKeyFieldName = bodyField?.id ? \"id\" : \"\";\n let foreignKeyFieldValue = bodyField?.id ? bodyField.id : \"\";\n\n if (!foreignKeyFieldName) {\n for (const [key, value] of Object.entries(data)) {\n if (canBeUsedToConnect(field.type, { [key]: value })) {\n foreignKeyFieldName = key;\n break;\n }\n }\n\n if (!foreignKeyFieldName)\n throw new AppError(\n \"No unique fields to be used in the prisma where clause\",\n 400,\n \"NoFieldToIsInPrismaWhereClause\",\n { data: body }\n );\n }\n\n foreignKeyFieldValue = data[foreignKeyFieldName];\n delete data[foreignKeyFieldName];\n\n throwErrorIfApiActionIsInvalid(apiAction);\n let nestedRelations = getGroupedModelReations(field.type);\n\n let dataToPush = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions,\n true,\n \"update\"\n );\n }\n\n updateData.push({\n where: { [foreignKeyFieldName]: foreignKeyFieldValue },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body?.[field.name]) return;\n\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\n\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getGroupedModelReations(field.type);\n\n if (relationData?.apiAction === \"delete\") {\n mutableBody[field.name] = { delete: true };\n } else if (relationData?.apiAction === \"disconnect\") {\n mutableBody[field.name] = { disconnect: true };\n } else if (\n relationData?.apiAction !== \"update\" &&\n canBeUsedToConnect(field.type, relationData)\n ) {\n const { apiAction, ...cleanedData } = relationData;\n throwErrorIfApiActionIsInvalid(apiAction);\n mutableBody[field.name] = { connect: cleanedData };\n } else if (relationData?.apiAction !== \"update\" && !relationData?.id) {\n let dataToCreate = { ...relationData };\n\n if (dataToCreate?.apiAction) {\n const { apiAction, ...rest } = dataToCreate;\n throwErrorIfApiActionIsInvalid(apiAction);\n dataToCreate = rest;\n }\n\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions,\n true,\n \"create\"\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n if (parentOperation === \"create\") {\n const { apiAction, ...cleanedData } = relationData;\n throwErrorIfApiActionIsInvalid(apiAction);\n mutableBody[field.name] = { connect: cleanedData };\n return;\n }\n\n const { id, apiAction, ...data } = relationData;\n throwErrorIfApiActionIsInvalid(apiAction);\n\n let dataToUpdate = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions,\n true,\n \"update\"\n );\n }\n\n mutableBody[field.name] = {\n update: {\n where: { id },\n data: dataToUpdate,\n },\n };\n }\n });\n\n if (mutableBody?.apiAction && !isRelation) {\n throw new AppError(\n \"Invalid usage of apiAction field, it must only be used on relation fields whether single or multiple.\",\n 400,\n {\n data: {\n ...body,\n },\n }\n );\n }\n\n return removeApiAction(mutableBody);\n}\n\nexport type ModelGroupRelationFields = ReturnType<\n typeof getGroupedModelReations\n>;\n\nfunction getGroupedModelReations(modelName: string) {\n const relationsFields = prismaSchemaParser.getModelRelations(modelName);\n\n return {\n singular: relationsFields?.filter(\n (field) => field.isRelation && !field.isArray\n ),\n list: relationsFields?.filter((field) => field.isRelation && field.isArray),\n };\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n if (!bodyField) return false;\n\n if (bodyField.apiAction && ![\"connect\"]?.includes?.(bodyField.apiAction))\n return false;\n\n if (bodyField.apiAction === \"connect\") return true;\n\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) return true;\n\n const uniqueFields = prismaSchemaParser.getModelUniqueFields(modelName) || [];\n\n if (Object.keys(bodyField).length === 1 && uniqueFields?.length > 0) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field: PrismaField) => field.name === fieldName);\n }\n\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.service.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.service.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../utils/prisma/prisma-schema-parser\";\nimport { PrismaField } from \"../../../../utils/prisma/types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nexport function removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nconst prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n];\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => obj?.[op]);\n}\n\nexport function throwErrorIfApiActionIsInvalid(apiAction: string) {\n if (apiAction && !prismaOperations.includes(apiAction))\n throw new AppError(\n `Unknown value \"${apiAction}\" for apiAction field, available values are ${prismaOperations.join(\", \")}.`,\n 400,\n \"InvalidApiAction\"\n );\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {ModelGroupRelationFields} relationFields - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: ModelGroupRelationFields,\n ignoreActions: string[] = [],\n isRelation: boolean = false,\n parentOperation: \"create\" | \"update\" | null = null\n): Record<string, any> {\n body = JSON.parse(JSON.stringify(body));\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body?.[field.name]) return;\n\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\n\n if (isPrismaRelationFormat(body[field.name])) return;\n\n if (!Array.isArray(body[field.name])) return;\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions?.includes?.(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n throwErrorIfApiActionIsInvalid(apiAction);\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (\n bodyField?.apiAction !== \"update\" &&\n canBeUsedToConnect(field.type, bodyField)\n ) {\n const { apiAction, ...cleanedData } = bodyField;\n throwErrorIfApiActionIsInvalid(apiAction);\n connectData.push(cleanedData);\n } else if (bodyField?.apiAction !== \"update\" && !bodyField?.id) {\n let nestedRelations = getGroupedModelReations(field.type);\n let dataToPush = { ...bodyField };\n\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions,\n true,\n \"create\"\n );\n }\n\n if (dataToPush?.apiAction) {\n const { apiAction, ...rest } = dataToPush;\n throwErrorIfApiActionIsInvalid(apiAction);\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n if (parentOperation === \"create\") {\n const { apiAction, ...cleanedData } = bodyField;\n throwErrorIfApiActionIsInvalid(apiAction);\n connectData.push(cleanedData);\n return;\n }\n\n const { apiAction, ...data } = bodyField;\n let foreignKeyFieldName = bodyField?.id ? \"id\" : \"\";\n let foreignKeyFieldValue = bodyField?.id ? bodyField.id : \"\";\n\n if (!foreignKeyFieldName) {\n for (const [key, value] of Object.entries(data)) {\n if (canBeUsedToConnect(field.type, { [key]: value })) {\n foreignKeyFieldName = key;\n break;\n }\n }\n\n if (!foreignKeyFieldName)\n throw new AppError(\n \"No unique fields to be used in the prisma where clause\",\n 400,\n \"NoFieldToIsInPrismaWhereClause\",\n { data: body }\n );\n }\n\n foreignKeyFieldValue = data[foreignKeyFieldName];\n delete data[foreignKeyFieldName];\n\n throwErrorIfApiActionIsInvalid(apiAction);\n let nestedRelations = getGroupedModelReations(field.type);\n\n let dataToPush = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions,\n true,\n \"update\"\n );\n }\n\n updateData.push({\n where: { [foreignKeyFieldName]: foreignKeyFieldValue },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body?.[field.name]) return;\n\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) {\n delete mutableBody[field.name];\n return;\n }\n\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getGroupedModelReations(field.type);\n\n if (relationData?.apiAction === \"delete\") {\n mutableBody[field.name] = { delete: true };\n } else if (relationData?.apiAction === \"create\") {\n const { apiAction, ...cleanedData } = relationData;\n throwErrorIfApiActionIsInvalid(apiAction);\n\n let dataToCreate = cleanedData;\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions,\n true,\n \"create\"\n );\n }\n mutableBody[field.name] = { create: dataToCreate };\n } else if (relationData?.apiAction === \"disconnect\") {\n mutableBody[field.name] = { disconnect: true };\n } else if (\n relationData?.apiAction !== \"update\" &&\n canBeUsedToConnect(field.type, relationData)\n ) {\n const { apiAction, ...cleanedData } = relationData;\n throwErrorIfApiActionIsInvalid(apiAction);\n mutableBody[field.name] = { connect: cleanedData };\n } else if (relationData?.apiAction !== \"update\" && !relationData?.id) {\n let dataToCreate = { ...relationData };\n\n if (dataToCreate?.apiAction) {\n const { apiAction, ...rest } = dataToCreate;\n throwErrorIfApiActionIsInvalid(apiAction);\n dataToCreate = rest;\n }\n\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions,\n true,\n \"create\"\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n if (parentOperation === \"create\") {\n const { apiAction, ...cleanedData } = relationData;\n throwErrorIfApiActionIsInvalid(apiAction);\n mutableBody[field.name] = { connect: cleanedData };\n return;\n }\n\n const { id, apiAction, ...data } = relationData;\n throwErrorIfApiActionIsInvalid(apiAction);\n\n let dataToUpdate = data;\n if (nestedRelations?.singular || nestedRelations?.list) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions,\n true,\n \"update\"\n );\n }\n\n mutableBody[field.name] = {\n update: {\n where: { id },\n data: dataToUpdate,\n },\n };\n }\n });\n\n if (mutableBody?.apiAction && !isRelation) {\n throw new AppError(\n \"Invalid usage of apiAction field, it must only be used on relation fields whether single or multiple.\",\n 400,\n {\n data: {\n ...body,\n },\n }\n );\n }\n\n return removeApiAction(mutableBody);\n}\n\nexport type ModelGroupRelationFields = ReturnType<\n typeof getGroupedModelReations\n>;\n\nfunction getGroupedModelReations(modelName: string) {\n const relationsFields = prismaSchemaParser.getModelRelations(modelName);\n\n return {\n singular: relationsFields?.filter(\n (field) => field.isRelation && !field.isArray\n ),\n list: relationsFields?.filter((field) => field.isRelation && field.isArray),\n };\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n if (!bodyField) return false;\n\n if (bodyField.apiAction && ![\"connect\"]?.includes?.(bodyField.apiAction))\n return false;\n\n if (bodyField.apiAction === \"connect\") return true;\n\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) return true;\n\n const uniqueFields = prismaSchemaParser.getModelUniqueFields(modelName) || [];\n\n if (Object.keys(bodyField).length === 1 && uniqueFields?.length > 0) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field: PrismaField) => field.name === fieldName);\n }\n\n return false;\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as errorControllerHelper from "./utils/error-handler.helpers.js";
|
|
2
2
|
import { getAppServer } from "../../app.js";
|
|
3
|
+
import multerErrorHandler from "./utils/multer-error-handler.js";
|
|
3
4
|
export default function errorHandler(err, req, res, _) {
|
|
4
5
|
console.error("[\x1b[31mError\x1b[0m]:", err);
|
|
5
6
|
err.statusCode = err.statusCode || 500;
|
|
@@ -24,6 +25,9 @@ export default function errorHandler(err, req, res, _) {
|
|
|
24
25
|
case "PrismaClientInitializationError":
|
|
25
26
|
error = errorControllerHelper.handlePrismaClientInitializationError(err);
|
|
26
27
|
break;
|
|
28
|
+
case "MulterError":
|
|
29
|
+
error = multerErrorHandler.handle(err);
|
|
30
|
+
break;
|
|
27
31
|
}
|
|
28
32
|
switch (err.code) {
|
|
29
33
|
case "P1000":
|
|
@@ -79,52 +83,28 @@ export default function errorHandler(err, req, res, _) {
|
|
|
79
83
|
}, req, res);
|
|
80
84
|
sendProductionError({ message, ...rest }, req, res);
|
|
81
85
|
}
|
|
82
|
-
function sendDevelopmentError(err,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
...rest,
|
|
89
|
-
stack: err?.originalError?.stack?.split?.("\n"),
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
else
|
|
93
|
-
res.status(err.statusCode).json({
|
|
94
|
-
title: "Internal server error",
|
|
95
|
-
message: err.message,
|
|
96
|
-
});
|
|
86
|
+
function sendDevelopmentError(err, _, res) {
|
|
87
|
+
res.status(err.statusCode).json({
|
|
88
|
+
...err,
|
|
89
|
+
message: err.message?.split?.("\n")[err.message?.split?.("\n").length - 1],
|
|
90
|
+
stack: err?.originalError?.stack?.split?.("\n"),
|
|
91
|
+
});
|
|
97
92
|
}
|
|
98
|
-
function sendProductionError(err,
|
|
99
|
-
if (
|
|
100
|
-
if (err.isOperational)
|
|
101
|
-
res.status(err.statusCode).json({
|
|
102
|
-
status: err.status,
|
|
103
|
-
message: err.message,
|
|
104
|
-
meta: err.meta || {},
|
|
105
|
-
code: err.code || "Unknown",
|
|
106
|
-
});
|
|
107
|
-
else
|
|
108
|
-
res.status(500).json({
|
|
109
|
-
status: "error",
|
|
110
|
-
message: "Internal server error, please try again later.",
|
|
111
|
-
code: "Unknown",
|
|
112
|
-
meta: {},
|
|
113
|
-
});
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (err.isOperational) {
|
|
93
|
+
function sendProductionError(err, _, res) {
|
|
94
|
+
if (err.isOperational)
|
|
117
95
|
res.status(err.statusCode).json({
|
|
118
|
-
|
|
96
|
+
status: err.status,
|
|
119
97
|
message: err.message,
|
|
120
|
-
|
|
98
|
+
meta: err.meta || {},
|
|
99
|
+
code: err.code || "Unknown",
|
|
100
|
+
});
|
|
101
|
+
else
|
|
102
|
+
res.status(500).json({
|
|
103
|
+
status: "error",
|
|
104
|
+
message: "Internal server error, please try again later.",
|
|
105
|
+
code: "InternalServerError",
|
|
106
|
+
meta: {},
|
|
121
107
|
});
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
res.status(err.statusCode).json({
|
|
125
|
-
title: "Internal server error",
|
|
126
|
-
message: "Internal server error, please try again later.",
|
|
127
|
-
});
|
|
128
108
|
}
|
|
129
109
|
process.on("SIGTERM", () => {
|
|
130
110
|
if (process.env.ARKOS_BUILD !== "true") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport * as errorControllerHelper from \"./utils/error-handler.helpers\";\nimport { getAppServer } from \"../../app\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} _ - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n _: NextFunction\n): void {\n console.error(\"[\\x1b[31mError\\x1b[0m]:\", err);\n\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n let error: any = {\n ...err,\n message: err.message,\n stack: err?.stack || undefined,\n };\n\n if (process.env.ARKOS_BUILD === \"true\") delete error?.stack;\n\n switch (err.name) {\n case \"JsonWebTokenError\":\n error = errorControllerHelper.handleJWTError();\n break;\n case \"TokenExpiredError\":\n error = errorControllerHelper.handleJWTExpired();\n break;\n case \"PrismaClientValidationError\":\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n break;\n case \"PrismaClientInitializationError\":\n error = errorControllerHelper.handlePrismaClientInitializationError(err);\n break;\n }\n\n switch (err.code) {\n case \"P1000\":\n error = errorControllerHelper.handleAuthenticationError(err);\n break;\n case \"P1001\":\n error = errorControllerHelper.handleServerNotReachableError(err);\n break;\n case \"P1002\":\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n break;\n case \"P1003\":\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n break;\n case \"P2000\":\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n break;\n case \"P2001\":\n error = errorControllerHelper.handleRecordNotFoundError(err);\n break;\n case \"P2002\":\n error = errorControllerHelper.handleUniqueConstraintError(err);\n break;\n case \"P2003\":\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n break;\n case \"P2004\":\n error = errorControllerHelper.handleConstraintFailedError(err);\n break;\n case \"P2025\":\n error = errorControllerHelper.handleNonExistingRecord(err);\n break;\n case \"P3000\":\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n break;\n case \"P3001\":\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n break;\n case \"P3002\":\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n break;\n case \"P3003\":\n error = errorControllerHelper.handleVersionMismatchError(err);\n break;\n }\n\n const { message, ...rest } = error;\n if (process.env.ARKOS_BUILD !== \"true\")\n return sendDevelopmentError(\n {\n message: error.message,\n ...rest,\n stack: err.stack,\n originalError: err,\n },\n req,\n res\n );\n\n sendProductionError({ message, ...rest }, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(err: any, req: Request, res: Response): void {\n if (req.originalUrl.startsWith(\"/api\")) {\n const { message, code, ...rest } = err;\n\n res.status(err.statusCode).json({\n message:\n err.message?.split?.(\"\\n\")[err.message?.split?.(\"\\n\").length - 1],\n code: code || \"Unknown\",\n ...rest,\n stack: err?.originalError?.stack?.split?.(\"\\n\"),\n });\n } else\n res.status(err.statusCode).json({\n title: \"Internal server error\",\n message: err.message,\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, req: Request, res: Response): void {\n if (req.originalUrl.startsWith(\"/api\")) {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n meta: err.meta || {},\n code: err.code || \"Unknown\",\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Internal server error, please try again later.\",\n code: \"Unknown\",\n meta: {},\n });\n\n return;\n }\n\n if (err.isOperational) {\n res.status(err.statusCode).json({\n title: \"Internal server error\",\n message: err.message,\n code: \"Unknown\",\n });\n return;\n }\n\n res.status(err.statusCode).json({\n title: \"Internal server error\",\n message: \"Internal server error, please try again later.\",\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (process.env.ARKOS_BUILD !== \"true\") {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n const server = getAppServer();\n\n if (server?.close)\n server.close(() => {\n console.error(\"Process terminated!!!\");\n process.exit();\n });\n else\n setTimeout(() => {\n process.exit(1);\n }, 0);\n }\n});\n"]}
|
|
1
|
+
{"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport * as errorControllerHelper from \"./utils/error-handler.helpers\";\nimport { getAppServer } from \"../../app\";\nimport multerErrorHandler from \"./utils/multer-error-handler\";\nimport { MulterError } from \"multer\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} _ - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n _: NextFunction\n): void {\n console.error(\"[\\x1b[31mError\\x1b[0m]:\", err);\n\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n let error: any = {\n ...err,\n message: err.message,\n stack: err?.stack || undefined,\n };\n\n if (process.env.ARKOS_BUILD === \"true\") delete error?.stack;\n\n switch (err.name) {\n case \"JsonWebTokenError\":\n error = errorControllerHelper.handleJWTError();\n break;\n case \"TokenExpiredError\":\n error = errorControllerHelper.handleJWTExpired();\n break;\n case \"PrismaClientValidationError\":\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n break;\n case \"PrismaClientInitializationError\":\n error = errorControllerHelper.handlePrismaClientInitializationError(err);\n break;\n case \"MulterError\":\n error = multerErrorHandler.handle(err as unknown as MulterError);\n break;\n }\n\n switch (err.code) {\n case \"P1000\":\n error = errorControllerHelper.handleAuthenticationError(err);\n break;\n case \"P1001\":\n error = errorControllerHelper.handleServerNotReachableError(err);\n break;\n case \"P1002\":\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n break;\n case \"P1003\":\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n break;\n case \"P2000\":\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n break;\n case \"P2001\":\n error = errorControllerHelper.handleRecordNotFoundError(err);\n break;\n case \"P2002\":\n error = errorControllerHelper.handleUniqueConstraintError(err);\n break;\n case \"P2003\":\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n break;\n case \"P2004\":\n error = errorControllerHelper.handleConstraintFailedError(err);\n break;\n case \"P2025\":\n error = errorControllerHelper.handleNonExistingRecord(err);\n break;\n case \"P3000\":\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n break;\n case \"P3001\":\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n break;\n case \"P3002\":\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n break;\n case \"P3003\":\n error = errorControllerHelper.handleVersionMismatchError(err);\n break;\n }\n\n const { message, ...rest } = error;\n if (process.env.ARKOS_BUILD !== \"true\")\n return sendDevelopmentError(\n {\n message: error.message,\n ...rest,\n stack: err.stack,\n originalError: err,\n },\n req,\n res\n );\n\n sendProductionError({ message, ...rest }, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(err: any, _: Request, res: Response): void {\n res.status(err.statusCode).json({\n ...err,\n message: err.message?.split?.(\"\\n\")[err.message?.split?.(\"\\n\").length - 1],\n stack: err?.originalError?.stack?.split?.(\"\\n\"),\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, _: Request, res: Response): void {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n meta: err.meta || {},\n code: err.code || \"Unknown\",\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Internal server error, please try again later.\",\n code: \"InternalServerError\",\n meta: {},\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (process.env.ARKOS_BUILD !== \"true\") {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n const server = getAppServer();\n\n if (server?.close)\n server.close(() => {\n console.error(\"Process terminated!!!\");\n process.exit();\n });\n else\n setTimeout(() => {\n process.exit(1);\n }, 0);\n }\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/app-error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/app-error.ts"],"names":[],"mappings":"AA+BA,MAAM,QAAS,SAAQ,KAAK;IAe1B,YACE,OAAe,EACf,UAAkB,EAClB,IAAmC,EACnC,IAAmC;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAjBjB,SAAI,GAAY,SAAS,CAAC;QAmBxB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,+BAA+B,CAAC;QAC1D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACjE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,OAAO,IAAI;YAC7C,MAAM,IAAI,QAAQ,CAChB,kCAAkC,OAAO,IAAI,+DAA+D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAC5I,GAAG,EACH,gBAAgB,EAChB,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;QAEJ,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,SAAS,CAAC;QAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,SAAS,CAAC;QAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QAEjC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAED,eAAe,QAAQ,CAAC","sourcesContent":["/**\n * Custom error class for handling application errors.\n *\n * @extends {Error}\n *\n * @property {number} statusCode - HTTP status code of the error.\n * @property {string} status - Status message derived from the status code (`fail` for 4xx, `error` for 5xx).\n * @property {boolean} isOperational - Indicates if the error is operational (intended for client visibility).\n * @property {string} [code] - Optional error code for categorization.\n * @property {Record<string, any>} [meta] - Additional metadata related to the error.\n *\n * @example\n * ```typescript\n *\n * function getUser(id: string) {\n * if (!id) {\n * throw new AppError('User ID is required', 400, 'UserIDMissing', { field: 'id' });\n * }\n * // Simulate a user not found scenario\n * throw new AppError('User not found', 404, 'UserNotFound', { userId: id });\n * }\n *\n * try {\n * getUser('');\n * } catch (error) {\n * if (error instanceof AppError) {\n * console.error(`Error: ${error.message}, Code: ${error.code}, Status: ${error.status}`);\n * }\n * }\n * ```\n */\nclass AppError extends Error {\n statusCode: number;\n status: string;\n public isOperational: boolean;\n code?: string = \"Unknown\";\n meta?: Record<string, any>;\n\n /**\n * Creates an instance of AppError.\n *\n * @param {string} message - The error message.\n * @param {number} statusCode - The HTTP status code.\n * @param {Record<string, any>} [meta] - Additional metadata for debugging or client feedback.\n * @param {string} [code] - A custom error code for categorization.\n */\n constructor(\n message: string,\n statusCode: number,\n code?: string | Record<string, any>,\n meta?: Record<string, any> | string\n ) {\n super(message);\n\n this.message = message || \"An error occurred, try again!\";\n this.statusCode = statusCode;\n this.status = `${statusCode}`.startsWith(\"4\") ? \"fail\" : \"error\";\n this.isOperational = true;\n\n if (code && meta && typeof code === typeof meta)\n throw new AppError(\n `meta and code must not both be ${typeof code}, one must be of type object and other string. but received ${JSON.stringify({ meta, code })}`,\n 500,\n \"AppErrorMisuse\",\n { meta, code }\n );\n\n if (typeof code === \"string\") this.code = code || \"Unknown\";\n if (typeof code === \"object\") this.meta = code;\n if (typeof meta === \"string\") this.code = meta || \"Unknown\";\n if (typeof meta === \"object\") this.meta = meta;\n if (!code) this.code = \"Unknown\";\n\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport default AppError;\n"]}
|
|
@@ -7,8 +7,9 @@ export function handleJWTExpired() {
|
|
|
7
7
|
return new AppError("Your token has expired, Please log again!", 401);
|
|
8
8
|
}
|
|
9
9
|
export function handlePrismaClientValidationError(err) {
|
|
10
|
-
const message = err?.message?.split("\n")[err?.message?.split("\n").length - 1]
|
|
11
|
-
|
|
10
|
+
const message = err?.message?.split("\n")[err?.message?.split("\n").length - 1] ||
|
|
11
|
+
"Invalid query arguments";
|
|
12
|
+
return new AppError(message.split(". Did you")[0], 400, "InvalidQueryArgument");
|
|
12
13
|
}
|
|
13
14
|
export function handleAuthenticationError(_) {
|
|
14
15
|
const message = "Authentication failed against the database server. Please check your credentials.";
|
|
@@ -35,15 +36,13 @@ export function handleRecordNotFoundError(_) {
|
|
|
35
36
|
return new AppError(message, 404);
|
|
36
37
|
}
|
|
37
38
|
export function handleUniqueConstraintError(err) {
|
|
38
|
-
const field = err?.meta?.target || "unknown
|
|
39
|
-
const message = `Duplicate
|
|
40
|
-
return new AppError(message, 409,
|
|
41
|
-
`${pascalCase(err.meta?.modelName)}${pascalCase(err.meta?.target?.[0])}UniqueConstraint`) ||
|
|
42
|
-
"Unknown");
|
|
39
|
+
const field = err?.meta?.target || "unknown";
|
|
40
|
+
const message = `Duplicate unique field(s) ${Array.isArray(field) ? field.map((f) => `'${f}'`).join(", ") : `'${field}'`}`;
|
|
41
|
+
return new AppError(message, 409, "DuplicateRecords");
|
|
43
42
|
}
|
|
44
43
|
export function handleForeignKeyConstraintError(_) {
|
|
45
44
|
const message = "Foreign key constraint violation. Ensure that the referenced record exists.";
|
|
46
|
-
return new AppError(message,
|
|
45
|
+
return new AppError(message, 409, "ForeignKeyViolation");
|
|
47
46
|
}
|
|
48
47
|
export function handleConstraintFailedError(err) {
|
|
49
48
|
const constraint = err?.meta?.constraint || "unknown constraint";
|
|
@@ -77,6 +76,6 @@ export function handleNonExistingRecord(err) {
|
|
|
77
76
|
return new AppError(message, model ? 400 : 404, `${model ? "Inline" : ""}${pascalCase(model || "")}RecordNotFound`);
|
|
78
77
|
}
|
|
79
78
|
export function handlePrismaClientInitializationError(_) {
|
|
80
|
-
return new AppError("Service temporarily unavailable", 503, "ServiceUnavailable");
|
|
79
|
+
return new AppError("Service temporarily unavailable", 503, "ServiceUnavailable", {});
|
|
81
80
|
}
|
|
82
81
|
//# sourceMappingURL=error-handler.helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.helpers.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/error-handler.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,QAAQ,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,QAAQ,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,GAAa;IAC7D,MAAM,OAAO,GACX,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handler.helpers.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/error-handler.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { pascalCase } from \"../../../utils/helpers/change-case.helpers\";\nimport AppError from \"./app-error\";\n\nexport function handleJWTError() {\n return new AppError(\"Invalid token. Please log in again!\", 401);\n}\n\nexport function handleJWTExpired() {\n return new AppError(\"Your token has expired, Please log again!\", 401);\n}\n\nexport function handlePrismaClientValidationError(err: AppError) {\n const message =\n err?.message?.split(\"\\n\")[err?.message?.split(\"\\n\").length - 1] ||\n \"Invalid query arguments\";\n return new AppError(\n message.split(\". Did you\")[0],\n 400,\n \"InvalidQueryArgument\"\n );\n}\n\nexport function handleAuthenticationError(_: AppError) {\n const message =\n \"Authentication failed against the database server. Please check your credentials.\";\n return new AppError(message, 401);\n}\n\nexport function handleServerNotReachableError(_: AppError) {\n const message =\n \"The database server is not reachable. Verify your connection string or ensure the server is online.\";\n return new AppError(message, 503);\n}\n\nexport function handleConnectionTimeoutError(_: AppError) {\n const message =\n \"Connection to the database timed out. Please check server performance or network connectivity.\";\n return new AppError(message, 504);\n}\n\nexport function handleDatabaseNotFoundError(_: AppError) {\n const message = \"The specified database does not exist on the server.\";\n return new AppError(message, 404);\n}\n\nexport function handleFieldValueTooLargeError(err: AppError) {\n const message = `The value for the field \"${err?.meta?.field_name}\" is too large. Please provide a smaller value.`;\n return new AppError(message, 400);\n}\n\nexport function handleRecordNotFoundError(_: AppError) {\n const message =\n \"No record found for the given query. Ensure the query parameters are correct.\";\n return new AppError(message, 404);\n}\n\nexport function handleUniqueConstraintError(err: any) {\n const field = err?.meta?.target || \"unknown\";\n const message = `Duplicate unique field(s) ${Array.isArray(field) ? field.map((f) => `'${f}'`).join(\", \") : `'${field}'`}`;\n return new AppError(message, 409, \"DuplicateRecords\");\n}\n\nexport function handleForeignKeyConstraintError(_: AppError) {\n const message =\n \"Foreign key constraint violation. Ensure that the referenced record exists.\";\n return new AppError(message, 409, \"ForeignKeyViolation\");\n}\n\nexport function handleConstraintFailedError(err: AppError) {\n const constraint = err?.meta?.constraint || \"unknown constraint\";\n const message = `A database constraint \"${constraint}\" failed. Please review your input data.`;\n return new AppError(message, 400);\n}\n\nexport function handleSchemaCreationFailedError(_: AppError) {\n const message =\n \"Failed to create the database schema. Verify the schema definition and try again.\";\n return new AppError(message, 500);\n}\n\nexport function handleMigrationAlreadyAppliedError(err: AppError) {\n const migrationName = err?.meta?.migration || \"unknown migration\";\n const message = `The migration \"${migrationName}\" has already been applied to the database.`;\n return new AppError(message, 409);\n}\n\nexport function handleMigrationScriptFailedError(err: AppError) {\n const migrationName = err?.meta?.migration || \"unknown migration\";\n const message = `The migration script \"${migrationName}\" failed. Review the script and resolve any issues.`;\n return new AppError(message, 500);\n}\n\nexport function handleVersionMismatchError(_: AppError) {\n const message = `Version mismatch: The database schema and migration versions are inconsistent. Please check and resolve this issue.`;\n return new AppError(message, 400);\n}\n\nexport function handleNonExistingRecord(err: {\n meta?: Record<string, any>;\n [x: string]: any;\n}) {\n const message =\n err?.meta?.cause ||\n `Operation could not be completed as some required record was not found`;\n\n const model = err?.meta?.cause\n ? err?.meta?.cause?.split(\"No '\")?.[1]?.split?.(\"'\")?.[0]\n : \"\";\n\n return new AppError(\n message,\n model ? 400 : 404,\n `${model ? \"Inline\" : \"\"}${pascalCase(model || \"\")}RecordNotFound`\n );\n}\n\nexport function handlePrismaClientInitializationError(_: any) {\n return new AppError(\n \"Service temporarily unavailable\",\n 503,\n \"ServiceUnavailable\",\n {}\n );\n}\n"]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import AppError from "./app-error.js";
|
|
2
|
+
export class BadRequestError extends AppError {
|
|
3
|
+
constructor(message = "Bad request", code = "BadRequest", meta) {
|
|
4
|
+
super(message, 400, code, meta);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class UnauthorizedError extends AppError {
|
|
8
|
+
constructor(message = "Unauthorized", code = "Unauthorized", meta) {
|
|
9
|
+
super(message, 401, code, meta);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class PaymentRequiredError extends AppError {
|
|
13
|
+
constructor(message = "Payment required", code = "PaymentRequired", meta) {
|
|
14
|
+
super(message, 402, code, meta);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class ForbiddenError extends AppError {
|
|
18
|
+
constructor(message = "Forbidden", code = "Forbidden", meta) {
|
|
19
|
+
super(message, 403, code, meta);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class NotFoundError extends AppError {
|
|
23
|
+
constructor(message = "Not found", code = "NotFound", meta) {
|
|
24
|
+
super(message, 404, code, meta);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class MethodNotAllowedError extends AppError {
|
|
28
|
+
constructor(message = "Method not allowed", code = "MethodNotAllowed", meta) {
|
|
29
|
+
super(message, 405, code, meta);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class NotAcceptableError extends AppError {
|
|
33
|
+
constructor(message = "Not acceptable", code = "NotAcceptable", meta) {
|
|
34
|
+
super(message, 406, code, meta);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class RequestTimeoutError extends AppError {
|
|
38
|
+
constructor(message = "Request timeout", code = "RequestTimeout", meta) {
|
|
39
|
+
super(message, 408, code, meta);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class ConflictError extends AppError {
|
|
43
|
+
constructor(message = "Conflict", code = "Conflict", meta) {
|
|
44
|
+
super(message, 409, code, meta);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class GoneError extends AppError {
|
|
48
|
+
constructor(message = "Gone", code = "Gone", meta) {
|
|
49
|
+
super(message, 410, code, meta);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class LengthRequiredError extends AppError {
|
|
53
|
+
constructor(message = "Length required", code = "LengthRequired", meta) {
|
|
54
|
+
super(message, 411, code, meta);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class PreconditionFailedError extends AppError {
|
|
58
|
+
constructor(message = "Precondition failed", code = "PreconditionFailed", meta) {
|
|
59
|
+
super(message, 412, code, meta);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class PayloadTooLargeError extends AppError {
|
|
63
|
+
constructor(message = "Payload too large", code = "PayloadTooLarge", meta) {
|
|
64
|
+
super(message, 413, code, meta);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export class UriTooLongError extends AppError {
|
|
68
|
+
constructor(message = "URi too long", code = "UriTooLong", meta) {
|
|
69
|
+
super(message, 414, code, meta);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export class UnsupportedMediaTypeError extends AppError {
|
|
73
|
+
constructor(message = "Unsupported media type", code = "UnsupportedMediaType", meta) {
|
|
74
|
+
super(message, 415, code, meta);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export class RangeNotSatisfiableError extends AppError {
|
|
78
|
+
constructor(message = "Range not satisfiable", code = "RangeNotSatisfiable", meta) {
|
|
79
|
+
super(message, 416, code, meta);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class ExpectationFailedError extends AppError {
|
|
83
|
+
constructor(message = "Expectation failed", code = "ExpectationFailed", meta) {
|
|
84
|
+
super(message, 417, code, meta);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export class ImATeapotError extends AppError {
|
|
88
|
+
constructor(message = "I'm a teapot", code = "ImATeapot", meta) {
|
|
89
|
+
super(message, 418, code, meta);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export class UnprocessableContentError extends AppError {
|
|
93
|
+
constructor(message = "Unprocessable content", code = "UnprocessableContent", meta) {
|
|
94
|
+
super(message, 422, code, meta);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export class TooManyRequestsError extends AppError {
|
|
98
|
+
constructor(message = "Too many requests", code = "TooManyRequests", meta) {
|
|
99
|
+
super(message, 429, code, meta);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export class InternalServerError extends AppError {
|
|
103
|
+
constructor(message = "Internal server error", code = "InternalServer", meta) {
|
|
104
|
+
super(message, 500, code, meta);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export class NotImplementedError extends AppError {
|
|
108
|
+
constructor(message = "Not implemented", code = "NotImplemented", meta) {
|
|
109
|
+
super(message, 501, code, meta);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export class BadGatewayError extends AppError {
|
|
113
|
+
constructor(message = "Bad gateway", code = "BadGateway", meta) {
|
|
114
|
+
super(message, 502, code, meta);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export class ServiceUnavailableError extends AppError {
|
|
118
|
+
constructor(message = "Service unavailable", code = "ServiceUnavailable", meta) {
|
|
119
|
+
super(message, 503, code, meta);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export class GatewayTimeoutError extends AppError {
|
|
123
|
+
constructor(message = "Gateway timeout", code = "GatewayTimeout", meta) {
|
|
124
|
+
super(message, 504, code, meta);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import AppError from \"./app-error\";\n\n/**\n * 400 - Bad Request\n * @example throw new BadRequestError(\"Invalid input\", \"InvalidInput\", { field: \"email\" })\n */\nexport class BadRequestError extends AppError {\n constructor(\n message = \"Bad request\",\n code = \"BadRequest\",\n meta?: Record<string, any>\n ) {\n super(message, 400, code, meta);\n }\n}\n\n/**\n * 401 - Unauthorized\n * @example throw new UnauthorizedError(\"Invalid token\", \"InvalidToken\")\n */\nexport class UnauthorizedError extends AppError {\n constructor(\n message = \"Unauthorized\",\n code = \"Unauthorized\",\n meta?: Record<string, any>\n ) {\n super(message, 401, code, meta);\n }\n}\n\n/**\n * 402 - Payment Required\n * @example throw new PaymentRequiredError(\"Subscription expired\", \"PaymentRequired\")\n */\nexport class PaymentRequiredError extends AppError {\n constructor(\n message = \"Payment required\",\n code = \"PaymentRequired\",\n meta?: Record<string, any>\n ) {\n super(message, 402, code, meta);\n }\n}\n\n/**\n * 403 - Forbidden\n * @example throw new ForbiddenError(\"Access denied\", \"Forbidden\", { resource: \"admin\" })\n */\nexport class ForbiddenError extends AppError {\n constructor(\n message = \"Forbidden\",\n code = \"Forbidden\",\n meta?: Record<string, any>\n ) {\n super(message, 403, code, meta);\n }\n}\n\n/**\n * 404 - Not Found\n * @example throw new NotFoundError(\"User not found\", \"NotFound\", { id: 123 })\n */\nexport class NotFoundError extends AppError {\n constructor(\n message = \"Not found\",\n code = \"NotFound\",\n meta?: Record<string, any>\n ) {\n super(message, 404, code, meta);\n }\n}\n\n/**\n * 405 - Method Not Allowed\n * @example throw new MethodNotAllowedError(\"POST not allowed\", \"MethodNotAllowed\")\n */\nexport class MethodNotAllowedError extends AppError {\n constructor(\n message = \"Method not allowed\",\n code = \"MethodNotAllowed\",\n meta?: Record<string, any>\n ) {\n super(message, 405, code, meta);\n }\n}\n\n/**\n * 406 - Not Acceptable\n * @example throw new NotAcceptableError(\"Unsupported format\", \"NotAcceptable\")\n */\nexport class NotAcceptableError extends AppError {\n constructor(\n message = \"Not acceptable\",\n code = \"NotAcceptable\",\n meta?: Record<string, any>\n ) {\n super(message, 406, code, meta);\n }\n}\n\n/**\n * 408 - Request Timeout\n * @example throw new RequestTimeoutError(\"Upload took too long\", \"RequestTimeout\")\n */\nexport class RequestTimeoutError extends AppError {\n constructor(\n message = \"Request timeout\",\n code = \"RequestTimeout\",\n meta?: Record<string, any>\n ) {\n super(message, 408, code, meta);\n }\n}\n\n/**\n * 409 - Conflict\n * @example throw new ConflictError(\"Duplicate entry\", \"Conflict\", { field: \"email\" })\n */\nexport class ConflictError extends AppError {\n constructor(\n message = \"Conflict\",\n code = \"Conflict\",\n meta?: Record<string, any>\n ) {\n super(message, 409, code, meta);\n }\n}\n\n/**\n * 410 - Gone\n * @example throw new GoneError(\"Resource deleted\", \"Gone\")\n */\nexport class GoneError extends AppError {\n constructor(message = \"Gone\", code = \"Gone\", meta?: Record<string, any>) {\n super(message, 410, code, meta);\n }\n}\n\n/**\n * 411 - Length Required\n * @example throw new LengthRequiredError(\"Content-Length missing\", \"LengthRequired\")\n */\nexport class LengthRequiredError extends AppError {\n constructor(\n message = \"Length required\",\n code = \"LengthRequired\",\n meta?: Record<string, any>\n ) {\n super(message, 411, code, meta);\n }\n}\n\n/**\n * 412 - Precondition Failed\n * @example throw new PreconditionFailedError(\"ETag mismatch\", \"PreconditionFailed\")\n */\nexport class PreconditionFailedError extends AppError {\n constructor(\n message = \"Precondition failed\",\n code = \"PreconditionFailed\",\n meta?: Record<string, any>\n ) {\n super(message, 412, code, meta);\n }\n}\n\n/**\n * 413 - Payload Too Large\n * @example throw new PayloadTooLargeError(\"File exceeds 10MB\", \"PayloadTooLarge\", { max: \"10MB\" })\n */\nexport class PayloadTooLargeError extends AppError {\n constructor(\n message = \"Payload too large\",\n code = \"PayloadTooLarge\",\n meta?: Record<string, any>\n ) {\n super(message, 413, code, meta);\n }\n}\n\n/**\n * 414 - URI Too Long\n * @example throw new UriTooLongError(\"Query string too long\", \"UriTooLong\")\n */\nexport class UriTooLongError extends AppError {\n constructor(\n message = \"URi too long\",\n code = \"UriTooLong\",\n meta?: Record<string, any>\n ) {\n super(message, 414, code, meta);\n }\n}\n\n/**\n * 415 - Unsupported Media Type\n * @example throw new UnsupportedMediaTypeError(\"Expected JSON\", \"UnsupportedMediaType\")\n */\nexport class UnsupportedMediaTypeError extends AppError {\n constructor(\n message = \"Unsupported media type\",\n code = \"UnsupportedMediaType\",\n meta?: Record<string, any>\n ) {\n super(message, 415, code, meta);\n }\n}\n\n/**\n * 416 - Range Not Satisfiable\n * @example throw new RangeNotSatisfiableError(\"Invalid byte range\", \"RangeNotSatisfiable\")\n */\nexport class RangeNotSatisfiableError extends AppError {\n constructor(\n message = \"Range not satisfiable\",\n code = \"RangeNotSatisfiable\",\n meta?: Record<string, any>\n ) {\n super(message, 416, code, meta);\n }\n}\n\n/**\n * 417 - Expectation Failed\n * @example throw new ExpectationFailedError(\"Expect header failed\", \"ExpectationFailed\")\n */\nexport class ExpectationFailedError extends AppError {\n constructor(\n message = \"Expectation failed\",\n code = \"ExpectationFailed\",\n meta?: Record<string, any>\n ) {\n super(message, 417, code, meta);\n }\n}\n\n/**\n * 418 - I'm a teapot\n * @example throw new ImATeapotError(\"Cannot brew coffee\", \"ImATeapot\")\n */\nexport class ImATeapotError extends AppError {\n constructor(\n message = \"I'm a teapot\",\n code = \"ImATeapot\",\n meta?: Record<string, any>\n ) {\n super(message, 418, code, meta);\n }\n}\n\n/**\n * 422 - Unprocessable Content\n * @example throw new UnprocessableContentError(\"Validation failed\", \"ValidationFailed\", { errors: [...] })\n */\nexport class UnprocessableContentError extends AppError {\n constructor(\n message = \"Unprocessable content\",\n code = \"UnprocessableContent\",\n meta?: Record<string, any>\n ) {\n super(message, 422, code, meta);\n }\n}\n\n/**\n * 429 - Too Many Requests\n * @example throw new TooManyRequestsError(\"Rate limit exceeded\", \"RateLimitExceeded\", { retryAfter: 60 })\n */\nexport class TooManyRequestsError extends AppError {\n constructor(\n message = \"Too many requests\",\n code = \"TooManyRequests\",\n meta?: Record<string, any>\n ) {\n super(message, 429, code, meta);\n }\n}\n\n/**\n * 500 - Internal Server Error\n * @example throw new InternalServerError(\"Database connection failed\", \"DatabaseError\")\n */\nexport class InternalServerError extends AppError {\n constructor(\n message = \"Internal server error\",\n code = \"InternalServer\",\n meta?: Record<string, any>\n ) {\n super(message, 500, code, meta);\n }\n}\n\n/**\n * 501 - Not Implemented\n * @example throw new NotImplementedError(\"Feature coming soon\", \"NotImplemented\")\n */\nexport class NotImplementedError extends AppError {\n constructor(\n message = \"Not implemented\",\n code = \"NotImplemented\",\n meta?: Record<string, any>\n ) {\n super(message, 501, code, meta);\n }\n}\n\n/**\n * 502 - Bad Gateway\n * @example throw new BadGatewayError(\"Upstream timeout\", \"BadGateway\")\n */\nexport class BadGatewayError extends AppError {\n constructor(\n message = \"Bad gateway\",\n code = \"BadGateway\",\n meta?: Record<string, any>\n ) {\n super(message, 502, code, meta);\n }\n}\n\n/**\n * 503 - Service Unavailable\n * @example throw new ServiceUnavailableError(\"Maintenance mode\", \"ServiceUnavailable\", { retryAfter: 300 })\n */\nexport class ServiceUnavailableError extends AppError {\n constructor(\n message = \"Service unavailable\",\n code = \"ServiceUnavailable\",\n meta?: Record<string, any>\n ) {\n super(message, 503, code, meta);\n }\n}\n\n/**\n * 504 - Gateway Timeout\n * @example throw new GatewayTimeoutError(\"Upstream timeout\", \"GatewayTimeout\")\n */\nexport class GatewayTimeoutError extends AppError {\n constructor(\n message = \"Gateway timeout\",\n code = \"GatewayTimeout\",\n meta?: Record<string, any>\n ) {\n super(message, 504, code, meta);\n }\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import AppError from "./app-error.js";
|
|
2
|
+
class MulterErrorHandler {
|
|
3
|
+
handle(err) {
|
|
4
|
+
switch (err.code) {
|
|
5
|
+
case "LIMIT_UNEXPECTED_FILE":
|
|
6
|
+
return new AppError(`Unexpected file field '${err.field}'`, 400, "UnexpectedFileField", {
|
|
7
|
+
hint: "Ensure the field name matches the expected upload configuration",
|
|
8
|
+
});
|
|
9
|
+
case "LIMIT_FILE_SIZE":
|
|
10
|
+
return new AppError(`File in field '${err.field}' exceeds the maximum allowed size`, 413, "FileTooLarge", {
|
|
11
|
+
hint: "Upload a smaller file or contact the server administrator to increase the limit",
|
|
12
|
+
});
|
|
13
|
+
case "LIMIT_FILE_COUNT":
|
|
14
|
+
return new AppError(`Too many files uploaded`, 400, "TooManyFiles", {
|
|
15
|
+
hint: "Reduce the number of files and try again",
|
|
16
|
+
});
|
|
17
|
+
case "LIMIT_FIELD_COUNT":
|
|
18
|
+
return new AppError(`Too many fields in the request`, 400, "TooManyFields", { hint: "Reduce the number of form fields and try again" });
|
|
19
|
+
case "LIMIT_PART_COUNT":
|
|
20
|
+
return new AppError(`Too many parts in the multipart request`, 400, "TooManyParts", { hint: "Reduce the number of parts in your multipart request" });
|
|
21
|
+
case "LIMIT_FIELD_KEY":
|
|
22
|
+
return new AppError(`A field name in the request is too long`, 400, "FieldNameTooLong", { hint: "Shorten your form field names" });
|
|
23
|
+
case "LIMIT_FIELD_VALUE":
|
|
24
|
+
return new AppError(`Value of field '${err.field}' is too long`, 400, "FieldValueTooLong", { hint: "Shorten the value and try again" });
|
|
25
|
+
case "MISSING_FIELD_NAME":
|
|
26
|
+
return new AppError(`A file was uploaded without a field name`, 400, "MissingFieldName", { hint: "Ensure all file inputs have a valid field name" });
|
|
27
|
+
default:
|
|
28
|
+
return new AppError(`An unexpected file upload error occurred`, 500, "FileUploadError");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const multerErrorHandler = new MulterErrorHandler();
|
|
33
|
+
export default multerErrorHandler;
|
|
34
|
+
//# sourceMappingURL=multer-error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multer-error-handler.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/multer-error-handler.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,MAAM,kBAAkB;IACtB,MAAM,CAAC,GAAuB;QAC5B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,uBAAuB;gBAC1B,OAAO,IAAI,QAAQ,CACjB,0BAA0B,GAAG,CAAC,KAAK,GAAG,EACtC,GAAG,EACH,qBAAqB,EACrB;oBACE,IAAI,EAAE,iEAAiE;iBACxE,CACF,CAAC;YACJ,KAAK,iBAAiB;gBACpB,OAAO,IAAI,QAAQ,CACjB,kBAAkB,GAAG,CAAC,KAAK,oCAAoC,EAC/D,GAAG,EACH,cAAc,EACd;oBACE,IAAI,EAAE,iFAAiF;iBACxF,CACF,CAAC;YACJ,KAAK,kBAAkB;gBACrB,OAAO,IAAI,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE,cAAc,EAAE;oBAClE,IAAI,EAAE,0CAA0C;iBACjD,CAAC,CAAC;YACL,KAAK,mBAAmB;gBACtB,OAAO,IAAI,QAAQ,CACjB,gCAAgC,EAChC,GAAG,EACH,eAAe,EACf,EAAE,IAAI,EAAE,gDAAgD,EAAE,CAC3D,CAAC;YACJ,KAAK,kBAAkB;gBACrB,OAAO,IAAI,QAAQ,CACjB,yCAAyC,EACzC,GAAG,EACH,cAAc,EACd,EAAE,IAAI,EAAE,sDAAsD,EAAE,CACjE,CAAC;YACJ,KAAK,iBAAiB;gBACpB,OAAO,IAAI,QAAQ,CACjB,yCAAyC,EACzC,GAAG,EACH,kBAAkB,EAClB,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAC1C,CAAC;YACJ,KAAK,mBAAmB;gBACtB,OAAO,IAAI,QAAQ,CACjB,mBAAmB,GAAG,CAAC,KAAK,eAAe,EAC3C,GAAG,EACH,mBAAmB,EACnB,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAC5C,CAAC;YACJ,KAAK,oBAAoB;gBACvB,OAAO,IAAI,QAAQ,CACjB,0CAA0C,EAC1C,GAAG,EACH,kBAAkB,EAClB,EAAE,IAAI,EAAE,gDAAgD,EAAE,CAC3D,CAAC;YACJ;gBACE,OAAO,IAAI,QAAQ,CACjB,0CAA0C,EAC1C,GAAG,EACH,iBAAiB,CAClB,CAAC;QACN,CAAC;IACH,CAAC;CACF;AAED,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAEpD,eAAe,kBAAkB,CAAC","sourcesContent":["import multer from \"multer\";\nimport AppError from \"./app-error\";\n\nclass MulterErrorHandler {\n handle(err: multer.MulterError): AppError {\n switch (err.code) {\n case \"LIMIT_UNEXPECTED_FILE\":\n return new AppError(\n `Unexpected file field '${err.field}'`,\n 400,\n \"UnexpectedFileField\",\n {\n hint: \"Ensure the field name matches the expected upload configuration\",\n }\n );\n case \"LIMIT_FILE_SIZE\":\n return new AppError(\n `File in field '${err.field}' exceeds the maximum allowed size`,\n 413,\n \"FileTooLarge\",\n {\n hint: \"Upload a smaller file or contact the server administrator to increase the limit\",\n }\n );\n case \"LIMIT_FILE_COUNT\":\n return new AppError(`Too many files uploaded`, 400, \"TooManyFiles\", {\n hint: \"Reduce the number of files and try again\",\n });\n case \"LIMIT_FIELD_COUNT\":\n return new AppError(\n `Too many fields in the request`,\n 400,\n \"TooManyFields\",\n { hint: \"Reduce the number of form fields and try again\" }\n );\n case \"LIMIT_PART_COUNT\":\n return new AppError(\n `Too many parts in the multipart request`,\n 400,\n \"TooManyParts\",\n { hint: \"Reduce the number of parts in your multipart request\" }\n );\n case \"LIMIT_FIELD_KEY\":\n return new AppError(\n `A field name in the request is too long`,\n 400,\n \"FieldNameTooLong\",\n { hint: \"Shorten your form field names\" }\n );\n case \"LIMIT_FIELD_VALUE\":\n return new AppError(\n `Value of field '${err.field}' is too long`,\n 400,\n \"FieldValueTooLong\",\n { hint: \"Shorten the value and try again\" }\n );\n case \"MISSING_FIELD_NAME\":\n return new AppError(\n `A file was uploaded without a field name`,\n 400,\n \"MissingFieldName\",\n { hint: \"Ensure all file inputs have a valid field name\" }\n );\n default:\n return new AppError(\n `An unexpected file upload error occurred`,\n 500,\n \"FileUploadError\"\n );\n }\n }\n}\n\nconst multerErrorHandler = new MulterErrorHandler();\n\nexport default multerErrorHandler;\n"]}
|