@digitaldefiance/node-express-suite 3.11.32 → 3.12.0
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 +858 -0
- package/package.json +1 -1
- package/src/controllers/openapi.d.ts +67 -0
- package/src/controllers/openapi.d.ts.map +1 -0
- package/src/controllers/openapi.js +89 -0
- package/src/controllers/openapi.js.map +1 -0
- package/src/decorators/auth.d.ts +128 -0
- package/src/decorators/auth.d.ts.map +1 -0
- package/src/decorators/auth.js +230 -0
- package/src/decorators/auth.js.map +1 -0
- package/src/decorators/base-controller.d.ts +144 -6
- package/src/decorators/base-controller.d.ts.map +1 -1
- package/src/decorators/base-controller.js +487 -31
- package/src/decorators/base-controller.js.map +1 -1
- package/src/decorators/controller.d.ts +63 -7
- package/src/decorators/controller.d.ts.map +1 -1
- package/src/decorators/controller.js +70 -39
- package/src/decorators/controller.js.map +1 -1
- package/src/decorators/handler-args.d.ts +68 -0
- package/src/decorators/handler-args.d.ts.map +1 -0
- package/src/decorators/handler-args.js +83 -0
- package/src/decorators/handler-args.js.map +1 -0
- package/src/decorators/http-methods.d.ts +143 -0
- package/src/decorators/http-methods.d.ts.map +1 -0
- package/src/decorators/http-methods.js +265 -0
- package/src/decorators/http-methods.js.map +1 -0
- package/src/decorators/index.d.ts +22 -0
- package/src/decorators/index.d.ts.map +1 -1
- package/src/decorators/index.js +56 -0
- package/src/decorators/index.js.map +1 -1
- package/src/decorators/lifecycle.d.ts +248 -0
- package/src/decorators/lifecycle.d.ts.map +1 -0
- package/src/decorators/lifecycle.js +301 -0
- package/src/decorators/lifecycle.js.map +1 -0
- package/src/decorators/metadata-collector.d.ts +175 -0
- package/src/decorators/metadata-collector.d.ts.map +1 -0
- package/src/decorators/metadata-collector.js +272 -0
- package/src/decorators/metadata-collector.js.map +1 -0
- package/src/decorators/metadata-keys.d.ts +121 -0
- package/src/decorators/metadata-keys.d.ts.map +1 -0
- package/src/decorators/metadata-keys.js +116 -0
- package/src/decorators/metadata-keys.js.map +1 -0
- package/src/decorators/middleware.d.ts +181 -0
- package/src/decorators/middleware.d.ts.map +1 -0
- package/src/decorators/middleware.js +400 -0
- package/src/decorators/middleware.js.map +1 -0
- package/src/decorators/openapi-params.d.ts +192 -0
- package/src/decorators/openapi-params.d.ts.map +1 -0
- package/src/decorators/openapi-params.js +332 -0
- package/src/decorators/openapi-params.js.map +1 -0
- package/src/decorators/openapi.d.ts +201 -0
- package/src/decorators/openapi.d.ts.map +1 -0
- package/src/decorators/openapi.js +334 -0
- package/src/decorators/openapi.js.map +1 -0
- package/src/decorators/params.d.ts +217 -0
- package/src/decorators/params.d.ts.map +1 -0
- package/src/decorators/params.js +323 -0
- package/src/decorators/params.js.map +1 -0
- package/src/decorators/response.d.ts +200 -0
- package/src/decorators/response.d.ts.map +1 -0
- package/src/decorators/response.js +315 -0
- package/src/decorators/response.js.map +1 -0
- package/src/decorators/schema.d.ts +99 -0
- package/src/decorators/schema.d.ts.map +1 -0
- package/src/decorators/schema.js +329 -0
- package/src/decorators/schema.js.map +1 -0
- package/src/decorators/transaction.d.ts +69 -0
- package/src/decorators/transaction.d.ts.map +1 -0
- package/src/decorators/transaction.js +80 -0
- package/src/decorators/transaction.js.map +1 -0
- package/src/decorators/validation.d.ts +188 -0
- package/src/decorators/validation.d.ts.map +1 -0
- package/src/decorators/validation.js +269 -0
- package/src/decorators/validation.js.map +1 -0
- package/src/decorators/zod-validation.d.ts +164 -4
- package/src/decorators/zod-validation.d.ts.map +1 -1
- package/src/decorators/zod-validation.js +692 -13
- package/src/decorators/zod-validation.js.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/interfaces/openApi/decoratorOptions.d.ts +760 -0
- package/src/interfaces/openApi/decoratorOptions.d.ts.map +1 -0
- package/src/interfaces/openApi/decoratorOptions.js +734 -0
- package/src/interfaces/openApi/decoratorOptions.js.map +1 -0
- package/src/interfaces/openApi/index.d.ts +1 -0
- package/src/interfaces/openApi/index.d.ts.map +1 -1
- package/src/interfaces/openApi/index.js +23 -0
- package/src/interfaces/openApi/index.js.map +1 -1
- package/src/interfaces/openApi/parameter.d.ts +2 -0
- package/src/interfaces/openApi/parameter.d.ts.map +1 -1
- package/src/interfaces/openApi/parameter.js +3 -1
- package/src/interfaces/openApi/parameter.js.map +1 -1
- package/src/interfaces/openApi/parameterSchema.d.ts +2 -0
- package/src/interfaces/openApi/parameterSchema.d.ts.map +1 -1
- package/src/interfaces/openApi/parameterSchema.js +3 -0
- package/src/interfaces/openApi/parameterSchema.js.map +1 -1
- package/src/openapi/builder.d.ts +249 -0
- package/src/openapi/builder.d.ts.map +1 -0
- package/src/openapi/builder.js +352 -0
- package/src/openapi/builder.js.map +1 -0
- package/src/openapi/controller.d.ts +153 -0
- package/src/openapi/controller.d.ts.map +1 -0
- package/src/openapi/controller.js +331 -0
- package/src/openapi/controller.js.map +1 -0
- package/src/openapi/index.d.ts +12 -0
- package/src/openapi/index.d.ts.map +1 -0
- package/src/openapi/index.js +20 -0
- package/src/openapi/index.js.map +1 -0
- package/src/openapi/markdown-generator.d.ts +52 -0
- package/src/openapi/markdown-generator.d.ts.map +1 -0
- package/src/openapi/markdown-generator.js +569 -0
- package/src/openapi/markdown-generator.js.map +1 -0
- package/src/openapi/middleware/index.d.ts +9 -0
- package/src/openapi/middleware/index.d.ts.map +1 -0
- package/src/openapi/middleware/index.js +15 -0
- package/src/openapi/middleware/index.js.map +1 -0
- package/src/openapi/middleware/redoc.d.ts +314 -0
- package/src/openapi/middleware/redoc.d.ts.map +1 -0
- package/src/openapi/middleware/redoc.js +181 -0
- package/src/openapi/middleware/redoc.js.map +1 -0
- package/src/openapi/middleware/swagger-ui.d.ts +123 -0
- package/src/openapi/middleware/swagger-ui.d.ts.map +1 -0
- package/src/openapi/middleware/swagger-ui.js +227 -0
- package/src/openapi/middleware/swagger-ui.js.map +1 -0
- package/src/openapi/schemas.d.ts +170 -0
- package/src/openapi/schemas.d.ts.map +1 -0
- package/src/openapi/schemas.js +340 -0
- package/src/openapi/schemas.js.map +1 -0
- package/src/registry/controller-registry.d.ts +78 -0
- package/src/registry/controller-registry.d.ts.map +1 -0
- package/src/registry/controller-registry.js +86 -0
- package/src/registry/controller-registry.js.map +1 -0
- package/src/registry/index.d.ts +2 -0
- package/src/registry/index.d.ts.map +1 -1
- package/src/registry/index.js +3 -1
- package/src/registry/index.js.map +1 -1
- package/src/routers/api.d.ts +2 -1
- package/src/routers/api.d.ts.map +1 -1
- package/src/routers/api.js +7 -1
- package/src/routers/api.js.map +1 -1
- package/src/types.d.ts +1 -0
- package/src/types.d.ts.map +1 -1
- package/src/types.js +1 -0
- package/src/types.js.map +1 -1
|
@@ -1,71 +1,527 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* @fileoverview
|
|
4
|
-
* Extends BaseController to support route decorators
|
|
3
|
+
* @fileoverview Enhanced base controller with comprehensive decorator support.
|
|
4
|
+
* Extends BaseController to support all route decorators including:
|
|
5
|
+
* - HTTP method decorators (@Get, @Post, etc.)
|
|
6
|
+
* - Authentication decorators (@RequireAuth, @RequireCryptoAuth, @Public)
|
|
7
|
+
* - Validation decorators (@ValidateBody, @ValidateParams, @ValidateQuery)
|
|
8
|
+
* - Middleware decorators (@UseMiddleware, @RateLimit, @CacheResponse)
|
|
9
|
+
* - Response decorators (@Returns, @RawJson, @Paginated)
|
|
10
|
+
* - Lifecycle decorators (@OnSuccess, @OnError, @Before, @After)
|
|
11
|
+
* - Parameter injection decorators (@Param, @Body, @Query, @Header, etc.)
|
|
12
|
+
* - OpenAPI decorators (@ApiOperation, @ApiTags, @ApiSummary, etc.)
|
|
13
|
+
* - Transaction decorator (@Transactional)
|
|
14
|
+
* - Handler args decorator (@HandlerArgs)
|
|
5
15
|
* @module decorators/base-controller
|
|
6
16
|
*/
|
|
7
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
18
|
exports.DecoratorBaseController = void 0;
|
|
9
19
|
require("reflect-metadata");
|
|
20
|
+
const zod_1 = require("zod");
|
|
10
21
|
const base_1 = require("../controllers/base");
|
|
22
|
+
const registry_1 = require("../registry");
|
|
23
|
+
const auth_1 = require("./auth");
|
|
11
24
|
const controller_1 = require("./controller");
|
|
25
|
+
const handler_args_1 = require("./handler-args");
|
|
26
|
+
const lifecycle_1 = require("./lifecycle");
|
|
27
|
+
const middleware_1 = require("./middleware");
|
|
28
|
+
const openapi_1 = require("./openapi");
|
|
29
|
+
const openapi_params_1 = require("./openapi-params");
|
|
30
|
+
const params_1 = require("./params");
|
|
31
|
+
const response_1 = require("./response");
|
|
32
|
+
const transaction_1 = require("./transaction");
|
|
33
|
+
const validation_1 = require("./validation");
|
|
12
34
|
const zod_validation_1 = require("./zod-validation");
|
|
13
35
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
36
|
+
* WeakMap to store collected metadata for each controller instance.
|
|
37
|
+
* Using a WeakMap avoids class field initialization issues where
|
|
38
|
+
* ES2022 class fields are initialized to undefined after super() returns.
|
|
39
|
+
*/
|
|
40
|
+
const collectedMetadataStore = new WeakMap();
|
|
41
|
+
/**
|
|
42
|
+
* Abstract base controller with comprehensive decorator support.
|
|
43
|
+
* Automatically initializes routes from decorator metadata, including:
|
|
44
|
+
* - Route definitions from HTTP method decorators
|
|
45
|
+
* - Authentication settings from auth decorators
|
|
46
|
+
* - Validation from validation decorators
|
|
47
|
+
* - Middleware from middleware decorators
|
|
48
|
+
* - Response metadata from response decorators
|
|
49
|
+
* - Lifecycle hooks from lifecycle decorators
|
|
50
|
+
* - Parameter injection from param decorators
|
|
51
|
+
* - OpenAPI metadata from OpenAPI decorators
|
|
52
|
+
* - Transaction settings from transaction decorator
|
|
53
|
+
* - Handler arguments from handler args decorator
|
|
54
|
+
*
|
|
55
|
+
* Also auto-registers with ControllerRegistry for OpenAPI generation.
|
|
56
|
+
*
|
|
16
57
|
* @template TLanguage - Language code type (defaults to CoreLanguageCode)
|
|
17
58
|
* @template TID - Platform ID type (defaults to Buffer)
|
|
18
59
|
*/
|
|
19
60
|
class DecoratorBaseController extends base_1.BaseController {
|
|
61
|
+
/**
|
|
62
|
+
* Gets the collected metadata map for this instance.
|
|
63
|
+
* Uses a WeakMap to avoid class field initialization issues.
|
|
64
|
+
*/
|
|
65
|
+
getCollectedMetadataMap() {
|
|
66
|
+
let map = collectedMetadataStore.get(this);
|
|
67
|
+
if (!map) {
|
|
68
|
+
map = new Map();
|
|
69
|
+
collectedMetadataStore.set(this, map);
|
|
70
|
+
}
|
|
71
|
+
return map;
|
|
72
|
+
}
|
|
20
73
|
constructor(application) {
|
|
21
74
|
super(application);
|
|
75
|
+
// Auto-register with ControllerRegistry after routes are initialized
|
|
76
|
+
this.registerWithControllerRegistry();
|
|
22
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Initializes route definitions by collecting all decorator metadata.
|
|
80
|
+
* This method:
|
|
81
|
+
* 1. Collects route metadata from HTTP method decorators
|
|
82
|
+
* 2. Merges class-level and method-level metadata for each route
|
|
83
|
+
* 3. Builds RouteConfig objects for the base controller
|
|
84
|
+
* 4. Creates handler wrappers with parameter injection and lifecycle hooks
|
|
85
|
+
*/
|
|
23
86
|
initRouteDefinitions() {
|
|
24
87
|
const routes = (Reflect.getMetadata(controller_1.ROUTES_METADATA, this.constructor) ||
|
|
25
88
|
[]);
|
|
26
89
|
const constants = this.application.constants;
|
|
90
|
+
const collectedMetadata = this.getCollectedMetadataMap();
|
|
27
91
|
this.routeDefinitions = routes.map((route) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
validation = ((lang) => {
|
|
34
|
-
return originalValidation.call(context, lang);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
// Convert Zod schema to validation if present
|
|
38
|
-
if (route.options.schema && !validation) {
|
|
39
|
-
const schemaValidation = (0, zod_validation_1.zodToExpressValidator)(route.options.schema);
|
|
40
|
-
if (Array.isArray(schemaValidation)) {
|
|
41
|
-
validation = schemaValidation;
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
validation = (lang) => schemaValidation(lang);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
92
|
+
// Collect all metadata for this route
|
|
93
|
+
const collected = this.collectRouteMetadata(route);
|
|
94
|
+
collectedMetadata.set(route.handlerName, collected);
|
|
95
|
+
// Build validation from collected metadata
|
|
96
|
+
const validation = this.buildValidation(route, collected, constants);
|
|
47
97
|
return {
|
|
48
98
|
method: route.method,
|
|
49
99
|
path: route.path,
|
|
50
100
|
handlerKey: route.handlerName,
|
|
51
|
-
|
|
52
|
-
|
|
101
|
+
handlerArgs: collected.handlerArgs,
|
|
102
|
+
useAuthentication: collected.useAuthentication,
|
|
103
|
+
useCryptoAuthentication: collected.useCryptoAuthentication,
|
|
104
|
+
authFailureStatusCode: collected.authFailureStatusCode,
|
|
53
105
|
validation: validation,
|
|
54
|
-
middleware:
|
|
55
|
-
rawJsonHandler:
|
|
56
|
-
useTransaction:
|
|
57
|
-
transactionTimeout:
|
|
106
|
+
middleware: collected.middleware,
|
|
107
|
+
rawJsonHandler: collected.rawJsonHandler,
|
|
108
|
+
useTransaction: collected.useTransaction,
|
|
109
|
+
transactionTimeout: collected.transactionTimeout,
|
|
110
|
+
openapi: collected.openapi,
|
|
58
111
|
};
|
|
59
112
|
});
|
|
60
|
-
// Create handlers object from decorated methods
|
|
113
|
+
// Create handlers object from decorated methods with parameter injection and lifecycle hooks
|
|
61
114
|
this.handlers = {};
|
|
62
115
|
routes.forEach((route) => {
|
|
63
116
|
const handler = this[route.handlerName];
|
|
64
117
|
if (typeof handler === 'function') {
|
|
65
|
-
|
|
118
|
+
const collected = collectedMetadata.get(route.handlerName);
|
|
119
|
+
if (collected &&
|
|
120
|
+
(collected.paramMetadata.length > 0 || collected.hasLifecycleHooks)) {
|
|
121
|
+
// Wrap handler with parameter injection and lifecycle hooks
|
|
122
|
+
this.handlers[route.handlerName] = this.createWrappedHandler(handler.bind(this), collected);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Use original handler
|
|
126
|
+
this.handlers[route.handlerName] = handler.bind(this);
|
|
127
|
+
}
|
|
66
128
|
}
|
|
67
129
|
});
|
|
68
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Collects all decorator metadata for a single route.
|
|
133
|
+
* Merges class-level and method-level metadata.
|
|
134
|
+
*
|
|
135
|
+
* @param route - The route metadata from HTTP method decorator
|
|
136
|
+
* @returns Collected metadata from all decorators
|
|
137
|
+
*/
|
|
138
|
+
collectRouteMetadata(route) {
|
|
139
|
+
const constructor = this.constructor;
|
|
140
|
+
const handlerName = route.handlerName;
|
|
141
|
+
// Get auth metadata (merged class + method level)
|
|
142
|
+
const authMetadata = (0, auth_1.getEffectiveAuthMetadata)(constructor, handlerName);
|
|
143
|
+
// Get transaction metadata
|
|
144
|
+
const transactionMetadata = (0, transaction_1.getTransactionMetadata)(constructor, handlerName);
|
|
145
|
+
// Get middleware (merged class + method level)
|
|
146
|
+
const middleware = (0, middleware_1.getEffectiveMiddleware)(constructor, handlerName);
|
|
147
|
+
// Get handler args
|
|
148
|
+
const handlerArgs = (0, handler_args_1.getHandlerArgs)(constructor, handlerName);
|
|
149
|
+
// Get parameter injection metadata
|
|
150
|
+
const paramMetadata = (0, params_1.getParamMetadata)(constructor, handlerName);
|
|
151
|
+
// Check for lifecycle hooks
|
|
152
|
+
const hasHooks = (0, lifecycle_1.hasLifecycleHooks)(constructor, handlerName);
|
|
153
|
+
// Get raw JSON flag
|
|
154
|
+
const rawJson = (0, response_1.isRawJsonHandler)(constructor, handlerName) ||
|
|
155
|
+
route.options.rawJson === true;
|
|
156
|
+
// Build OpenAPI metadata
|
|
157
|
+
const openapi = this.buildOpenAPIMetadata(route, handlerName);
|
|
158
|
+
// Determine authentication requirements
|
|
159
|
+
// Method-level @Public overrides class-level @RequireAuth
|
|
160
|
+
const isPublic = authMetadata.isPublic === true;
|
|
161
|
+
const useAuth = !isPublic &&
|
|
162
|
+
(authMetadata.requireAuth === true || route.options.auth === true);
|
|
163
|
+
const useCryptoAuth = !isPublic &&
|
|
164
|
+
(authMetadata.requireCryptoAuth === true ||
|
|
165
|
+
route.options.cryptoAuth === true);
|
|
166
|
+
return {
|
|
167
|
+
method: route.method,
|
|
168
|
+
path: route.path,
|
|
169
|
+
handlerName,
|
|
170
|
+
useAuthentication: useAuth,
|
|
171
|
+
useCryptoAuthentication: useCryptoAuth,
|
|
172
|
+
isPublic,
|
|
173
|
+
authFailureStatusCode: authMetadata.failureStatusCode,
|
|
174
|
+
rawJsonHandler: rawJson,
|
|
175
|
+
useTransaction: transactionMetadata?.useTransaction ??
|
|
176
|
+
route.options.transaction ??
|
|
177
|
+
false,
|
|
178
|
+
transactionTimeout: transactionMetadata?.timeout ?? route.options.transactionTimeout,
|
|
179
|
+
middleware,
|
|
180
|
+
handlerArgs,
|
|
181
|
+
paramMetadata,
|
|
182
|
+
hasLifecycleHooks: hasHooks,
|
|
183
|
+
openapi,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Builds validation from route options and validation decorators.
|
|
188
|
+
*
|
|
189
|
+
* @param route - The route metadata
|
|
190
|
+
* @param collected - The collected metadata
|
|
191
|
+
* @param constants - Application constants
|
|
192
|
+
* @returns Validation chain or function
|
|
193
|
+
*/
|
|
194
|
+
buildValidation(route, collected, constants) {
|
|
195
|
+
// Get validation from decorators
|
|
196
|
+
const validationMetadata = (0, validation_1.getEffectiveValidationMetadata)(this.constructor, route.handlerName);
|
|
197
|
+
// Priority: decorator validation > route option validation > route option schema
|
|
198
|
+
let validation = route.options.validation;
|
|
199
|
+
// Check for validation decorator metadata
|
|
200
|
+
if (validationMetadata.body ||
|
|
201
|
+
validationMetadata.params ||
|
|
202
|
+
validationMetadata.query) {
|
|
203
|
+
// Build combined validation from decorator metadata
|
|
204
|
+
const validationChains = [];
|
|
205
|
+
let hasZodValidation = false;
|
|
206
|
+
const zodValidators = [];
|
|
207
|
+
// Process body validation
|
|
208
|
+
if (validationMetadata.body) {
|
|
209
|
+
const bodyValidation = validationMetadata.body;
|
|
210
|
+
if (bodyValidation instanceof zod_1.z.ZodType) {
|
|
211
|
+
const zodValidation = (0, zod_validation_1.zodToExpressValidator)(bodyValidation);
|
|
212
|
+
zodValidators.push(zodValidation);
|
|
213
|
+
hasZodValidation = true;
|
|
214
|
+
}
|
|
215
|
+
else if (Array.isArray(bodyValidation)) {
|
|
216
|
+
validationChains.push(...bodyValidation);
|
|
217
|
+
}
|
|
218
|
+
else if (typeof bodyValidation === 'function') {
|
|
219
|
+
// Language-aware validation function - will be handled separately
|
|
220
|
+
const context = { constants };
|
|
221
|
+
const originalValidation = bodyValidation;
|
|
222
|
+
validation = ((lang) => {
|
|
223
|
+
return originalValidation.call(context, lang);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Process params validation
|
|
228
|
+
if (validationMetadata.params) {
|
|
229
|
+
const paramsValidation = validationMetadata.params;
|
|
230
|
+
if (paramsValidation instanceof zod_1.z.ZodType) {
|
|
231
|
+
const zodValidation = (0, zod_validation_1.zodToExpressValidator)(paramsValidation);
|
|
232
|
+
zodValidators.push(zodValidation);
|
|
233
|
+
hasZodValidation = true;
|
|
234
|
+
}
|
|
235
|
+
else if (Array.isArray(paramsValidation)) {
|
|
236
|
+
validationChains.push(...paramsValidation);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Process query validation
|
|
240
|
+
if (validationMetadata.query) {
|
|
241
|
+
const queryValidation = validationMetadata.query;
|
|
242
|
+
if (queryValidation instanceof zod_1.z.ZodType) {
|
|
243
|
+
const zodValidation = (0, zod_validation_1.zodToExpressValidator)(queryValidation);
|
|
244
|
+
zodValidators.push(zodValidation);
|
|
245
|
+
hasZodValidation = true;
|
|
246
|
+
}
|
|
247
|
+
else if (Array.isArray(queryValidation)) {
|
|
248
|
+
validationChains.push(...queryValidation);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// If we have Zod validators, create a combined validation function
|
|
252
|
+
if (hasZodValidation) {
|
|
253
|
+
validation = (lang) => {
|
|
254
|
+
const chains = [...validationChains];
|
|
255
|
+
for (const zodValidator of zodValidators) {
|
|
256
|
+
chains.push(...zodValidator(lang));
|
|
257
|
+
}
|
|
258
|
+
return chains;
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
else if (validationChains.length > 0 && !validation) {
|
|
262
|
+
// If we have validation chains and no function validation, use the chains
|
|
263
|
+
validation = validationChains;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Bind validation function to preserve 'this' context and inject constants
|
|
267
|
+
if (typeof validation === 'function') {
|
|
268
|
+
const context = { constants };
|
|
269
|
+
const originalValidation = validation;
|
|
270
|
+
validation = ((lang) => {
|
|
271
|
+
return originalValidation.call(context, lang);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
// Convert Zod schema to validation if present and no validation yet
|
|
275
|
+
if (route.options.schema && !validation) {
|
|
276
|
+
const schemaValidation = (0, zod_validation_1.zodToExpressValidator)(route.options.schema);
|
|
277
|
+
if (Array.isArray(schemaValidation)) {
|
|
278
|
+
validation = schemaValidation;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
validation = (lang) => schemaValidation(lang);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return validation;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Builds OpenAPI metadata from all decorator sources.
|
|
288
|
+
*
|
|
289
|
+
* @param route - The route metadata
|
|
290
|
+
* @param handlerName - The handler method name
|
|
291
|
+
* @returns OpenAPI route metadata (partial)
|
|
292
|
+
*/
|
|
293
|
+
buildOpenAPIMetadata(route, handlerName) {
|
|
294
|
+
const constructor = this.constructor;
|
|
295
|
+
// Get OpenAPI metadata from decorators (merged class + method level)
|
|
296
|
+
const openApiMeta = (0, openapi_1.getEffectiveOpenAPIMetadata)(constructor, handlerName);
|
|
297
|
+
// Get response metadata
|
|
298
|
+
const responses = (0, response_1.getEffectiveResponseMetadata)(constructor, handlerName);
|
|
299
|
+
// Get OpenAPI parameters
|
|
300
|
+
const params = (0, openapi_params_1.getOpenAPIParams)(constructor, handlerName);
|
|
301
|
+
// Get request body metadata
|
|
302
|
+
const requestBodyMeta = (0, openapi_params_1.getRequestBodyMetadata)(constructor, handlerName);
|
|
303
|
+
// Start with route options openapi if present
|
|
304
|
+
const baseOpenApi = route.options.openapi ?? {};
|
|
305
|
+
// Build merged OpenAPI metadata
|
|
306
|
+
const openapi = {
|
|
307
|
+
...baseOpenApi,
|
|
308
|
+
};
|
|
309
|
+
// Merge decorator metadata
|
|
310
|
+
if (openApiMeta.summary) {
|
|
311
|
+
openapi.summary = openApiMeta.summary;
|
|
312
|
+
}
|
|
313
|
+
if (openApiMeta.description) {
|
|
314
|
+
openapi.description = openApiMeta.description;
|
|
315
|
+
}
|
|
316
|
+
if (openApiMeta.tags && openApiMeta.tags.length > 0) {
|
|
317
|
+
openapi.tags = [...(openapi.tags ?? []), ...openApiMeta.tags];
|
|
318
|
+
// Remove duplicates
|
|
319
|
+
openapi.tags = [...new Set(openapi.tags)];
|
|
320
|
+
}
|
|
321
|
+
if (openApiMeta.operationId) {
|
|
322
|
+
openapi.operationId = openApiMeta.operationId;
|
|
323
|
+
}
|
|
324
|
+
if (openApiMeta.deprecated !== undefined) {
|
|
325
|
+
openapi.deprecated = openApiMeta.deprecated;
|
|
326
|
+
}
|
|
327
|
+
// Merge parameters
|
|
328
|
+
if (params.length > 0) {
|
|
329
|
+
const existingParams = openapi.parameters ?? [];
|
|
330
|
+
const existingParamKeys = new Set(existingParams.map((p) => `${p.name}:${p.in}`));
|
|
331
|
+
const newParams = params.filter((p) => !existingParamKeys.has(`${p.name}:${p.in}`));
|
|
332
|
+
openapi.parameters = [...existingParams, ...newParams];
|
|
333
|
+
}
|
|
334
|
+
// Merge responses
|
|
335
|
+
if (responses.length > 0) {
|
|
336
|
+
const responsesObj = {};
|
|
337
|
+
for (const response of responses) {
|
|
338
|
+
const statusKey = String(response.statusCode);
|
|
339
|
+
if (!responsesObj[statusKey]) {
|
|
340
|
+
responsesObj[statusKey] = {
|
|
341
|
+
description: response.description ?? `Response ${response.statusCode}`,
|
|
342
|
+
...(response.schema && { schema: response.schema }),
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Merge with existing responses
|
|
347
|
+
openapi.responses = {
|
|
348
|
+
...(openapi.responses ?? {}),
|
|
349
|
+
...responsesObj,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
// Merge request body
|
|
353
|
+
if (requestBodyMeta) {
|
|
354
|
+
openapi.requestBody = (0, openapi_params_1.requestBodyMetadataToOpenAPI)(requestBodyMeta);
|
|
355
|
+
}
|
|
356
|
+
// Return undefined if no OpenAPI metadata
|
|
357
|
+
if (Object.keys(openapi).length === 0) {
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
360
|
+
return openapi;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Creates a wrapped handler with parameter injection and lifecycle hook execution.
|
|
364
|
+
*
|
|
365
|
+
* @param originalHandler - The original handler function
|
|
366
|
+
* @param collected - The collected metadata for this route
|
|
367
|
+
* @returns Wrapped handler function
|
|
368
|
+
*/
|
|
369
|
+
createWrappedHandler(originalHandler, collected) {
|
|
370
|
+
const constructor = this.constructor;
|
|
371
|
+
const handlerName = collected.handlerName;
|
|
372
|
+
// Use arrow function to capture 'this' lexically
|
|
373
|
+
return async (req, ...handlerArgs) => {
|
|
374
|
+
// Get response from the active context (set by base controller)
|
|
375
|
+
const res = this.res;
|
|
376
|
+
// Create lifecycle context
|
|
377
|
+
const lifecycleContext = {
|
|
378
|
+
req,
|
|
379
|
+
res,
|
|
380
|
+
};
|
|
381
|
+
try {
|
|
382
|
+
// Execute before hooks
|
|
383
|
+
if (collected.hasLifecycleHooks) {
|
|
384
|
+
await (0, lifecycle_1.executeBeforeHooks)(constructor, handlerName, lifecycleContext);
|
|
385
|
+
}
|
|
386
|
+
// Build injected parameters
|
|
387
|
+
let args;
|
|
388
|
+
if (collected.paramMetadata.length > 0) {
|
|
389
|
+
args = this.injectParameters(req, res, collected.paramMetadata);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
// No parameter injection - pass request and handler args
|
|
393
|
+
args = [req, ...handlerArgs];
|
|
394
|
+
}
|
|
395
|
+
// Call original handler
|
|
396
|
+
const result = await originalHandler(...args);
|
|
397
|
+
// Update lifecycle context with result
|
|
398
|
+
lifecycleContext.result = result;
|
|
399
|
+
// Execute onSuccess hooks
|
|
400
|
+
if (collected.hasLifecycleHooks) {
|
|
401
|
+
await (0, lifecycle_1.executeOnSuccessHooks)(constructor, handlerName, lifecycleContext);
|
|
402
|
+
}
|
|
403
|
+
// Execute after hooks
|
|
404
|
+
if (collected.hasLifecycleHooks) {
|
|
405
|
+
await (0, lifecycle_1.executeAfterHooks)(constructor, handlerName, lifecycleContext);
|
|
406
|
+
}
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
// Update lifecycle context with error
|
|
411
|
+
lifecycleContext.error = error;
|
|
412
|
+
// Execute onError hooks
|
|
413
|
+
if (collected.hasLifecycleHooks) {
|
|
414
|
+
await (0, lifecycle_1.executeOnErrorHooks)(constructor, handlerName, lifecycleContext);
|
|
415
|
+
}
|
|
416
|
+
// Execute after hooks (even on error)
|
|
417
|
+
if (collected.hasLifecycleHooks) {
|
|
418
|
+
await (0, lifecycle_1.executeAfterHooks)(constructor, handlerName, lifecycleContext);
|
|
419
|
+
}
|
|
420
|
+
// Re-throw the error
|
|
421
|
+
throw error;
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Injects parameters based on parameter decorator metadata.
|
|
427
|
+
*
|
|
428
|
+
* @param req - Express request object
|
|
429
|
+
* @param res - Express response object
|
|
430
|
+
* @param paramMetadata - Parameter metadata array
|
|
431
|
+
* @returns Array of injected parameter values
|
|
432
|
+
*/
|
|
433
|
+
injectParameters(req, res, paramMetadata) {
|
|
434
|
+
// Sort by index to ensure correct order
|
|
435
|
+
const sortedParams = [...paramMetadata].sort((a, b) => a.index - b.index);
|
|
436
|
+
// Build args array with gaps filled
|
|
437
|
+
const maxIndex = sortedParams.length > 0
|
|
438
|
+
? Math.max(...sortedParams.map((p) => p.index))
|
|
439
|
+
: -1;
|
|
440
|
+
const args = new Array(maxIndex + 1).fill(undefined);
|
|
441
|
+
for (const param of sortedParams) {
|
|
442
|
+
let value;
|
|
443
|
+
switch (param.type) {
|
|
444
|
+
case 'param':
|
|
445
|
+
value = param.name ? req.params[param.name] : req.params;
|
|
446
|
+
// Apply type coercion if schema specifies integer/number
|
|
447
|
+
if (param.options?.schema?.type === 'integer' ||
|
|
448
|
+
param.options?.schema?.type === 'number') {
|
|
449
|
+
value = Number(value);
|
|
450
|
+
}
|
|
451
|
+
break;
|
|
452
|
+
case 'body':
|
|
453
|
+
value = param.name ? req.body?.[param.name] : req.body;
|
|
454
|
+
break;
|
|
455
|
+
case 'query':
|
|
456
|
+
value = param.name ? req.query[param.name] : req.query;
|
|
457
|
+
// Apply type coercion if schema specifies integer/number
|
|
458
|
+
if (param.options?.schema?.type === 'integer' ||
|
|
459
|
+
param.options?.schema?.type === 'number') {
|
|
460
|
+
value = Number(value);
|
|
461
|
+
}
|
|
462
|
+
break;
|
|
463
|
+
case 'header':
|
|
464
|
+
value = param.name ? req.get(param.name) : req.headers;
|
|
465
|
+
break;
|
|
466
|
+
case 'user':
|
|
467
|
+
value = req.user;
|
|
468
|
+
break;
|
|
469
|
+
case 'eciesUser':
|
|
470
|
+
value = req.eciesUser;
|
|
471
|
+
break;
|
|
472
|
+
case 'req':
|
|
473
|
+
value = req;
|
|
474
|
+
break;
|
|
475
|
+
case 'res':
|
|
476
|
+
value = res;
|
|
477
|
+
break;
|
|
478
|
+
case 'next':
|
|
479
|
+
// Next function is not typically injected this way
|
|
480
|
+
// but we support it for completeness
|
|
481
|
+
value = undefined;
|
|
482
|
+
break;
|
|
483
|
+
default:
|
|
484
|
+
value = undefined;
|
|
485
|
+
}
|
|
486
|
+
args[param.index] = value;
|
|
487
|
+
}
|
|
488
|
+
return args;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Registers this controller with the ControllerRegistry for OpenAPI generation.
|
|
492
|
+
* Called automatically after route initialization.
|
|
493
|
+
*/
|
|
494
|
+
registerWithControllerRegistry() {
|
|
495
|
+
// Get controller metadata
|
|
496
|
+
const controllerMetadata = Reflect.getMetadata(controller_1.CONTROLLER_METADATA, this.constructor);
|
|
497
|
+
if (!controllerMetadata) {
|
|
498
|
+
// No controller metadata - skip registration
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const basePath = controllerMetadata.basePath;
|
|
502
|
+
const controllerName = controllerMetadata.name ?? this.constructor.name;
|
|
503
|
+
// Register with ControllerRegistry
|
|
504
|
+
registry_1.ControllerRegistry.register(basePath, controllerName, this.routeDefinitions);
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Gets the collected metadata for a specific route.
|
|
508
|
+
* Useful for testing and debugging.
|
|
509
|
+
*
|
|
510
|
+
* @param handlerName - The handler method name
|
|
511
|
+
* @returns Collected metadata or undefined
|
|
512
|
+
*/
|
|
513
|
+
getCollectedMetadata(handlerName) {
|
|
514
|
+
return this.getCollectedMetadataMap().get(handlerName);
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Gets all collected metadata.
|
|
518
|
+
* Useful for testing and debugging.
|
|
519
|
+
*
|
|
520
|
+
* @returns Map of handler names to collected metadata
|
|
521
|
+
*/
|
|
522
|
+
getAllCollectedMetadata() {
|
|
523
|
+
return new Map(this.getCollectedMetadataMap());
|
|
524
|
+
}
|
|
69
525
|
}
|
|
70
526
|
exports.DecoratorBaseController = DecoratorBaseController;
|
|
71
527
|
//# sourceMappingURL=base-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-controller.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite/src/decorators/base-controller.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,4BAA0B;AAC1B,8CAAqD;AAGrD,6CAIsB;AACtB,qDAAyD;AAGzD;;;;;GAKG;AACH,MAAsB,uBAGpB,SAAQ,qBAAgE;IACxE,YAAY,WAA8B;QACxC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,CAAC;IAES,oBAAoB;QAC5B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,4BAAe,EAAE,IAAI,CAAC,WAAW,CAAC;YACpE,EAAE,CAA+B,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QAE7C,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3C,IAAI,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAE1C,2EAA2E;YAC3E,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAsB,EAAE,SAAS,EAAE,CAAC;gBACjD,MAAM,kBAAkB,GAAG,UAAU,CAAC;gBACtC,UAAU,GAAG,CAAC,CAAC,IAAe,EAAE,EAAE;oBAChC,OACE,kBAID,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACxB,CAAC,CAAsB,CAAC;YAC1B,CAAC;YAED,8CAA8C;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,MAAM,gBAAgB,GAAG,IAAA,sCAAqB,EAC5C,KAAK,CAAC,OAAO,CAAC,MAAM,CACrB,CAAC;gBACF,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACpC,UAAU,GAAG,gBAAgB,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,CAAC,IAAe,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK;gBAC9C,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,IAAI,KAAK;gBAC1D,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU;gBACpC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK;gBAC9C,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK;gBAClD,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB;aACrD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,OAAO,GAAI,IAAgC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAjED,0DAiEC"}
|
|
1
|
+
{"version":3,"file":"base-controller.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite/src/decorators/base-controller.ts"],"names":[],"mappings":"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"}
|