arkos 1.4.0-canary.82 → 1.4.0-canary.84
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/modules/auth/auth.router.js +12 -12
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +10 -10
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +4 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js +2 -2
- package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +2 -2
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +6 -5
- package/dist/cjs/utils/arkos-router/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/types/body-parser-config.js +3 -0
- package/dist/cjs/utils/arkos-router/types/body-parser-config.js.map +1 -0
- package/dist/cjs/utils/arkos-router/types/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js +13 -3
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +5 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/helpers/dynamic-loader.helpers.js +34 -55
- package/dist/cjs/utils/helpers/dynamic-loader.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/routers.helpers.js +6 -4
- package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +12 -12
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +10 -10
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +4 -1
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js +1 -1
- package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +6 -5
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/body-parser-config.js +2 -0
- package/dist/esm/utils/arkos-router/types/body-parser-config.js.map +1 -0
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +13 -3
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +5 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/helpers/arkos-config.helpers.js +2 -2
- package/dist/esm/utils/helpers/dynamic-loader.helpers.js +34 -55
- package/dist/esm/utils/helpers/dynamic-loader.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/routers.helpers.js +6 -4
- package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/types/modules/auth/auth.router.d.ts +1 -1
- package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +1 -1
- package/dist/types/utils/arkos-router/types/body-parser-config.d.ts +18 -0
- package/dist/types/utils/arkos-router/types/index.d.ts +2 -17
- package/dist/types/utils/helpers/routers.helpers.d.ts +2 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utils/arkos-router/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { IRouter } from \"express\";\nimport { ZodSchema } from \"zod\";\nimport { Options as RateLimitOptions } from \"express-rate-limit\";\nimport { Options as QueryParserOptions } from \"../../../utils/helpers/query-parser.helpers\";\nimport { DetailedAccessControlRule } from \"../../../types/auth\";\nimport { ArkosErrorRequestHandler, ArkosRequestHandler } from \"../../../types\";\nimport
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utils/arkos-router/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { IRouter } from \"express\";\nimport { ZodSchema } from \"zod\";\nimport { Options as RateLimitOptions } from \"express-rate-limit\";\nimport { Options as QueryParserOptions } from \"../../../utils/helpers/query-parser.helpers\";\nimport { DetailedAccessControlRule } from \"../../../types/auth\";\nimport { ArkosErrorRequestHandler, ArkosRequestHandler } from \"../../../types\";\nimport compression from \"compression\";\nimport { OpenApiConfig } from \"./openapi-config\";\nimport { UploadConfig } from \"./upload-config\";\nimport { BodyParserConfig } from \"./body-parser-config\";\n\n/**\n * Handler function for HTTP methods that accepts route configuration and request handlers.\n *\n * @param {ArkosRouteConfig} config - The route configuration object.\n * @param {...(ArkosRequestHandler | ArkosErrorRequestHandler)[]} handlers - Request and error handlers for the route.\n * @returns {IRouter} The Express router instance.\n */\ntype MethodHandler = (\n config: ArkosRouteConfig,\n ...handlers: (ArkosRequestHandler | ArkosErrorRequestHandler)[]\n) => IRouter;\n\n/**\n * Creates an enhanced Express Router with features like OpenAPI documentation capabilities and smart data validation.\n *\n * The ArkosRouter extends the standard Express Router with the ability to\n * automatically capture OpenAPI metadata from route configurations.\n *\n * @example\n * const router = ArkosRouter();\n *\n * router.get(\n * {\n * path: \"/users/:id\",\n * openapi: {\n * summary: \"Get user by ID\",\n * tags: [\"Users\"]\n * }\n * },\n * (req, res) => { ... }\n * );\n *\n * @returns {IArkosRouter} A proxied Express Router instance with enhanced OpenAPI capabilities\n *\n * @see {@link ArkosRouteConfig} for configuration options\n */\nexport interface IArkosRouter\n extends Omit<\n IRouter,\n | \"get\"\n | \"post\"\n | \"put\"\n | \"patch\"\n | \"delete\"\n | \"options\"\n | \"head\"\n | \"trace\"\n | \"all\"\n > {\n /** GET method handler with route configuration support */\n get: MethodHandler;\n /** POST method handler with route configuration support */\n post: MethodHandler;\n /** PUT method handler with route configuration support */\n put: MethodHandler;\n /** PATCH method handler with route configuration support */\n patch: MethodHandler;\n /** DELETE method handler with route configuration support */\n delete: MethodHandler;\n /** OPTIONS method handler with route configuration support */\n options: MethodHandler;\n /** HEAD method handler with route configuration support */\n head: MethodHandler;\n /** TRACE method handler with route configuration support */\n trace: MethodHandler;\n /** ALL methods handler with route configuration support */\n all: MethodHandler;\n}\n\n/**\n * Configuration object for defining routes in Arkos.js.\n */\nexport interface ArkosRouteConfig {\n /**\n * Disables the route by not mounting it internally.\n */\n disabled?: boolean;\n /**\n * The URL path pattern for the route.\n *\n * @example \"/api/users/:id\"\n */\n path: string;\n /**\n * Authentication and authorization configuration.\n *\n * @remarks\n * - Set to `true` to require authentication without specific permissions.\n * - Set to `false` or omit to allow unauthenticated access.\n * - Provide an object to specify resource-based access control with resource name, action, and optional custom rules.\n */\n authentication?:\n | boolean\n | {\n resource: string;\n action: string;\n rule?: DetailedAccessControlRule | string[];\n };\n /**\n * Request validation configuration using Zod schemas or class constructors.\n *\n * @remarks\n * - Set to `false` to disable all validation.\n * - Provide an object with `query`, `body`, and/or `params` properties to validate specific parts of the request.\n * - Each property accepts a Zod schema, a class constructor, or `false` to disable validation for that part.\n */\n validation?:\n | false\n | {\n query?: ZodSchema | (new (...args: any[]) => object) | false;\n body?: ZodSchema | (new (...args: any[]) => object) | false;\n params?: ZodSchema | (new (...args: any[]) => object) | false;\n };\n\n /**\n * Rate limiting configuration for this route.\n *\n * @see {@link https://www.npmjs.com/package/express-rate-limit express-rate-limit} for available options.\n */\n rateLimit?: Partial<RateLimitOptions>;\n\n /**\n * Allows to define options for npm package compression.\n * Nothing is passed by default.\n *\n * @see {@link https://www.npmjs.com/package/compression compression} for further details.\n */\n compression?: compression.CompressionOptions;\n /**\n * Options to define how query must be parsed.\n *\n * @example\n * ```\n * GET /api/product?saleId=null\n * ```\n *\n * Normally would parsed to { saleId: \"null\" } so query parser\n * trough setting option `parseNull` will transform { saleId: null }\n *\n * @default\n * ```\n * {\n * parseNull: true,\n * parseUndefined: true,\n * parseBoolean: true,\n * }\n * ```\n *\n * @remarks\n * parseNumber may convert fields that are string but you only passed\n * numbers to query pay attention to this.\n *\n * Soon a feature to converted the query to the end prisma type will be added.\n */\n queryParser?: QueryParserOptions;\n /**\n * Configuration for request body parsing.\n *\n * @property {(\"json\" | \"urlencoded\" | \"raw\" | \"text\")} parser - The type of body parser to use.\n * @property {object} [options] - Parser-specific options passed to the corresponding Express body parser middleware.\n *\n * @remarks\n * - When `parser` is `\"json\"`, options are passed to `express.json()`.\n * - When `parser` is `\"urlencoded\"`, options are passed to `express.urlencoded()`.\n * - When `parser` is `\"raw\"`, options are passed to `express.raw()`.\n * - When `parser` is `\"text\"`, options are passed to `express.text()`.\n * - Set to `false` to disable body parsing for this route.\n *\n * @see {@link https://expressjs.com/en/api.html#express.json Express body parser documentation}\n */\n bodyParser?: BodyParserConfig | BodyParserConfig[] | false;\n /**\n * Experimental features to be battled tested before being stable\n *\n * PS: These features may be changed without any previous warning.\n */\n experimental?: {\n /**\n * OpenAPI specification for this route.\n *\n * @remarks\n * - Set to `false` to exclude this route from OpenAPI documentation.\n * - Provide a partial OpenAPI operation object to document the route.\n */\n openapi?: false | OpenApiConfig;\n /**\n * Configuration for file upload handling in routes.\n * Supports single file, multiple files from same field, or multiple fields with files.\n */\n uploads?: UploadConfig;\n };\n}\n"]}
|
|
@@ -13,6 +13,7 @@ const express_1 = __importDefault(require("express"));
|
|
|
13
13
|
const compression_1 = __importDefault(require("compression"));
|
|
14
14
|
const query_parser_helpers_1 = require("../../../helpers/query-parser.helpers");
|
|
15
15
|
const upload_manager_1 = __importDefault(require("./upload-manager"));
|
|
16
|
+
const multer_1 = __importDefault(require("multer"));
|
|
16
17
|
function extractArkosRoutes(app, basePath = "") {
|
|
17
18
|
const routes = [];
|
|
18
19
|
function extractFromStack(stack, prefix = "") {
|
|
@@ -73,9 +74,18 @@ function getMiddlewareStack(config) {
|
|
|
73
74
|
middlewares.push((0, compression_1.default)(config.compression));
|
|
74
75
|
if (config.queryParser)
|
|
75
76
|
middlewares.push((0, query_parser_helpers_1.queryParser)(config.queryParser));
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
if (config?.bodyParser) {
|
|
78
|
+
const parsers = Array.isArray(config.bodyParser)
|
|
79
|
+
? config.bodyParser
|
|
80
|
+
: [config.bodyParser];
|
|
81
|
+
parsers.forEach((parser) => {
|
|
82
|
+
if (typeof parser === "object" && parser.parser)
|
|
83
|
+
if (parser.parser !== "multipart")
|
|
84
|
+
middlewares.push(express_1.default[parser.parser](parser.options));
|
|
85
|
+
else if (parser.parser === "multipart")
|
|
86
|
+
middlewares.push((0, multer_1.default)({ limits: parser.options }).none());
|
|
87
|
+
});
|
|
88
|
+
}
|
|
79
89
|
if (config.experimental?.uploads) {
|
|
80
90
|
middlewares.push(upload_manager_1.default.handleUpload(config.experimental.uploads));
|
|
81
91
|
middlewares.push((0, base_middlewares_1.validateRequestInputs)(config));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/index.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/index.ts"],"names":[],"mappings":"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","sourcesContent":["import rateLimit from \"express-rate-limit\";\nimport authService from \"../../../../modules/auth/auth.service\";\nimport { validateRequestInputs } from \"../../../../modules/base/base.middlewares\";\nimport RouteConfigRegistry from \"../../route-config-registry\";\nimport { ArkosRouteConfig } from \"../../types\";\nimport express from \"express\";\nimport compression from \"compression\";\nimport { queryParser } from \"../../../helpers/query-parser.helpers\";\nimport uploadManager from \"./upload-manager\";\nimport multer from \"multer\";\n\nexport function extractArkosRoutes(\n app: any,\n basePath = \"\"\n): Array<{\n path: string;\n method: string;\n config?: ArkosRouteConfig;\n}> {\n const routes: Array<{\n path: string;\n method: string;\n config?: ArkosRouteConfig;\n }> = [];\n\n function extractFromStack(stack: any[], prefix = \"\") {\n stack.forEach((layer: any) => {\n if (layer.route) {\n const fullPath = prefix + layer.route.path;\n const methods = Object.keys(layer.route.methods);\n\n methods.forEach((method) => {\n const handlers = layer.route.stack || [];\n let config: ArkosRouteConfig | undefined;\n\n for (const handler of handlers) {\n const foundConfig = RouteConfigRegistry.get(handler.handle);\n\n if (foundConfig) {\n config = foundConfig;\n routes.push({\n path: fullPath,\n method: method.toUpperCase(),\n config,\n });\n\n break;\n }\n }\n });\n } else if (layer.name === \"router\" && layer.handle?.stack) {\n let nestedPrefix = prefix;\n\n if (layer.regexp) {\n const match = layer.regexp\n .toString()\n .match(/\\/\\^?(\\\\\\/[^?]+|\\/[^?]+)/);\n if (match) {\n nestedPrefix = prefix + \"/\" + match[1].replace(/\\\\\\//g, \"/\");\n nestedPrefix = nestedPrefix\n .replace(/\\/\\//g, \"/\")\n .replace(/\\/$/, \"\");\n }\n }\n\n extractFromStack(layer.handle.stack, nestedPrefix);\n }\n });\n }\n\n const stack = app._router?.stack || app.stack;\n if (stack) extractFromStack(stack, basePath);\n\n return routes;\n}\n\nexport function getMiddlewareStack(config: ArkosRouteConfig) {\n const middlewares = [];\n\n if (config.authentication) middlewares.push(authService.authenticate);\n\n if (\n typeof config.authentication === \"object\" &&\n config.authentication.action &&\n config.authentication.resource\n )\n middlewares.push(\n authService.handleAccessControl(\n config.authentication.action,\n config.authentication.resource,\n { [config.authentication.action]: config.authentication?.rule }\n )\n );\n\n if (config.rateLimit) middlewares.push(rateLimit(config.rateLimit));\n if (config.compression) middlewares.push(compression(config.compression));\n if (config.queryParser) middlewares.push(queryParser(config.queryParser));\n\n if (config?.bodyParser) {\n const parsers = Array.isArray(config.bodyParser)\n ? config.bodyParser\n : [config.bodyParser];\n\n parsers.forEach((parser) => {\n if (typeof parser === \"object\" && parser.parser)\n if (parser.parser !== \"multipart\")\n middlewares.push(express[parser.parser](parser.options));\n else if (parser.parser === \"multipart\")\n middlewares.push(multer({ limits: parser.options }).none());\n });\n }\n\n if (config.experimental?.uploads) {\n middlewares.push(uploadManager.handleUpload(config.experimental.uploads));\n\n middlewares.push(validateRequestInputs(config));\n\n middlewares.push(\n uploadManager.handlePostUpload(config.experimental.uploads)\n );\n } else middlewares.push(validateRequestInputs(config));\n\n return middlewares;\n}\n"]}
|
|
@@ -161,7 +161,11 @@ class UploadManager {
|
|
|
161
161
|
if (config.attachToBody === false)
|
|
162
162
|
return undefined;
|
|
163
163
|
if (config.attachToBody === "pathname" || !config.attachToBody)
|
|
164
|
-
return
|
|
164
|
+
return ((baseRoute === "/"
|
|
165
|
+
? ""
|
|
166
|
+
: baseRoute.startsWith("/")
|
|
167
|
+
? baseRoute
|
|
168
|
+
: `/${baseRoute}`) + normalizePath(file.path));
|
|
165
169
|
if (config.attachToBody === "url")
|
|
166
170
|
return url;
|
|
167
171
|
if (config.attachToBody === "file")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-manager.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/upload-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import multer from \"multer\";\nimport { UploadConfig } from \"../../types/upload-config\";\nimport {\n documentsExtensions,\n imagesExtenstions,\n videosExtensions,\n} from \"../../../../modules/file-upload/utils/helpers/file-extensions\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosResponse,\n getArkosConfig,\n} from \"../../../../exports\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { removeBothSlashes } from \"../../../helpers/text.helpers\";\nimport { promisify } from \"util\";\nimport sheu from \"../../../sheu\";\nimport AppError from \"../../../../modules/error-handler/utils/app-error\";\nimport { RequestHandler } from \"express\";\nimport {\n extractRequestInfo,\n generateRelativePath,\n} from \"../../../../modules/file-upload/utils/helpers/file-upload.helpers\";\nimport deepmerge from \"../../../helpers/deepmerge.helper\";\n\nfunction determineUploadDir(file: Express.Multer.File) {\n if (file.mimetype.includes?.(\"image\")) return \"/images\";\n if (file.mimetype.includes?.(\"video\")) return \"/videos\";\n if (imagesExtenstions.has(file.mimetype.split(\"/\")[1])) return \"/images\";\n if (videosExtensions.has(file.mimetype.split(\"/\")[1])) return \"/videos\";\n if (documentsExtensions.has(file.mimetype.split(\"/\")[1])) return \"/documents\";\n return \"/files\";\n}\n\nconst storage = multer.diskStorage({\n destination: (req, file, cb) => {\n const arkosConfig = getArkosConfig();\n const baseUploadDir = arkosConfig.fileUpload?.baseUploadDir || \"/uploads\";\n let uploadDir =\n (req.headers[\"x-upload-dir\"] as string) || determineUploadDir(file);\n req.headers[\"x-upload-dir\"] = uploadDir;\n\n const fullUploadDir = path.resolve(\n path.join(\n process.cwd(),\n baseUploadDir.replaceAll(\"//\", \"/\"),\n uploadDir.replaceAll(\"//\", \"/\")\n )\n );\n\n if (!fs.existsSync(fullUploadDir))\n fs.mkdirSync(fullUploadDir, { recursive: true });\n\n cb(null, fullUploadDir);\n },\n filename: (_, file, cb) => {\n const uniqueSuffix = Date.now() + \"-\" + Math.round(Math.random() * 1e9);\n const ext = path.extname(file.originalname);\n cb(null, `${file.originalname.replace(ext, \"\")}-${uniqueSuffix}${ext}`);\n },\n});\n\nclass UploadManager {\n private getUpload({\n maxSize = 1024 * 1024 * 5,\n allowedFileTypes = /.*/,\n }: {\n maxSize?: number;\n allowedFileTypes?: string[] | RegExp;\n }): multer.Multer {\n return multer({\n storage,\n fileFilter: (req, file, cb) =>\n this.fileFilter(req, file, cb, allowedFileTypes),\n limits: { fileSize: maxSize },\n });\n }\n\n getMiddleware(config: UploadConfig): RequestHandler {\n let upload;\n if (config.type === \"single\")\n upload = this.getUpload(config)[config.type](config.field);\n else if (config.type === \"array\")\n upload = this.getUpload(config)[config.type](\n config.field,\n config.maxCount || 5\n );\n else upload = this.getUpload(config)[config.type](config.fields);\n return upload;\n }\n\n handleUpload(config: UploadConfig, oldFilePath?: string) {\n return (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const middleware = this.getMiddleware(config);\n req.headers[\"x-upload-dir\"] = config.uploadDir;\n middleware(req, res, async (err) => {\n if (err) return next(err);\n\n if (oldFilePath) {\n const { fileUpload: configs } = getArkosConfig();\n\n const filePath = path.resolve(\n process.cwd(),\n removeBothSlashes(configs?.baseUploadDir!),\n removeBothSlashes(oldFilePath)\n );\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) await promisify(fs.unlink)(filePath);\n } catch (err) {\n sheu.warn(err);\n }\n }\n\n next();\n });\n };\n }\n\n handleFileCleanup(config: UploadConfig) {\n return async (\n err: any,\n req: ArkosRequest,\n _: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const deleteFile = async (file: Express.Multer.File) => {\n try {\n await fs.promises.unlink(file.path);\n } catch (error: any) {\n sheu.warn(\n `Failed to delete file: ${file.path} because ${error.message}`,\n { timestamp: true }\n );\n }\n };\n\n try {\n if (config.type === \"single\" && req.file) {\n await deleteFile(req.file);\n delete req.file;\n } else if (config.type === \"array\" && Array.isArray(req.files)) {\n for (const file of req.files) {\n await deleteFile(file);\n }\n delete req.files;\n } else if (\n config.type === \"fields\" &&\n req.files &&\n !Array.isArray(req.files)\n ) {\n for (const fieldName in req.files) {\n for (const file of req.files[fieldName]) {\n await deleteFile(file);\n }\n }\n delete req.files;\n }\n } catch (error: any) {\n sheu.warn(`File cleanup error: ${error.message}`, { timestamp: true });\n }\n\n next(err);\n };\n }\n\n handlePostUpload(config: UploadConfig) {\n return (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const { baseURL, baseRoute } = extractRequestInfo(req);\n const arkosConfig = getArkosConfig();\n\n const normalizePath = (filePath: string): string => {\n let fullBaseUploadDir = path.resolve(\n path.join(process.cwd(), arkosConfig.fileUpload?.baseUploadDir!)\n );\n fullBaseUploadDir = fullBaseUploadDir.replace(process.cwd(), \"\");\n\n return filePath\n .replace(/\\\\/g, \"/\")\n .replaceAll(process.cwd(), \"\")\n .replace(`/${fullBaseUploadDir}`, \"\")\n .replace(fullBaseUploadDir, \"\");\n };\n\n const buildFileURL = (file: Express.Multer.File): string => {\n const relativePath = generateRelativePath(\n file.path,\n req.headers[\"x-upload-dir\"] as string\n );\n return `${baseURL}${baseRoute === \"/\" ? \"\" : baseRoute}${\n relativePath.startsWith(\"/\") ? relativePath : `/${relativePath}`\n }`;\n };\n\n const getAttachValue = (file: Express.Multer.File): any => {\n const url = buildFileURL(file);\n\n (file as any).url = url;\n (file as any).pathname = normalizePath(file.path);\n\n if (config.attachToBody === false) return undefined;\n if (config.attachToBody === \"pathname\" || !config.attachToBody)\n return normalizePath(file.path);\n if (config.attachToBody === \"url\") return url;\n if (config.attachToBody === \"file\") return file;\n\n return undefined;\n };\n\n const setNestedValue = (obj: any, path: string, value: any) => {\n const keys = path.match(/[^\\[\\]]+/g) || [];\n\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!current[key]) {\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n }\n current = current[key];\n }\n\n const lastKey = keys[keys.length - 1];\n current[lastKey] = value;\n };\n\n try {\n if (config.type === \"single\" && req.file) {\n const value = getAttachValue(req.file);\n\n if (value !== undefined && config.field) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, value);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n } else if (config.type === \"array\" && Array.isArray(req.files)) {\n const values = req.files\n .map((file) => getAttachValue(file))\n .filter((v) => v !== undefined);\n\n if (values.length > 0 && config.field) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, values);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n } else if (\n config.type === \"fields\" &&\n req.files &&\n !Array.isArray(req.files)\n ) {\n const bodyUpdate: any = {};\n\n for (const fieldName in req.files) {\n const files = req.files[fieldName];\n const values = files\n .map((file) => getAttachValue(file))\n .filter((v) => v !== undefined);\n\n if (values.length > 0) {\n const valueToAttach = values.length === 1 ? values[0] : values;\n setNestedValue(bodyUpdate, fieldName, valueToAttach);\n }\n }\n\n if (Object.keys(bodyUpdate).length > 0) {\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n }\n } catch (err: any) {\n throw new AppError(\n `File uploads post processing failed ${err.message}`,\n 500,\n \"FileUploadPostProcessError\"\n );\n }\n\n next();\n };\n }\n\n /**\n * Validates the file's type and MIME type.\n * @param {Express.Multer.File} file - The uploaded file.\n * @param {Function} cb - The callback function to indicate if file is valid.\n */\n private fileFilter = (\n _: any,\n file: any,\n cb: any,\n allowedFileTypes: string[] | RegExp\n ) => {\n const ext = path.extname(file.originalname).toLowerCase();\n let isAllowed = false;\n if (Array.isArray(allowedFileTypes))\n isAllowed = allowedFileTypes.includes(ext);\n else isAllowed = allowedFileTypes.test(ext);\n\n if (isAllowed) cb(null, true);\n else\n cb(\n new AppError(\n `File type not allowed, allowed files are ${String(allowedFileTypes).replaceAll(\"/\", \"\").split(\"|\").join(\", \")}`,\n 400,\n \"FileTypeNotAllowed\",\n { filename: file.originalname }\n )\n );\n };\n}\n\nconst uploadManager = new UploadManager();\n\nexport default uploadManager;\n"]}
|
|
1
|
+
{"version":3,"file":"upload-manager.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/upload-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import multer from \"multer\";\nimport { UploadConfig } from \"../../types/upload-config\";\nimport {\n documentsExtensions,\n imagesExtenstions,\n videosExtensions,\n} from \"../../../../modules/file-upload/utils/helpers/file-extensions\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosResponse,\n getArkosConfig,\n} from \"../../../../exports\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { removeBothSlashes } from \"../../../helpers/text.helpers\";\nimport { promisify } from \"util\";\nimport sheu from \"../../../sheu\";\nimport AppError from \"../../../../modules/error-handler/utils/app-error\";\nimport { RequestHandler } from \"express\";\nimport {\n extractRequestInfo,\n generateRelativePath,\n} from \"../../../../modules/file-upload/utils/helpers/file-upload.helpers\";\nimport deepmerge from \"../../../helpers/deepmerge.helper\";\n\nfunction determineUploadDir(file: Express.Multer.File) {\n if (file.mimetype.includes?.(\"image\")) return \"/images\";\n if (file.mimetype.includes?.(\"video\")) return \"/videos\";\n if (imagesExtenstions.has(file.mimetype.split(\"/\")[1])) return \"/images\";\n if (videosExtensions.has(file.mimetype.split(\"/\")[1])) return \"/videos\";\n if (documentsExtensions.has(file.mimetype.split(\"/\")[1])) return \"/documents\";\n return \"/files\";\n}\n\nconst storage = multer.diskStorage({\n destination: (req, file, cb) => {\n const arkosConfig = getArkosConfig();\n const baseUploadDir = arkosConfig.fileUpload?.baseUploadDir || \"/uploads\";\n let uploadDir =\n (req.headers[\"x-upload-dir\"] as string) || determineUploadDir(file);\n req.headers[\"x-upload-dir\"] = uploadDir;\n\n const fullUploadDir = path.resolve(\n path.join(\n process.cwd(),\n baseUploadDir.replaceAll(\"//\", \"/\"),\n uploadDir.replaceAll(\"//\", \"/\")\n )\n );\n\n if (!fs.existsSync(fullUploadDir))\n fs.mkdirSync(fullUploadDir, { recursive: true });\n\n cb(null, fullUploadDir);\n },\n filename: (_, file, cb) => {\n const uniqueSuffix = Date.now() + \"-\" + Math.round(Math.random() * 1e9);\n const ext = path.extname(file.originalname);\n cb(null, `${file.originalname.replace(ext, \"\")}-${uniqueSuffix}${ext}`);\n },\n});\n\nclass UploadManager {\n private getUpload({\n maxSize = 1024 * 1024 * 5,\n allowedFileTypes = /.*/,\n }: {\n maxSize?: number;\n allowedFileTypes?: string[] | RegExp;\n }): multer.Multer {\n return multer({\n storage,\n fileFilter: (req, file, cb) =>\n this.fileFilter(req, file, cb, allowedFileTypes),\n limits: { fileSize: maxSize },\n });\n }\n\n getMiddleware(config: UploadConfig): RequestHandler {\n let upload;\n if (config.type === \"single\")\n upload = this.getUpload(config)[config.type](config.field);\n else if (config.type === \"array\")\n upload = this.getUpload(config)[config.type](\n config.field,\n config.maxCount || 5\n );\n else upload = this.getUpload(config)[config.type](config.fields);\n return upload;\n }\n\n handleUpload(config: UploadConfig, oldFilePath?: string) {\n return (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const middleware = this.getMiddleware(config);\n req.headers[\"x-upload-dir\"] = config.uploadDir;\n middleware(req, res, async (err) => {\n if (err) return next(err);\n\n if (oldFilePath) {\n const { fileUpload: configs } = getArkosConfig();\n\n const filePath = path.resolve(\n process.cwd(),\n removeBothSlashes(configs?.baseUploadDir!),\n removeBothSlashes(oldFilePath)\n );\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) await promisify(fs.unlink)(filePath);\n } catch (err) {\n sheu.warn(err);\n }\n }\n\n next();\n });\n };\n }\n\n handleFileCleanup(config: UploadConfig) {\n return async (\n err: any,\n req: ArkosRequest,\n _: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const deleteFile = async (file: Express.Multer.File) => {\n try {\n await fs.promises.unlink(file.path);\n } catch (error: any) {\n sheu.warn(\n `Failed to delete file: ${file.path} because ${error.message}`,\n { timestamp: true }\n );\n }\n };\n\n try {\n if (config.type === \"single\" && req.file) {\n await deleteFile(req.file);\n delete req.file;\n } else if (config.type === \"array\" && Array.isArray(req.files)) {\n for (const file of req.files) {\n await deleteFile(file);\n }\n delete req.files;\n } else if (\n config.type === \"fields\" &&\n req.files &&\n !Array.isArray(req.files)\n ) {\n for (const fieldName in req.files) {\n for (const file of req.files[fieldName]) {\n await deleteFile(file);\n }\n }\n delete req.files;\n }\n } catch (error: any) {\n sheu.warn(`File cleanup error: ${error.message}`, { timestamp: true });\n }\n\n next(err);\n };\n }\n\n handlePostUpload(config: UploadConfig) {\n return (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const { baseURL, baseRoute } = extractRequestInfo(req);\n const arkosConfig = getArkosConfig();\n\n const normalizePath = (filePath: string): string => {\n let fullBaseUploadDir = path.resolve(\n path.join(process.cwd(), arkosConfig.fileUpload?.baseUploadDir!)\n );\n fullBaseUploadDir = fullBaseUploadDir.replace(process.cwd(), \"\");\n\n return filePath\n .replace(/\\\\/g, \"/\")\n .replaceAll(process.cwd(), \"\")\n .replace(`/${fullBaseUploadDir}`, \"\")\n .replace(fullBaseUploadDir, \"\");\n };\n\n const buildFileURL = (file: Express.Multer.File): string => {\n const relativePath = generateRelativePath(\n file.path,\n req.headers[\"x-upload-dir\"] as string\n );\n return `${baseURL}${baseRoute === \"/\" ? \"\" : baseRoute}${\n relativePath.startsWith(\"/\") ? relativePath : `/${relativePath}`\n }`;\n };\n\n const getAttachValue = (file: Express.Multer.File): any => {\n const url = buildFileURL(file);\n\n (file as any).url = url;\n (file as any).pathname = normalizePath(file.path);\n\n if (config.attachToBody === false) return undefined;\n if (config.attachToBody === \"pathname\" || !config.attachToBody)\n return (\n (baseRoute === \"/\"\n ? \"\"\n : baseRoute.startsWith(\"/\")\n ? baseRoute\n : `/${baseRoute}`) + normalizePath(file.path)\n );\n if (config.attachToBody === \"url\") return url;\n if (config.attachToBody === \"file\") return file;\n\n return undefined;\n };\n\n const setNestedValue = (obj: any, path: string, value: any) => {\n const keys = path.match(/[^\\[\\]]+/g) || [];\n\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!current[key]) {\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n }\n current = current[key];\n }\n\n const lastKey = keys[keys.length - 1];\n current[lastKey] = value;\n };\n\n try {\n if (config.type === \"single\" && req.file) {\n const value = getAttachValue(req.file);\n\n if (value !== undefined && config.field) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, value);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n } else if (config.type === \"array\" && Array.isArray(req.files)) {\n const values = req.files\n .map((file) => getAttachValue(file))\n .filter((v) => v !== undefined);\n\n if (values.length > 0 && config.field) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, values);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n } else if (\n config.type === \"fields\" &&\n req.files &&\n !Array.isArray(req.files)\n ) {\n const bodyUpdate: any = {};\n\n for (const fieldName in req.files) {\n const files = req.files[fieldName];\n const values = files\n .map((file) => getAttachValue(file))\n .filter((v) => v !== undefined);\n\n if (values.length > 0) {\n const valueToAttach = values.length === 1 ? values[0] : values;\n setNestedValue(bodyUpdate, fieldName, valueToAttach);\n }\n }\n\n if (Object.keys(bodyUpdate).length > 0) {\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n }\n } catch (err: any) {\n throw new AppError(\n `File uploads post processing failed ${err.message}`,\n 500,\n \"FileUploadPostProcessError\"\n );\n }\n\n next();\n };\n }\n\n /**\n * Validates the file's type and MIME type.\n * @param {Express.Multer.File} file - The uploaded file.\n * @param {Function} cb - The callback function to indicate if file is valid.\n */\n private fileFilter = (\n _: any,\n file: any,\n cb: any,\n allowedFileTypes: string[] | RegExp\n ) => {\n const ext = path.extname(file.originalname).toLowerCase();\n let isAllowed = false;\n if (Array.isArray(allowedFileTypes))\n isAllowed = allowedFileTypes.includes(ext);\n else isAllowed = allowedFileTypes.test(ext);\n\n if (isAllowed) cb(null, true);\n else\n cb(\n new AppError(\n `File type not allowed, allowed files are ${String(allowedFileTypes).replaceAll(\"/\", \"\").split(\"|\").join(\", \")}`,\n 400,\n \"FileTypeNotAllowed\",\n { filename: file.originalname }\n )\n );\n };\n}\n\nconst uploadManager = new UploadManager();\n\nexport default uploadManager;\n"]}
|
|
@@ -7,10 +7,9 @@ exports.applyStrictRoutingRules = applyStrictRoutingRules;
|
|
|
7
7
|
exports.validateRouterConfigConsistency = validateRouterConfigConsistency;
|
|
8
8
|
exports.pathExists = pathExists;
|
|
9
9
|
const fs_1 = __importDefault(require("fs"));
|
|
10
|
-
const deepmerge_helper_1 = __importDefault(require("./deepmerge.helper"));
|
|
11
10
|
function applyStrictRoutingRules(appModule, arkosConfig, moduleConfig) {
|
|
12
11
|
const strictMode = arkosConfig?.routers?.strict || false;
|
|
13
|
-
let config = moduleConfig
|
|
12
|
+
let config = moduleConfig ? { ...moduleConfig } : {};
|
|
14
13
|
appModule = appModule.toLowerCase();
|
|
15
14
|
const allEndpoints = appModule === "auth"
|
|
16
15
|
? [
|
|
@@ -38,18 +37,15 @@ function applyStrictRoutingRules(appModule, arkosConfig, moduleConfig) {
|
|
|
38
37
|
const hadBooleanDisable = typeof config.disable === "boolean";
|
|
39
38
|
if (hadBooleanDisable) {
|
|
40
39
|
const disableValue = config.disable;
|
|
41
|
-
|
|
42
|
-
const endpointConfigs = {};
|
|
40
|
+
config.disable = {};
|
|
43
41
|
for (const endpoint of allEndpoints) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
42
|
+
config.disable[endpoint] = disableValue;
|
|
43
|
+
if (!config[endpoint]) {
|
|
44
|
+
config[endpoint] = {};
|
|
45
|
+
}
|
|
46
|
+
config[endpoint].disabled = disableValue;
|
|
48
47
|
}
|
|
49
|
-
return
|
|
50
|
-
disable: disableObject,
|
|
51
|
-
...endpointConfigs,
|
|
52
|
-
});
|
|
48
|
+
return config;
|
|
53
49
|
}
|
|
54
50
|
if (strictMode === true) {
|
|
55
51
|
const strictDefaults = appModule === "auth"
|
|
@@ -80,30 +76,7 @@ function applyStrictRoutingRules(appModule, arkosConfig, moduleConfig) {
|
|
|
80
76
|
updateMany: true,
|
|
81
77
|
deleteMany: true,
|
|
82
78
|
};
|
|
83
|
-
|
|
84
|
-
const endpointConfigs = {};
|
|
85
|
-
for (const endpoint of Object.keys(strictDefaults)) {
|
|
86
|
-
endpointConfigs[endpoint] = (0, deepmerge_helper_1.default)({ disabled: strictDefaults[endpoint] }, config[endpoint] || {});
|
|
87
|
-
}
|
|
88
|
-
const syncedDisable = { ...disableConfig };
|
|
89
|
-
for (const endpoint of allEndpoints) {
|
|
90
|
-
const endpointDisabled = config[endpoint]?.disabled;
|
|
91
|
-
if (endpointDisabled !== undefined) {
|
|
92
|
-
syncedDisable[endpoint] = endpointDisabled;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
const syncedEndpoints = { ...endpointConfigs };
|
|
96
|
-
for (const endpoint of allEndpoints) {
|
|
97
|
-
if (syncedDisable[endpoint] !== undefined) {
|
|
98
|
-
syncedEndpoints[endpoint] = (0, deepmerge_helper_1.default)(syncedEndpoints[endpoint] || {}, {
|
|
99
|
-
disabled: syncedDisable[endpoint],
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return (0, deepmerge_helper_1.default)(config, {
|
|
104
|
-
disable: syncedDisable,
|
|
105
|
-
...syncedEndpoints,
|
|
106
|
-
});
|
|
79
|
+
applyDisabledFlags(config, allEndpoints, strictDefaults);
|
|
107
80
|
}
|
|
108
81
|
else if (strictMode === "no-bulk" &&
|
|
109
82
|
!["auth", "file-upload"].includes(appModule.toLowerCase())) {
|
|
@@ -112,30 +85,36 @@ function applyStrictRoutingRules(appModule, arkosConfig, moduleConfig) {
|
|
|
112
85
|
updateMany: true,
|
|
113
86
|
deleteMany: true,
|
|
114
87
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
88
|
+
applyDisabledFlags(config, allEndpoints, noBulkDefaults);
|
|
89
|
+
}
|
|
90
|
+
return config;
|
|
91
|
+
}
|
|
92
|
+
function applyDisabledFlags(config, allEndpoints, defaults) {
|
|
93
|
+
if (!config.disable || typeof config.disable === "boolean") {
|
|
94
|
+
config.disable = {};
|
|
95
|
+
}
|
|
96
|
+
for (const endpoint of allEndpoints) {
|
|
97
|
+
const defaultDisabled = defaults[endpoint];
|
|
98
|
+
const userDisableOverride = config.disable[endpoint];
|
|
99
|
+
const endpointDisabled = config[endpoint]?.disabled;
|
|
100
|
+
let finalDisabled;
|
|
101
|
+
if (endpointDisabled !== undefined) {
|
|
102
|
+
finalDisabled = endpointDisabled;
|
|
119
103
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const endpointDisabled = config[endpoint]?.disabled;
|
|
123
|
-
if (endpointDisabled !== undefined) {
|
|
124
|
-
syncedDisable[endpoint] = endpointDisabled;
|
|
125
|
-
}
|
|
104
|
+
else if (userDisableOverride !== undefined) {
|
|
105
|
+
finalDisabled = userDisableOverride;
|
|
126
106
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
107
|
+
else if (defaultDisabled !== undefined) {
|
|
108
|
+
finalDisabled = defaultDisabled;
|
|
109
|
+
}
|
|
110
|
+
if (finalDisabled !== undefined) {
|
|
111
|
+
config.disable[endpoint] = finalDisabled;
|
|
112
|
+
if (!config[endpoint]) {
|
|
113
|
+
config[endpoint] = {};
|
|
131
114
|
}
|
|
115
|
+
config[endpoint].disabled = finalDisabled;
|
|
132
116
|
}
|
|
133
|
-
return (0, deepmerge_helper_1.default)(config, {
|
|
134
|
-
disable: syncedDisable,
|
|
135
|
-
...syncedEndpoints,
|
|
136
|
-
});
|
|
137
117
|
}
|
|
138
|
-
return config;
|
|
139
118
|
}
|
|
140
119
|
function validateRouterConfigConsistency(appModule, config) {
|
|
141
120
|
if (!config.disable || typeof config.disable === "boolean")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-loader.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/dynamic-loader.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosConfig, RouterConfig } from \"../../exports\";\nimport fs from \"fs\";\nimport deepmerge from \"./deepmerge.helper\";\n\n/**\n * Applies strict routing rules to module configuration\n */\nexport function applyStrictRoutingRules<T extends string>(\n appModule: T,\n arkosConfig: ArkosConfig,\n moduleConfig?: RouterConfig<T>\n): RouterConfig<T> {\n const strictMode = arkosConfig?.routers?.strict || false;\n let config: any = moduleConfig || ({} as RouterConfig<T>);\n appModule = appModule.toLowerCase() as T;\n\n const allEndpoints =\n appModule === \"auth\"\n ? [\n \"getMe\",\n \"updateMe\",\n \"deleteMe\",\n \"login\",\n \"logout\",\n \"signup\",\n \"updatePassword\",\n \"findManyAuthAction\",\n ]\n : appModule === \"file-upload\"\n ? [\"findFile\", \"uploadFile\", \"updateFile\", \"deleteFile\"]\n : [\n \"createOne\",\n \"findOne\",\n \"updateOne\",\n \"deleteOne\",\n \"createMany\",\n \"findMany\",\n \"updateMany\",\n \"deleteMany\",\n ];\n\n const hadBooleanDisable = typeof config.disable === \"boolean\";\n\n // IMPORTANT: Order matters in deepmerge!\n // User config must be SECOND argument to override defaults\n\n if (hadBooleanDisable) {\n const disableValue = config.disable;\n const disableObject: Record<string, boolean> = {};\n const endpointConfigs: Record<string, any> = {};\n\n for (const endpoint of allEndpoints) {\n (disableObject as any)[endpoint] = disableValue;\n endpointConfigs[endpoint] = deepmerge((config as any)[endpoint] || {}, {\n disabled: disableValue,\n });\n }\n\n return deepmerge(config as any, {\n disable: disableObject,\n ...endpointConfigs,\n }) as RouterConfig<T>;\n }\n\n if (strictMode === true) {\n const strictDefaults: any =\n appModule === \"auth\"\n ? {\n getMe: true,\n updateMe: true,\n deleteMe: true,\n login: true,\n logout: true,\n signup: true,\n updatePassword: true,\n findManyAuthAction: true,\n }\n : appModule === \"file-upload\"\n ? {\n findFile: true,\n uploadFile: true,\n updateFile: true,\n deleteFile: true,\n }\n : {\n createOne: true,\n findOne: true,\n updateOne: true,\n deleteOne: true,\n createMany: true,\n findMany: true,\n updateMany: true,\n deleteMany: true,\n };\n\n const disableConfig: any = deepmerge(\n strictDefaults,\n (config?.disable as any) || {}\n );\n\n const endpointConfigs: Record<string, any> = {};\n for (const endpoint of Object.keys(strictDefaults)) {\n endpointConfigs[endpoint] = deepmerge(\n { disabled: strictDefaults[endpoint] },\n (config as any)[endpoint] || {}\n );\n }\n\n const syncedDisable: Record<string, boolean> = { ...disableConfig };\n for (const endpoint of allEndpoints) {\n const endpointDisabled = (config as any)[endpoint]?.disabled;\n if (endpointDisabled !== undefined) {\n syncedDisable[endpoint] = endpointDisabled;\n }\n }\n\n const syncedEndpoints: Record<string, any> = { ...endpointConfigs };\n for (const endpoint of allEndpoints) {\n if (syncedDisable[endpoint] !== undefined) {\n syncedEndpoints[endpoint] = deepmerge(syncedEndpoints[endpoint] || {}, {\n disabled: syncedDisable[endpoint],\n });\n }\n }\n\n return deepmerge(config as any, {\n disable: syncedDisable,\n ...syncedEndpoints,\n }) as RouterConfig<T>;\n } else if (\n strictMode === \"no-bulk\" &&\n ![\"auth\", \"file-upload\"].includes(appModule.toLowerCase())\n ) {\n const noBulkDefaults: any = {\n createMany: true,\n updateMany: true,\n deleteMany: true,\n };\n\n const disableConfig: any = deepmerge(\n noBulkDefaults,\n (config.disable as any) || {}\n );\n\n const endpointConfigs: Record<string, any> = {};\n for (const endpoint of Object.keys(noBulkDefaults)) {\n endpointConfigs[endpoint] = deepmerge(\n { disabled: noBulkDefaults[endpoint] },\n (config as any)[endpoint] || {}\n );\n }\n\n const syncedDisable: Record<string, boolean> = { ...disableConfig };\n for (const endpoint of allEndpoints) {\n const endpointDisabled = (config as any)[endpoint]?.disabled;\n if (endpointDisabled !== undefined) {\n syncedDisable[endpoint] = endpointDisabled;\n }\n }\n\n const syncedEndpoints: Record<string, any> = { ...endpointConfigs };\n for (const endpoint of allEndpoints) {\n if (syncedDisable[endpoint] !== undefined) {\n syncedEndpoints[endpoint] = deepmerge(\n { disabled: syncedDisable[endpoint] },\n syncedEndpoints[endpoint] || {}\n );\n }\n }\n\n return deepmerge(config as any, {\n disable: syncedDisable,\n ...syncedEndpoints,\n }) as RouterConfig<T>;\n }\n\n return config;\n}\n\nexport function validateRouterConfigConsistency(\n appModule: string,\n config: Record<string, any>\n): void {\n if (!config.disable || typeof config.disable === \"boolean\") return;\n\n const endpoints = Object.keys(config.disable) as any[];\n\n for (const endpoint of endpoints) {\n const oldWayValue = (config.disable as any)[endpoint];\n const newWayValue = (config as any)[endpoint]?.disabled;\n\n if (\n oldWayValue !== undefined &&\n newWayValue !== undefined &&\n oldWayValue !== newWayValue\n ) {\n throw new Error(\n `Conflicting disabled values for endpoint \"${endpoint}\" of module ${appModule}: ` +\n `disable.${endpoint} = ${oldWayValue}, but ${endpoint}.disabled = ${newWayValue}. ` +\n `Please use only one method to disable endpoints.`\n );\n }\n }\n}\n\nexport async function pathExists(path: string) {\n try {\n await fs.promises.stat(path);\n return true;\n } catch (err) {\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dynamic-loader.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/dynamic-loader.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosConfig, RouterConfig } from \"../../exports\";\nimport fs from \"fs\";\n\n/**\n * Applies strict routing rules to module configuration\n */\nexport function applyStrictRoutingRules<T extends string>(\n appModule: T,\n arkosConfig: ArkosConfig,\n moduleConfig?: RouterConfig<T>\n): RouterConfig<T> {\n const strictMode = arkosConfig?.routers?.strict || false;\n let config: any = moduleConfig ? { ...moduleConfig } : {};\n appModule = appModule.toLowerCase() as T;\n\n const allEndpoints =\n appModule === \"auth\"\n ? [\n \"getMe\",\n \"updateMe\",\n \"deleteMe\",\n \"login\",\n \"logout\",\n \"signup\",\n \"updatePassword\",\n \"findManyAuthAction\",\n ]\n : appModule === \"file-upload\"\n ? [\"findFile\", \"uploadFile\", \"updateFile\", \"deleteFile\"]\n : [\n \"createOne\",\n \"findOne\",\n \"updateOne\",\n \"deleteOne\",\n \"createMany\",\n \"findMany\",\n \"updateMany\",\n \"deleteMany\",\n ];\n\n const hadBooleanDisable = typeof config.disable === \"boolean\";\n if (hadBooleanDisable) {\n const disableValue = config.disable;\n config.disable = {};\n\n for (const endpoint of allEndpoints) {\n config.disable[endpoint] = disableValue;\n\n if (!config[endpoint]) {\n config[endpoint] = {};\n }\n config[endpoint].disabled = disableValue;\n }\n\n return config as RouterConfig<T>;\n }\n\n if (strictMode === true) {\n const strictDefaults: Record<string, boolean> =\n appModule === \"auth\"\n ? {\n getMe: true,\n updateMe: true,\n deleteMe: true,\n login: true,\n logout: true,\n signup: true,\n updatePassword: true,\n findManyAuthAction: true,\n }\n : appModule === \"file-upload\"\n ? {\n findFile: true,\n uploadFile: true,\n updateFile: true,\n deleteFile: true,\n }\n : {\n createOne: true,\n findOne: true,\n updateOne: true,\n deleteOne: true,\n createMany: true,\n findMany: true,\n updateMany: true,\n deleteMany: true,\n };\n\n applyDisabledFlags(config, allEndpoints, strictDefaults);\n } else if (\n strictMode === \"no-bulk\" &&\n ![\"auth\", \"file-upload\"].includes(appModule.toLowerCase())\n ) {\n const noBulkDefaults: Record<string, boolean> = {\n createMany: true,\n updateMany: true,\n deleteMany: true,\n };\n\n applyDisabledFlags(config, allEndpoints, noBulkDefaults);\n }\n\n return config as RouterConfig<T>;\n}\n\nfunction applyDisabledFlags(\n config: any,\n allEndpoints: string[],\n defaults: Record<string, boolean>\n): void {\n if (!config.disable || typeof config.disable === \"boolean\") {\n config.disable = {};\n }\n\n for (const endpoint of allEndpoints) {\n const defaultDisabled = defaults[endpoint];\n const userDisableOverride = config.disable[endpoint];\n const endpointDisabled = config[endpoint]?.disabled;\n\n let finalDisabled: boolean | undefined;\n\n if (endpointDisabled !== undefined) {\n finalDisabled = endpointDisabled;\n } else if (userDisableOverride !== undefined) {\n finalDisabled = userDisableOverride;\n } else if (defaultDisabled !== undefined) {\n finalDisabled = defaultDisabled;\n }\n\n if (finalDisabled !== undefined) {\n config.disable[endpoint] = finalDisabled;\n\n if (!config[endpoint]) {\n config[endpoint] = {};\n }\n config[endpoint].disabled = finalDisabled;\n }\n }\n}\n\nexport function validateRouterConfigConsistency(\n appModule: string,\n config: Record<string, any>\n): void {\n if (!config.disable || typeof config.disable === \"boolean\") return;\n\n const endpoints = Object.keys(config.disable) as any[];\n\n for (const endpoint of endpoints) {\n const oldWayValue = (config.disable as any)[endpoint];\n const newWayValue = (config as any)[endpoint]?.disabled;\n\n if (\n oldWayValue !== undefined &&\n newWayValue !== undefined &&\n oldWayValue !== newWayValue\n ) {\n throw new Error(\n `Conflicting disabled values for endpoint \"${endpoint}\" of module ${appModule}: ` +\n `disable.${endpoint} = ${oldWayValue}, but ${endpoint}.disabled = ${newWayValue}. ` +\n `Please use only one method to disable endpoints.`\n );\n }\n }\n}\n\nexport async function pathExists(path: string) {\n try {\n await fs.promises.stat(path);\n return true;\n } catch (err) {\n return false;\n }\n}\n"]}
|
|
@@ -70,13 +70,15 @@ function getAuthenticationConfig(endpoint, modelName, authConfigs) {
|
|
|
70
70
|
}
|
|
71
71
|
return false;
|
|
72
72
|
}
|
|
73
|
-
function createRouteConfig(endpoint, routeName, path, routerConfig, modelNameInKebab, authConfigs, validationSchema) {
|
|
73
|
+
function createRouteConfig(arkosConfig, endpoint, routeName, path, routerConfig, modelNameInKebab, authConfigs, validationSchema) {
|
|
74
74
|
let config = {
|
|
75
75
|
path: `/${routeName}${path}`,
|
|
76
76
|
disabled: (0, base_router_helpers_1.isEndpointDisabled)(routerConfig, endpoint),
|
|
77
|
-
authentication
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
...(arkosConfig.authentication?.mode && {
|
|
78
|
+
authentication: typeof authConfigs === "boolean"
|
|
79
|
+
? authConfigs
|
|
80
|
+
: getAuthenticationConfig(endpoint, modelNameInKebab, authConfigs),
|
|
81
|
+
}),
|
|
80
82
|
validation: validationSchema ? { body: validationSchema } : undefined,
|
|
81
83
|
experimental: { openapi: false },
|
|
82
84
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routers.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/routers.helpers.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"routers.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/routers.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import pluralize from \"pluralize\";\nimport catchAsync, {\n CatchAsyncReturnType,\n} from \"../../modules/error-handler/utils/catch-async\";\nimport { AccessAction, AuthConfigs } from \"../../types/auth\";\nimport { kebabCase } from \"./change-case.helpers\";\nimport {\n AuthRouterEndpoint,\n RouterConfig,\n RouterEndpoint,\n} from \"../../types/router-config\";\nimport { isEndpointDisabled } from \"../../modules/base/utils/helpers/base.router.helpers\";\nimport deepmerge from \"./deepmerge.helper\";\nimport { ArkosRouteConfig } from \"../arkos-router/types\";\nimport { getArkosConfig } from \"./arkos-config.helpers\";\nimport { ArkosConfig } from \"../../exports\";\n\nfunction throwErrorIfInterceptorIsNotAFunction(middleware: any) {\n if (middleware && typeof middleware !== \"function\")\n throw Error(\n `Validation Error: Invalid interceptor of type ${typeof middleware}, they must be a function or an array of function. checkout https://arkosjs.com/docs/core-concepts/interceptor-middlewares`\n );\n}\n\nexport const safeCatchAsync = (\n middleware: any,\n options: { type: \"error\" | \"normal\" } = { type: \"normal\" }\n) => {\n if (middleware && typeof middleware !== \"function\")\n throw Error(\n `Validation Error: Invalid interceptor of type ${typeof middleware}, they must be a function or an array of function. checkout https://arkosjs.com/docs/core-concepts/interceptor-middlewares`\n );\n\n return middleware ? catchAsync(middleware, options) : undefined;\n};\n\nexport const processMiddleware = (\n middleware: any,\n options: { type: \"error\" | \"normal\" } = { type: \"normal\" }\n) => {\n if (!middleware) return [];\n if (Array.isArray(middleware)) {\n return middleware\n .filter((mw) => !!mw)\n .map((mw) => {\n throwErrorIfInterceptorIsNotAFunction(mw);\n return safeCatchAsync(mw, options);\n }) as CatchAsyncReturnType[];\n } else {\n throwErrorIfInterceptorIsNotAFunction(middleware);\n return [safeCatchAsync(middleware, options)] as CatchAsyncReturnType[];\n }\n};\n\nexport function getAuthenticationConfig(\n endpoint: RouterEndpoint | AuthRouterEndpoint,\n modelName: string,\n authConfigs?: AuthConfigs\n) {\n const actionMap: Record<any, AccessAction> = {\n createOne: \"Create\",\n findOneAuthAction: \"View\",\n findManyAuthAction: \"View\",\n findMany: \"View\",\n createMany: \"Create\",\n updateMany: \"Update\",\n deleteMany: \"Delete\",\n findOne: \"View\",\n updateOne: \"Update\",\n deleteOne: \"Delete\",\n };\n\n const action = actionMap[endpoint];\n const authenticationControl = authConfigs?.authenticationControl;\n\n if (authenticationControl === true) return true;\n else if (\n (authenticationControl &&\n typeof authenticationControl === \"object\" &&\n (authenticationControl[action] === true ||\n authenticationControl[action] !== false)) ||\n (!authenticationControl && authenticationControl !== false)\n ) {\n return {\n resource: kebabCase(pluralize.singular(modelName)),\n action: action,\n rule: Array.isArray(authConfigs?.accessControl)\n ? authConfigs?.accessControl\n : (authConfigs?.accessControl || {})?.[action],\n };\n }\n\n return false;\n}\n\n/**\n * Creates a route configuration object for a specific endpoint\n * @param endpoint - The router endpoint type\n * @param routeName - The pluralized route name (e.g., \"users\")\n * @param path - The path suffix for the route (e.g., \"\", \"/:id\", \"/many\")\n * @param routerConfig - The router configuration object\n * @param modelNameInKebab - The model name in kebab-case\n * @param authConfigs - Authentication configurations\n * @param validationSchema - Optional validation schema for the endpoint\n * @returns Route configuration object\n */\nexport function createRouteConfig(\n arkosConfig: ArkosConfig,\n endpoint: RouterEndpoint | AuthRouterEndpoint,\n routeName: string,\n path: string,\n routerConfig: RouterConfig<any>,\n modelNameInKebab: string,\n authConfigs: any,\n validationSchema?: any\n) {\n let config: ArkosRouteConfig = {\n path: `/${routeName}${path}`,\n disabled: isEndpointDisabled(routerConfig, endpoint),\n ...(arkosConfig.authentication?.mode && {\n authentication:\n typeof authConfigs === \"boolean\"\n ? authConfigs\n : getAuthenticationConfig(endpoint, modelNameInKebab, authConfigs),\n }),\n validation: validationSchema ? { body: validationSchema } : undefined,\n experimental: { openapi: false },\n };\n\n const endpointConfig = (routerConfig as any)[endpoint];\n if (endpointConfig) config = deepmerge(config, endpointConfig);\n\n return config;\n}\n"]}
|
|
@@ -10,7 +10,7 @@ import routerValidator from "../base/utils/router-validator.js";
|
|
|
10
10
|
import { getUserFileExtension } from "../../utils/helpers/fs.helpers.js";
|
|
11
11
|
import ArkosRouter from "../../utils/arkos-router/index.js";
|
|
12
12
|
const router = ArkosRouter();
|
|
13
|
-
export function getAuthRouter(
|
|
13
|
+
export function getAuthRouter(arkosConfig) {
|
|
14
14
|
const { interceptors, dtos, schemas, prismaQueryOptions, router: customRouterModule, authConfigs, } = getModuleComponents("auth") || {};
|
|
15
15
|
const routerConfig = customRouterModule?.config || {};
|
|
16
16
|
const customRouter = customRouterModule?.default;
|
|
@@ -24,7 +24,7 @@ export function getAuthRouter(arkosConfigs) {
|
|
|
24
24
|
if (routerConfig?.disable === true)
|
|
25
25
|
return router;
|
|
26
26
|
const getValidationSchemaOrDto = (key) => {
|
|
27
|
-
const validationConfigs =
|
|
27
|
+
const validationConfigs = arkosConfig?.validation;
|
|
28
28
|
if (validationConfigs?.resolver === "class-validator")
|
|
29
29
|
return dtos?.[key];
|
|
30
30
|
else if (validationConfigs?.resolver === "zod")
|
|
@@ -32,13 +32,13 @@ export function getAuthRouter(arkosConfigs) {
|
|
|
32
32
|
return undefined;
|
|
33
33
|
};
|
|
34
34
|
if (!isEndpointDisabled(routerConfig, "getMe")) {
|
|
35
|
-
router.get(createRouteConfig("getMe", "users", "/me", routerConfig, "auth", true), addPrismaQueryOptionsToRequest(prismaQueryOptions, "getMe"), ...processMiddleware(interceptors?.beforeGetMe), authController.getMe, ...processMiddleware(interceptors?.afterGetMe), sendResponse, ...processMiddleware(interceptors?.onGetMeError, { type: "error" }));
|
|
35
|
+
router.get(createRouteConfig(arkosConfig, "getMe", "users", "/me", routerConfig, "auth", true), addPrismaQueryOptionsToRequest(prismaQueryOptions, "getMe"), ...processMiddleware(interceptors?.beforeGetMe), authController.getMe, ...processMiddleware(interceptors?.afterGetMe), sendResponse, ...processMiddleware(interceptors?.onGetMeError, { type: "error" }));
|
|
36
36
|
}
|
|
37
37
|
if (!isEndpointDisabled(routerConfig, "updateMe")) {
|
|
38
|
-
router.patch(createRouteConfig("updateMe", "users", "/me", routerConfig, "auth", true, getValidationSchemaOrDto("updateMe")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updateMe"), ...processMiddleware(interceptors?.beforeUpdateMe), authController.updateMe, ...processMiddleware(interceptors?.afterUpdateMe), sendResponse, ...processMiddleware(interceptors?.onUpdateMeError, { type: "error" }));
|
|
38
|
+
router.patch(createRouteConfig(arkosConfig, "updateMe", "users", "/me", routerConfig, "auth", true, getValidationSchemaOrDto("updateMe")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updateMe"), ...processMiddleware(interceptors?.beforeUpdateMe), authController.updateMe, ...processMiddleware(interceptors?.afterUpdateMe), sendResponse, ...processMiddleware(interceptors?.onUpdateMeError, { type: "error" }));
|
|
39
39
|
}
|
|
40
40
|
if (!isEndpointDisabled(routerConfig, "deleteMe")) {
|
|
41
|
-
router.delete(createRouteConfig("deleteMe", "users", "/me", routerConfig, "auth", true), addPrismaQueryOptionsToRequest(prismaQueryOptions, "deleteMe"), ...processMiddleware(interceptors?.beforeDeleteMe), authController.deleteMe, ...processMiddleware(interceptors?.afterDeleteMe), sendResponse, ...processMiddleware(interceptors?.onDeleteMeError, { type: "error" }));
|
|
41
|
+
router.delete(createRouteConfig(arkosConfig, "deleteMe", "users", "/me", routerConfig, "auth", true), addPrismaQueryOptionsToRequest(prismaQueryOptions, "deleteMe"), ...processMiddleware(interceptors?.beforeDeleteMe), authController.deleteMe, ...processMiddleware(interceptors?.afterDeleteMe), sendResponse, ...processMiddleware(interceptors?.onDeleteMeError, { type: "error" }));
|
|
42
42
|
}
|
|
43
43
|
if (!isEndpointDisabled(routerConfig, "login") ||
|
|
44
44
|
!isEndpointDisabled(routerConfig, "logout") ||
|
|
@@ -54,29 +54,29 @@ export function getAuthRouter(arkosConfigs) {
|
|
|
54
54
|
message: "Too many requests, please try again later",
|
|
55
55
|
});
|
|
56
56
|
},
|
|
57
|
-
},
|
|
57
|
+
}, arkosConfig?.authentication?.rateLimit || {})));
|
|
58
58
|
}
|
|
59
59
|
if (!isEndpointDisabled(routerConfig, "login")) {
|
|
60
|
-
router.post(createRouteConfig("login", "auth", "/login", routerConfig, "auth", false, getValidationSchemaOrDto("login")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "login"), ...processMiddleware(interceptors?.beforeLogin), authController.login, ...processMiddleware(interceptors?.afterLogin), sendResponse, ...processMiddleware(interceptors?.onLoginError, { type: "error" }));
|
|
60
|
+
router.post(createRouteConfig(arkosConfig, "login", "auth", "/login", routerConfig, "auth", false, getValidationSchemaOrDto("login")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "login"), ...processMiddleware(interceptors?.beforeLogin), authController.login, ...processMiddleware(interceptors?.afterLogin), sendResponse, ...processMiddleware(interceptors?.onLoginError, { type: "error" }));
|
|
61
61
|
}
|
|
62
62
|
if (!isEndpointDisabled(routerConfig, "logout")) {
|
|
63
|
-
router.delete(createRouteConfig("logout", "auth", "/logout", routerConfig, "auth", true), ...processMiddleware(interceptors?.beforeLogout), authController.logout, ...processMiddleware(interceptors?.afterLogout), sendResponse, ...processMiddleware(interceptors?.onLogoutError, { type: "error" }));
|
|
63
|
+
router.delete(createRouteConfig(arkosConfig, "logout", "auth", "/logout", routerConfig, "auth", true), ...processMiddleware(interceptors?.beforeLogout), authController.logout, ...processMiddleware(interceptors?.afterLogout), sendResponse, ...processMiddleware(interceptors?.onLogoutError, { type: "error" }));
|
|
64
64
|
}
|
|
65
65
|
if (!isEndpointDisabled(routerConfig, "signup")) {
|
|
66
|
-
router.post(createRouteConfig("signup", "auth", "/signup", routerConfig, "auth", false, getValidationSchemaOrDto("signup")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "signup"), ...processMiddleware(interceptors?.beforeSignup), authController.signup, ...processMiddleware(interceptors?.afterSignup), sendResponse, ...processMiddleware(interceptors?.onSignupError, { type: "error" }));
|
|
66
|
+
router.post(createRouteConfig(arkosConfig, "signup", "auth", "/signup", routerConfig, "auth", false, getValidationSchemaOrDto("signup")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "signup"), ...processMiddleware(interceptors?.beforeSignup), authController.signup, ...processMiddleware(interceptors?.afterSignup), sendResponse, ...processMiddleware(interceptors?.onSignupError, { type: "error" }));
|
|
67
67
|
}
|
|
68
68
|
if (!isEndpointDisabled(routerConfig, "updatePassword")) {
|
|
69
|
-
router.post(createRouteConfig("updatePassword", "auth", "/update-password", routerConfig, "auth", true, getValidationSchemaOrDto("updatePassword")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updatePassword"), ...processMiddleware(interceptors?.beforeUpdatePassword), authController.updatePassword, ...processMiddleware(interceptors?.afterUpdatePassword), sendResponse, ...processMiddleware(interceptors?.onUpdatePasswordError, {
|
|
69
|
+
router.post(createRouteConfig(arkosConfig, "updatePassword", "auth", "/update-password", routerConfig, "auth", true, getValidationSchemaOrDto("updatePassword")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updatePassword"), ...processMiddleware(interceptors?.beforeUpdatePassword), authController.updatePassword, ...processMiddleware(interceptors?.afterUpdatePassword), sendResponse, ...processMiddleware(interceptors?.onUpdatePasswordError, {
|
|
70
70
|
type: "error",
|
|
71
71
|
}));
|
|
72
72
|
}
|
|
73
73
|
if (!isEndpointDisabled(routerConfig, "findManyAuthAction")) {
|
|
74
|
-
router.get(createRouteConfig("findManyAuthAction", "auth-actions", "", routerConfig, "auth", authConfigs), ...processMiddleware(interceptors?.beforeFindManyAuthAction), authController.findManyAuthAction, ...processMiddleware(interceptors?.afterFindManyAuthAction), sendResponse, ...processMiddleware(interceptors?.onFindManyAuthActionError, {
|
|
74
|
+
router.get(createRouteConfig(arkosConfig, "findManyAuthAction", "auth-actions", "", routerConfig, "auth", authConfigs), ...processMiddleware(interceptors?.beforeFindManyAuthAction), authController.findManyAuthAction, ...processMiddleware(interceptors?.afterFindManyAuthAction), sendResponse, ...processMiddleware(interceptors?.onFindManyAuthActionError, {
|
|
75
75
|
type: "error",
|
|
76
76
|
}));
|
|
77
77
|
}
|
|
78
78
|
if (!isEndpointDisabled(routerConfig, "findOneAuthAction")) {
|
|
79
|
-
router.get(createRouteConfig("findOneAuthAction", "auth-actions", "/:resourceName", routerConfig, "auth", authConfigs), ...processMiddleware(interceptors?.beforeFindOneAuthAction), authController.findOneAuthAction, ...processMiddleware(interceptors?.afterFindOneAuthAction), sendResponse, ...processMiddleware(interceptors?.onFindOneAuthActionError, {
|
|
79
|
+
router.get(createRouteConfig(arkosConfig, "findOneAuthAction", "auth-actions", "/:resourceName", routerConfig, "auth", authConfigs), ...processMiddleware(interceptors?.beforeFindOneAuthAction), authController.findOneAuthAction, ...processMiddleware(interceptors?.afterFindOneAuthAction), sendResponse, ...processMiddleware(interceptors?.onFindOneAuthActionError, {
|
|
80
80
|
type: "error",
|
|
81
81
|
}));
|
|
82
82
|
}
|