@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.
Files changed (146) hide show
  1. package/README.md +858 -0
  2. package/package.json +1 -1
  3. package/src/controllers/openapi.d.ts +67 -0
  4. package/src/controllers/openapi.d.ts.map +1 -0
  5. package/src/controllers/openapi.js +89 -0
  6. package/src/controllers/openapi.js.map +1 -0
  7. package/src/decorators/auth.d.ts +128 -0
  8. package/src/decorators/auth.d.ts.map +1 -0
  9. package/src/decorators/auth.js +230 -0
  10. package/src/decorators/auth.js.map +1 -0
  11. package/src/decorators/base-controller.d.ts +144 -6
  12. package/src/decorators/base-controller.d.ts.map +1 -1
  13. package/src/decorators/base-controller.js +487 -31
  14. package/src/decorators/base-controller.js.map +1 -1
  15. package/src/decorators/controller.d.ts +63 -7
  16. package/src/decorators/controller.d.ts.map +1 -1
  17. package/src/decorators/controller.js +70 -39
  18. package/src/decorators/controller.js.map +1 -1
  19. package/src/decorators/handler-args.d.ts +68 -0
  20. package/src/decorators/handler-args.d.ts.map +1 -0
  21. package/src/decorators/handler-args.js +83 -0
  22. package/src/decorators/handler-args.js.map +1 -0
  23. package/src/decorators/http-methods.d.ts +143 -0
  24. package/src/decorators/http-methods.d.ts.map +1 -0
  25. package/src/decorators/http-methods.js +265 -0
  26. package/src/decorators/http-methods.js.map +1 -0
  27. package/src/decorators/index.d.ts +22 -0
  28. package/src/decorators/index.d.ts.map +1 -1
  29. package/src/decorators/index.js +56 -0
  30. package/src/decorators/index.js.map +1 -1
  31. package/src/decorators/lifecycle.d.ts +248 -0
  32. package/src/decorators/lifecycle.d.ts.map +1 -0
  33. package/src/decorators/lifecycle.js +301 -0
  34. package/src/decorators/lifecycle.js.map +1 -0
  35. package/src/decorators/metadata-collector.d.ts +175 -0
  36. package/src/decorators/metadata-collector.d.ts.map +1 -0
  37. package/src/decorators/metadata-collector.js +272 -0
  38. package/src/decorators/metadata-collector.js.map +1 -0
  39. package/src/decorators/metadata-keys.d.ts +121 -0
  40. package/src/decorators/metadata-keys.d.ts.map +1 -0
  41. package/src/decorators/metadata-keys.js +116 -0
  42. package/src/decorators/metadata-keys.js.map +1 -0
  43. package/src/decorators/middleware.d.ts +181 -0
  44. package/src/decorators/middleware.d.ts.map +1 -0
  45. package/src/decorators/middleware.js +400 -0
  46. package/src/decorators/middleware.js.map +1 -0
  47. package/src/decorators/openapi-params.d.ts +192 -0
  48. package/src/decorators/openapi-params.d.ts.map +1 -0
  49. package/src/decorators/openapi-params.js +332 -0
  50. package/src/decorators/openapi-params.js.map +1 -0
  51. package/src/decorators/openapi.d.ts +201 -0
  52. package/src/decorators/openapi.d.ts.map +1 -0
  53. package/src/decorators/openapi.js +334 -0
  54. package/src/decorators/openapi.js.map +1 -0
  55. package/src/decorators/params.d.ts +217 -0
  56. package/src/decorators/params.d.ts.map +1 -0
  57. package/src/decorators/params.js +323 -0
  58. package/src/decorators/params.js.map +1 -0
  59. package/src/decorators/response.d.ts +200 -0
  60. package/src/decorators/response.d.ts.map +1 -0
  61. package/src/decorators/response.js +315 -0
  62. package/src/decorators/response.js.map +1 -0
  63. package/src/decorators/schema.d.ts +99 -0
  64. package/src/decorators/schema.d.ts.map +1 -0
  65. package/src/decorators/schema.js +329 -0
  66. package/src/decorators/schema.js.map +1 -0
  67. package/src/decorators/transaction.d.ts +69 -0
  68. package/src/decorators/transaction.d.ts.map +1 -0
  69. package/src/decorators/transaction.js +80 -0
  70. package/src/decorators/transaction.js.map +1 -0
  71. package/src/decorators/validation.d.ts +188 -0
  72. package/src/decorators/validation.d.ts.map +1 -0
  73. package/src/decorators/validation.js +269 -0
  74. package/src/decorators/validation.js.map +1 -0
  75. package/src/decorators/zod-validation.d.ts +164 -4
  76. package/src/decorators/zod-validation.d.ts.map +1 -1
  77. package/src/decorators/zod-validation.js +692 -13
  78. package/src/decorators/zod-validation.js.map +1 -1
  79. package/src/index.d.ts +1 -0
  80. package/src/index.d.ts.map +1 -1
  81. package/src/index.js +1 -0
  82. package/src/index.js.map +1 -1
  83. package/src/interfaces/openApi/decoratorOptions.d.ts +760 -0
  84. package/src/interfaces/openApi/decoratorOptions.d.ts.map +1 -0
  85. package/src/interfaces/openApi/decoratorOptions.js +734 -0
  86. package/src/interfaces/openApi/decoratorOptions.js.map +1 -0
  87. package/src/interfaces/openApi/index.d.ts +1 -0
  88. package/src/interfaces/openApi/index.d.ts.map +1 -1
  89. package/src/interfaces/openApi/index.js +23 -0
  90. package/src/interfaces/openApi/index.js.map +1 -1
  91. package/src/interfaces/openApi/parameter.d.ts +2 -0
  92. package/src/interfaces/openApi/parameter.d.ts.map +1 -1
  93. package/src/interfaces/openApi/parameter.js +3 -1
  94. package/src/interfaces/openApi/parameter.js.map +1 -1
  95. package/src/interfaces/openApi/parameterSchema.d.ts +2 -0
  96. package/src/interfaces/openApi/parameterSchema.d.ts.map +1 -1
  97. package/src/interfaces/openApi/parameterSchema.js +3 -0
  98. package/src/interfaces/openApi/parameterSchema.js.map +1 -1
  99. package/src/openapi/builder.d.ts +249 -0
  100. package/src/openapi/builder.d.ts.map +1 -0
  101. package/src/openapi/builder.js +352 -0
  102. package/src/openapi/builder.js.map +1 -0
  103. package/src/openapi/controller.d.ts +153 -0
  104. package/src/openapi/controller.d.ts.map +1 -0
  105. package/src/openapi/controller.js +331 -0
  106. package/src/openapi/controller.js.map +1 -0
  107. package/src/openapi/index.d.ts +12 -0
  108. package/src/openapi/index.d.ts.map +1 -0
  109. package/src/openapi/index.js +20 -0
  110. package/src/openapi/index.js.map +1 -0
  111. package/src/openapi/markdown-generator.d.ts +52 -0
  112. package/src/openapi/markdown-generator.d.ts.map +1 -0
  113. package/src/openapi/markdown-generator.js +569 -0
  114. package/src/openapi/markdown-generator.js.map +1 -0
  115. package/src/openapi/middleware/index.d.ts +9 -0
  116. package/src/openapi/middleware/index.d.ts.map +1 -0
  117. package/src/openapi/middleware/index.js +15 -0
  118. package/src/openapi/middleware/index.js.map +1 -0
  119. package/src/openapi/middleware/redoc.d.ts +314 -0
  120. package/src/openapi/middleware/redoc.d.ts.map +1 -0
  121. package/src/openapi/middleware/redoc.js +181 -0
  122. package/src/openapi/middleware/redoc.js.map +1 -0
  123. package/src/openapi/middleware/swagger-ui.d.ts +123 -0
  124. package/src/openapi/middleware/swagger-ui.d.ts.map +1 -0
  125. package/src/openapi/middleware/swagger-ui.js +227 -0
  126. package/src/openapi/middleware/swagger-ui.js.map +1 -0
  127. package/src/openapi/schemas.d.ts +170 -0
  128. package/src/openapi/schemas.d.ts.map +1 -0
  129. package/src/openapi/schemas.js +340 -0
  130. package/src/openapi/schemas.js.map +1 -0
  131. package/src/registry/controller-registry.d.ts +78 -0
  132. package/src/registry/controller-registry.d.ts.map +1 -0
  133. package/src/registry/controller-registry.js +86 -0
  134. package/src/registry/controller-registry.js.map +1 -0
  135. package/src/registry/index.d.ts +2 -0
  136. package/src/registry/index.d.ts.map +1 -1
  137. package/src/registry/index.js +3 -1
  138. package/src/registry/index.js.map +1 -1
  139. package/src/routers/api.d.ts +2 -1
  140. package/src/routers/api.d.ts.map +1 -1
  141. package/src/routers/api.js +7 -1
  142. package/src/routers/api.js.map +1 -1
  143. package/src/types.d.ts +1 -0
  144. package/src/types.d.ts.map +1 -1
  145. package/src/types.js +1 -0
  146. package/src/types.js.map +1 -1
@@ -1,71 +1,527 @@
1
1
  "use strict";
2
2
  /**
3
- * @fileoverview Base controller with decorator support.
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
- * Abstract base controller with decorator support.
15
- * Automatically initializes routes from decorator metadata.
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
- let validation = route.options.validation;
29
- // Bind validation function to preserve 'this' context and inject constants
30
- if (typeof validation === 'function') {
31
- const context = { constants };
32
- const originalValidation = validation;
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
- useAuthentication: route.options.auth ?? false,
52
- useCryptoAuthentication: route.options.cryptoAuth ?? false,
101
+ handlerArgs: collected.handlerArgs,
102
+ useAuthentication: collected.useAuthentication,
103
+ useCryptoAuthentication: collected.useCryptoAuthentication,
104
+ authFailureStatusCode: collected.authFailureStatusCode,
53
105
  validation: validation,
54
- middleware: route.options.middleware,
55
- rawJsonHandler: route.options.rawJson ?? false,
56
- useTransaction: route.options.transaction ?? false,
57
- transactionTimeout: route.options.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
- this.handlers[route.handlerName] = handler.bind(this);
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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"}