@soulbatical/tetra-core 0.1.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.
Potentially problematic release.
This version of @soulbatical/tetra-core might be problematic. Click here for more details.
- package/dist/core/SupabaseUserClient.d.ts +14 -0
- package/dist/core/SupabaseUserClient.d.ts.map +1 -0
- package/dist/core/SupabaseUserClient.js +49 -0
- package/dist/core/SupabaseUserClient.js.map +1 -0
- package/dist/core/adminDb.d.ts +21 -0
- package/dist/core/adminDb.d.ts.map +1 -0
- package/dist/core/adminDb.js +43 -0
- package/dist/core/adminDb.js.map +1 -0
- package/dist/core/publicDb.d.ts +19 -0
- package/dist/core/publicDb.d.ts.map +1 -0
- package/dist/core/publicDb.js +29 -0
- package/dist/core/publicDb.js.map +1 -0
- package/dist/core/superadminDb.d.ts +29 -0
- package/dist/core/superadminDb.d.ts.map +1 -0
- package/dist/core/superadminDb.js +53 -0
- package/dist/core/superadminDb.js.map +1 -0
- package/dist/core/systemDb.d.ts +34 -0
- package/dist/core/systemDb.d.ts.map +1 -0
- package/dist/core/systemDb.js +64 -0
- package/dist/core/systemDb.js.map +1 -0
- package/dist/core/userDb.d.ts +22 -0
- package/dist/core/userDb.d.ts.map +1 -0
- package/dist/core/userDb.js +36 -0
- package/dist/core/userDb.js.map +1 -0
- package/dist/core/webhookDb.d.ts +16 -0
- package/dist/core/webhookDb.d.ts.map +1 -0
- package/dist/core/webhookDb.js +26 -0
- package/dist/core/webhookDb.js.map +1 -0
- package/dist/frontend/components/FeatureFilters.d.ts +81 -0
- package/dist/frontend/components/FeatureFilters.d.ts.map +1 -0
- package/dist/frontend/components/FeatureFilters.js +257 -0
- package/dist/frontend/components/FeatureFilters.js.map +1 -0
- package/dist/frontend/components/FeatureTable.d.ts +96 -0
- package/dist/frontend/components/FeatureTable.d.ts.map +1 -0
- package/dist/frontend/components/FeatureTable.js +279 -0
- package/dist/frontend/components/FeatureTable.js.map +1 -0
- package/dist/frontend/hooks/useFeature.d.ts +108 -0
- package/dist/frontend/hooks/useFeature.d.ts.map +1 -0
- package/dist/frontend/hooks/useFeature.js +354 -0
- package/dist/frontend/hooks/useFeature.js.map +1 -0
- package/dist/frontend/index.d.ts +17 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/dist/frontend/index.js +14 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/authMiddleware.d.ts +137 -0
- package/dist/middleware/authMiddleware.d.ts.map +1 -0
- package/dist/middleware/authMiddleware.js +292 -0
- package/dist/middleware/authMiddleware.js.map +1 -0
- package/dist/middleware/autoRegisterValidators.d.ts +31 -0
- package/dist/middleware/autoRegisterValidators.d.ts.map +1 -0
- package/dist/middleware/autoRegisterValidators.js +125 -0
- package/dist/middleware/autoRegisterValidators.js.map +1 -0
- package/dist/middleware/validateQueryParams.d.ts +62 -0
- package/dist/middleware/validateQueryParams.d.ts.map +1 -0
- package/dist/middleware/validateQueryParams.js +321 -0
- package/dist/middleware/validateQueryParams.js.map +1 -0
- package/dist/shared/controllers/BaseMutationController.d.ts +79 -0
- package/dist/shared/controllers/BaseMutationController.d.ts.map +1 -0
- package/dist/shared/controllers/BaseMutationController.js +241 -0
- package/dist/shared/controllers/BaseMutationController.js.map +1 -0
- package/dist/shared/controllers/BaseQueryController.d.ts +72 -0
- package/dist/shared/controllers/BaseQueryController.d.ts.map +1 -0
- package/dist/shared/controllers/BaseQueryController.js +375 -0
- package/dist/shared/controllers/BaseQueryController.js.map +1 -0
- package/dist/shared/controllers/FilterConfigController.d.ts +37 -0
- package/dist/shared/controllers/FilterConfigController.d.ts.map +1 -0
- package/dist/shared/controllers/FilterConfigController.js +94 -0
- package/dist/shared/controllers/FilterConfigController.js.map +1 -0
- package/dist/shared/controllers/index.d.ts +5 -0
- package/dist/shared/controllers/index.d.ts.map +1 -0
- package/dist/shared/controllers/index.js +4 -0
- package/dist/shared/controllers/index.js.map +1 -0
- package/dist/shared/controllers/types.d.ts +57 -0
- package/dist/shared/controllers/types.d.ts.map +1 -0
- package/dist/shared/controllers/types.js +2 -0
- package/dist/shared/controllers/types.js.map +1 -0
- package/dist/shared/factories/BatchRouteFactory.d.ts +33 -0
- package/dist/shared/factories/BatchRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/BatchRouteFactory.js +54 -0
- package/dist/shared/factories/BatchRouteFactory.js.map +1 -0
- package/dist/shared/factories/MutationRouteFactory.d.ts +27 -0
- package/dist/shared/factories/MutationRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/MutationRouteFactory.js +39 -0
- package/dist/shared/factories/MutationRouteFactory.js.map +1 -0
- package/dist/shared/factories/PhaseRouteFactory.d.ts +33 -0
- package/dist/shared/factories/PhaseRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/PhaseRouteFactory.js +67 -0
- package/dist/shared/factories/PhaseRouteFactory.js.map +1 -0
- package/dist/shared/factories/QueryRouteFactory.d.ts +37 -0
- package/dist/shared/factories/QueryRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/QueryRouteFactory.js +244 -0
- package/dist/shared/factories/QueryRouteFactory.js.map +1 -0
- package/dist/shared/factories/QueryServiceFactory.d.ts +282 -0
- package/dist/shared/factories/QueryServiceFactory.d.ts.map +1 -0
- package/dist/shared/factories/QueryServiceFactory.js +277 -0
- package/dist/shared/factories/QueryServiceFactory.js.map +1 -0
- package/dist/shared/factories/index.d.ts +8 -0
- package/dist/shared/factories/index.d.ts.map +1 -0
- package/dist/shared/factories/index.js +6 -0
- package/dist/shared/factories/index.js.map +1 -0
- package/dist/shared/factories/types.d.ts +98 -0
- package/dist/shared/factories/types.d.ts.map +1 -0
- package/dist/shared/factories/types.js +8 -0
- package/dist/shared/factories/types.js.map +1 -0
- package/dist/shared/ownership/types.d.ts +84 -0
- package/dist/shared/ownership/types.d.ts.map +1 -0
- package/dist/shared/ownership/types.js +8 -0
- package/dist/shared/ownership/types.js.map +1 -0
- package/dist/shared/rfc7807ErrorResponse.d.ts +54 -0
- package/dist/shared/rfc7807ErrorResponse.d.ts.map +1 -0
- package/dist/shared/rfc7807ErrorResponse.js +98 -0
- package/dist/shared/rfc7807ErrorResponse.js.map +1 -0
- package/dist/shared/services/BaseCronService.d.ts +171 -0
- package/dist/shared/services/BaseCronService.d.ts.map +1 -0
- package/dist/shared/services/BaseCronService.js +444 -0
- package/dist/shared/services/BaseCronService.js.map +1 -0
- package/dist/shared/services/BasePhaseService.d.ts +170 -0
- package/dist/shared/services/BasePhaseService.d.ts.map +1 -0
- package/dist/shared/services/BasePhaseService.js +409 -0
- package/dist/shared/services/BasePhaseService.js.map +1 -0
- package/dist/shared/services/CronRegistry.d.ts +67 -0
- package/dist/shared/services/CronRegistry.d.ts.map +1 -0
- package/dist/shared/services/CronRegistry.js +68 -0
- package/dist/shared/services/CronRegistry.js.map +1 -0
- package/dist/shared/services/SimpleRPCQueryService.d.ts +111 -0
- package/dist/shared/services/SimpleRPCQueryService.d.ts.map +1 -0
- package/dist/shared/services/SimpleRPCQueryService.js +265 -0
- package/dist/shared/services/SimpleRPCQueryService.js.map +1 -0
- package/dist/shared/types/feature-config.d.ts +611 -0
- package/dist/shared/types/feature-config.d.ts.map +1 -0
- package/dist/shared/types/feature-config.js +85 -0
- package/dist/shared/types/feature-config.js.map +1 -0
- package/dist/shared/types/query-config.d.ts +41 -0
- package/dist/shared/types/query-config.d.ts.map +1 -0
- package/dist/shared/types/query-config.js +6 -0
- package/dist/shared/types/query-config.js.map +1 -0
- package/dist/shared/utils/config-driven-filters.d.ts +215 -0
- package/dist/shared/utils/config-driven-filters.d.ts.map +1 -0
- package/dist/shared/utils/config-driven-filters.js +451 -0
- package/dist/shared/utils/config-driven-filters.js.map +1 -0
- package/dist/shared/utils/controllerErrorHandler.d.ts +44 -0
- package/dist/shared/utils/controllerErrorHandler.d.ts.map +1 -0
- package/dist/shared/utils/controllerErrorHandler.js +126 -0
- package/dist/shared/utils/controllerErrorHandler.js.map +1 -0
- package/dist/shared/utils/parseInclude.d.ts +14 -0
- package/dist/shared/utils/parseInclude.d.ts.map +1 -0
- package/dist/shared/utils/parseInclude.js +28 -0
- package/dist/shared/utils/parseInclude.js.map +1 -0
- package/dist/shared/utils/queryHelpers.d.ts +62 -0
- package/dist/shared/utils/queryHelpers.d.ts.map +1 -0
- package/dist/shared/utils/queryHelpers.js +61 -0
- package/dist/shared/utils/queryHelpers.js.map +1 -0
- package/dist/shared/utils/response-mapper.d.ts +42 -0
- package/dist/shared/utils/response-mapper.d.ts.map +1 -0
- package/dist/shared/utils/response-mapper.js +176 -0
- package/dist/shared/utils/response-mapper.js.map +1 -0
- package/dist/shared/utils/responseBuilder.d.ts +103 -0
- package/dist/shared/utils/responseBuilder.d.ts.map +1 -0
- package/dist/shared/utils/responseBuilder.js +131 -0
- package/dist/shared/utils/responseBuilder.js.map +1 -0
- package/dist/shared/validators/featureConfigValidator.d.ts +23 -0
- package/dist/shared/validators/featureConfigValidator.d.ts.map +1 -0
- package/dist/shared/validators/featureConfigValidator.js +143 -0
- package/dist/shared/validators/featureConfigValidator.js.map +1 -0
- package/dist/shared/validators/organizationValidator.d.ts +53 -0
- package/dist/shared/validators/organizationValidator.d.ts.map +1 -0
- package/dist/shared/validators/organizationValidator.js +69 -0
- package/dist/shared/validators/organizationValidator.js.map +1 -0
- package/dist/shared/validators/uuidValidator.d.ts +57 -0
- package/dist/shared/validators/uuidValidator.d.ts.map +1 -0
- package/dist/shared/validators/uuidValidator.js +77 -0
- package/dist/shared/validators/uuidValidator.js.map +1 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates batch operation routes for features:
|
|
5
|
+
* - POST /batch/{path} - Execute batch operation
|
|
6
|
+
*
|
|
7
|
+
* Supports multiple HTTP methods (POST, PUT, PATCH, DELETE)
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const controller = new AdminVoucherController();
|
|
11
|
+
* addBatchRoutes(router, {
|
|
12
|
+
* operations: [
|
|
13
|
+
* {
|
|
14
|
+
* path: 'create-vouchers',
|
|
15
|
+
* handler: (req, res) => controller.createBatchVouchers(req, res)
|
|
16
|
+
* },
|
|
17
|
+
* {
|
|
18
|
+
* path: 'preview-vouchers',
|
|
19
|
+
* handler: (req, res) => controller.previewBatchVouchers(req, res)
|
|
20
|
+
* }
|
|
21
|
+
* ]
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
import { Router } from 'express';
|
|
25
|
+
import { BatchRouteConfig } from './types.js';
|
|
26
|
+
/**
|
|
27
|
+
* Add batch operation routes to a router
|
|
28
|
+
*
|
|
29
|
+
* @param router - Express router instance
|
|
30
|
+
* @param config - Batch route configuration
|
|
31
|
+
*/
|
|
32
|
+
export declare function addBatchRoutes(router: Router, config: BatchRouteConfig): void;
|
|
33
|
+
//# sourceMappingURL=BatchRouteFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchRouteFactory.d.ts","sourceRoot":"","sources":["../../../src/shared/factories/BatchRouteFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAyB7E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates batch operation routes for features:
|
|
5
|
+
* - POST /batch/{path} - Execute batch operation
|
|
6
|
+
*
|
|
7
|
+
* Supports multiple HTTP methods (POST, PUT, PATCH, DELETE)
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const controller = new AdminVoucherController();
|
|
11
|
+
* addBatchRoutes(router, {
|
|
12
|
+
* operations: [
|
|
13
|
+
* {
|
|
14
|
+
* path: 'create-vouchers',
|
|
15
|
+
* handler: (req, res) => controller.createBatchVouchers(req, res)
|
|
16
|
+
* },
|
|
17
|
+
* {
|
|
18
|
+
* path: 'preview-vouchers',
|
|
19
|
+
* handler: (req, res) => controller.previewBatchVouchers(req, res)
|
|
20
|
+
* }
|
|
21
|
+
* ]
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Add batch operation routes to a router
|
|
26
|
+
*
|
|
27
|
+
* @param router - Express router instance
|
|
28
|
+
* @param config - Batch route configuration
|
|
29
|
+
*/
|
|
30
|
+
export function addBatchRoutes(router, config) {
|
|
31
|
+
const { operations } = config;
|
|
32
|
+
// Register each batch operation
|
|
33
|
+
operations.forEach(operation => {
|
|
34
|
+
const { path, handler, method = 'POST' } = operation;
|
|
35
|
+
const fullPath = `/batch/${path}`;
|
|
36
|
+
switch (method) {
|
|
37
|
+
case 'POST':
|
|
38
|
+
router.post(fullPath, handler);
|
|
39
|
+
break;
|
|
40
|
+
case 'PUT':
|
|
41
|
+
router.put(fullPath, handler);
|
|
42
|
+
break;
|
|
43
|
+
case 'PATCH':
|
|
44
|
+
router.patch(fullPath, handler);
|
|
45
|
+
break;
|
|
46
|
+
case 'DELETE':
|
|
47
|
+
router.delete(fullPath, handler);
|
|
48
|
+
break;
|
|
49
|
+
default:
|
|
50
|
+
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=BatchRouteFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchRouteFactory.js","sourceRoot":"","sources":["../../../src/shared/factories/BatchRouteFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,MAAwB;IACrE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAE9B,gCAAgC;IAChC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC7B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;QACrD,MAAM,QAAQ,GAAG,UAAU,IAAI,EAAE,CAAC;QAElC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACjC,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutation Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates standard mutation routes for features:
|
|
5
|
+
* - POST / - Create new record
|
|
6
|
+
* - PUT /:id - Update existing record
|
|
7
|
+
* - DELETE /:id - Delete record
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const controller = new AdminVoucherController();
|
|
11
|
+
* addMutationRoutes(router, {
|
|
12
|
+
* controller,
|
|
13
|
+
* createMethod: 'createVoucher',
|
|
14
|
+
* updateMethod: 'updateVoucher',
|
|
15
|
+
* deleteMethod: 'deleteVoucher'
|
|
16
|
+
* });
|
|
17
|
+
*/
|
|
18
|
+
import { Router } from 'express';
|
|
19
|
+
import { MutationRouteConfig } from './types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Add standard mutation routes to a router
|
|
22
|
+
*
|
|
23
|
+
* @param router - Express router instance
|
|
24
|
+
* @param config - Mutation route configuration
|
|
25
|
+
*/
|
|
26
|
+
export declare function addMutationRoutes(router: Router, config: MutationRouteConfig): void;
|
|
27
|
+
//# sourceMappingURL=MutationRouteFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MutationRouteFactory.d.ts","sourceRoot":"","sources":["../../../src/shared/factories/MutationRouteFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAsBnF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutation Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates standard mutation routes for features:
|
|
5
|
+
* - POST / - Create new record
|
|
6
|
+
* - PUT /:id - Update existing record
|
|
7
|
+
* - DELETE /:id - Delete record
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const controller = new AdminVoucherController();
|
|
11
|
+
* addMutationRoutes(router, {
|
|
12
|
+
* controller,
|
|
13
|
+
* createMethod: 'createVoucher',
|
|
14
|
+
* updateMethod: 'updateVoucher',
|
|
15
|
+
* deleteMethod: 'deleteVoucher'
|
|
16
|
+
* });
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Add standard mutation routes to a router
|
|
20
|
+
*
|
|
21
|
+
* @param router - Express router instance
|
|
22
|
+
* @param config - Mutation route configuration
|
|
23
|
+
*/
|
|
24
|
+
export function addMutationRoutes(router, config) {
|
|
25
|
+
const { controller, createMethod, updateMethod, deleteMethod } = config;
|
|
26
|
+
// POST / - Create new record
|
|
27
|
+
if (createMethod && typeof controller[createMethod] === 'function') {
|
|
28
|
+
router.post('/', (req, res) => controller[createMethod](req, res));
|
|
29
|
+
}
|
|
30
|
+
// PUT /:id - Update existing record
|
|
31
|
+
if (updateMethod && typeof controller[updateMethod] === 'function') {
|
|
32
|
+
router.put('/:id', (req, res) => controller[updateMethod](req, res));
|
|
33
|
+
}
|
|
34
|
+
// DELETE /:id - Delete record
|
|
35
|
+
if (deleteMethod && typeof controller[deleteMethod] === 'function') {
|
|
36
|
+
router.delete('/:id', (req, res) => controller[deleteMethod](req, res));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=MutationRouteFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MutationRouteFactory.js","sourceRoot":"","sources":["../../../src/shared/factories/MutationRouteFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAA2B;IAC3E,MAAM,EACJ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,GAAG,MAAM,CAAC;IAEX,6BAA6B;IAC7B,IAAI,YAAY,IAAI,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,UAAU,EAAE,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,oCAAoC;IACpC,IAAI,YAAY,IAAI,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,UAAU,EAAE,CAAC;QACnE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,8BAA8B;IAC9B,IAAI,YAAY,IAAI,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,UAAU,EAAE,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates standard phase routes for features with workflow phases:
|
|
5
|
+
* - GET /phases/statistics - Phase statistics
|
|
6
|
+
* - GET /phases/conflicts - Phase conflicts
|
|
7
|
+
* - GET /phases/info - Phase information
|
|
8
|
+
* - POST /phases/refresh-phase/:id - Refresh single phase
|
|
9
|
+
* - POST /refresh-all-phases - Refresh all phases (batch)
|
|
10
|
+
* - POST /refresh-conflicted-phases - Refresh conflicted phases (batch)
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* addPhaseRoutes(router, {
|
|
14
|
+
* featureConfig: ordersFeatureConfig,
|
|
15
|
+
* controller: AdminOrderPhaseController,
|
|
16
|
+
* enableStatistics: true,
|
|
17
|
+
* enableConflicts: true,
|
|
18
|
+
* enableInfo: true,
|
|
19
|
+
* enableSingleRefresh: true,
|
|
20
|
+
* enableBatchRefresh: true,
|
|
21
|
+
* enableConflictedRefresh: true
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
import { Router } from 'express';
|
|
25
|
+
import { PhaseRouteConfig } from './types.js';
|
|
26
|
+
/**
|
|
27
|
+
* Add standard phase routes to a router
|
|
28
|
+
*
|
|
29
|
+
* @param router - Express router instance
|
|
30
|
+
* @param config - Phase route configuration
|
|
31
|
+
*/
|
|
32
|
+
export declare function addPhaseRoutes(router: Router, config: PhaseRouteConfig): void;
|
|
33
|
+
//# sourceMappingURL=PhaseRouteFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseRouteFactory.d.ts","sourceRoot":"","sources":["../../../src/shared/factories/PhaseRouteFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAuD7E"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates standard phase routes for features with workflow phases:
|
|
5
|
+
* - GET /phases/statistics - Phase statistics
|
|
6
|
+
* - GET /phases/conflicts - Phase conflicts
|
|
7
|
+
* - GET /phases/info - Phase information
|
|
8
|
+
* - POST /phases/refresh-phase/:id - Refresh single phase
|
|
9
|
+
* - POST /refresh-all-phases - Refresh all phases (batch)
|
|
10
|
+
* - POST /refresh-conflicted-phases - Refresh conflicted phases (batch)
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* addPhaseRoutes(router, {
|
|
14
|
+
* featureConfig: ordersFeatureConfig,
|
|
15
|
+
* controller: AdminOrderPhaseController,
|
|
16
|
+
* enableStatistics: true,
|
|
17
|
+
* enableConflicts: true,
|
|
18
|
+
* enableInfo: true,
|
|
19
|
+
* enableSingleRefresh: true,
|
|
20
|
+
* enableBatchRefresh: true,
|
|
21
|
+
* enableConflictedRefresh: true
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
import { Router } from 'express';
|
|
25
|
+
/**
|
|
26
|
+
* Add standard phase routes to a router
|
|
27
|
+
*
|
|
28
|
+
* @param router - Express router instance
|
|
29
|
+
* @param config - Phase route configuration
|
|
30
|
+
*/
|
|
31
|
+
export function addPhaseRoutes(router, config) {
|
|
32
|
+
const { controller, enableStatistics = true, enableConflicts = true, enableInfo = true, enableHealth = false, enableSingleRefresh = true, enableBatchRefresh = true, enableConflictedRefresh = true, singleRefreshMethod = 'refreshSinglePhase' } = config;
|
|
33
|
+
// Create sub-router for phase endpoints mounted at /phases
|
|
34
|
+
const phaseRouter = Router();
|
|
35
|
+
// GET /phases/statistics - Phase statistics
|
|
36
|
+
if (enableStatistics && typeof controller.getPhaseStatistics === 'function') {
|
|
37
|
+
phaseRouter.get('/statistics', controller.getPhaseStatistics);
|
|
38
|
+
}
|
|
39
|
+
// GET /phases/conflicts - Phase conflicts
|
|
40
|
+
if (enableConflicts && typeof controller.getPhaseConflicts === 'function') {
|
|
41
|
+
phaseRouter.get('/conflicts', controller.getPhaseConflicts);
|
|
42
|
+
}
|
|
43
|
+
// GET /phases/info - Phase information
|
|
44
|
+
if (enableInfo && typeof controller.getPhaseInfo === 'function') {
|
|
45
|
+
phaseRouter.get('/info', controller.getPhaseInfo);
|
|
46
|
+
}
|
|
47
|
+
// GET /phases/health - Phase health
|
|
48
|
+
if (enableHealth && typeof controller.getPhaseHealth === 'function') {
|
|
49
|
+
phaseRouter.get('/health', controller.getPhaseHealth);
|
|
50
|
+
}
|
|
51
|
+
// POST /phases/refresh-phase/:id - Refresh single phase (custom method name support)
|
|
52
|
+
if (enableSingleRefresh && typeof controller[singleRefreshMethod] === 'function') {
|
|
53
|
+
phaseRouter.post('/refresh-phase/:id', controller[singleRefreshMethod]);
|
|
54
|
+
}
|
|
55
|
+
// Mount phase sub-router at /phases
|
|
56
|
+
router.use('/phases', phaseRouter);
|
|
57
|
+
// Batch operations are mounted directly on parent router (not under /phases)
|
|
58
|
+
// POST /refresh-all-phases - Refresh all phases (batch)
|
|
59
|
+
if (enableBatchRefresh && typeof controller.refreshAllPhases === 'function') {
|
|
60
|
+
router.post('/refresh-all-phases', controller.refreshAllPhases);
|
|
61
|
+
}
|
|
62
|
+
// POST /refresh-conflicted-phases - Refresh conflicted phases (batch)
|
|
63
|
+
if (enableConflictedRefresh && typeof controller.refreshConflictedPhases === 'function') {
|
|
64
|
+
router.post('/refresh-conflicted-phases', controller.refreshConflictedPhases);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=PhaseRouteFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseRouteFactory.js","sourceRoot":"","sources":["../../../src/shared/factories/PhaseRouteFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,MAAwB;IACrE,MAAM,EACJ,UAAU,EACV,gBAAgB,GAAG,IAAI,EACvB,eAAe,GAAG,IAAI,EACtB,UAAU,GAAG,IAAI,EACjB,YAAY,GAAG,KAAK,EACpB,mBAAmB,GAAG,IAAI,EAC1B,kBAAkB,GAAG,IAAI,EACzB,uBAAuB,GAAG,IAAI,EAC9B,mBAAmB,GAAG,oBAAoB,EAC3C,GAAG,MAAM,CAAC;IAEX,2DAA2D;IAC3D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;IAE7B,4CAA4C;IAC5C,IAAI,gBAAgB,IAAI,OAAO,UAAU,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;QAC5E,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAChE,CAAC;IAED,0CAA0C;IAC1C,IAAI,eAAe,IAAI,OAAO,UAAU,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;QAC1E,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC9D,CAAC;IAED,uCAAuC;IACvC,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAChE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,oCAAoC;IACpC,IAAI,YAAY,IAAI,OAAO,UAAU,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QACpE,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC;IAED,qFAAqF;IACrF,IAAI,mBAAmB,IAAI,OAAO,UAAU,CAAC,mBAAmB,CAAC,KAAK,UAAU,EAAE,CAAC;QACjF,WAAW,CAAC,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,oCAAoC;IACpC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEnC,6EAA6E;IAE7E,wDAAwD;IACxD,IAAI,kBAAkB,IAAI,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAED,sEAAsE;IACtE,IAAI,uBAAuB,IAAI,OAAO,UAAU,CAAC,uBAAuB,KAAK,UAAU,EAAE,CAAC;QACxF,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates standard query routes for features following the Simple RPC Pattern:
|
|
5
|
+
* - GET /filters - Filter configurations (AutoFilter)
|
|
6
|
+
* - GET /counts - Counts for filters
|
|
7
|
+
* - GET /by-ids - Get multiple records by IDs (cross-feature navigation)
|
|
8
|
+
* - GET / - List with pagination, filtering, search
|
|
9
|
+
* - GET /:id - Single record by ID
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* addQueryRoutes(router, {
|
|
13
|
+
* featureConfig: vouchersFeatureConfig,
|
|
14
|
+
* controller: AdminVoucherQueryController,
|
|
15
|
+
* filterController: AdminVoucherFilterController,
|
|
16
|
+
* customValidators: { include: (v) => v ? v.split(',') : [] }
|
|
17
|
+
* });
|
|
18
|
+
*/
|
|
19
|
+
import { Router } from 'express';
|
|
20
|
+
import { QueryRouteConfig } from './types.js';
|
|
21
|
+
interface FactoryWarning {
|
|
22
|
+
feature: string;
|
|
23
|
+
route: string;
|
|
24
|
+
expectedMethod: string;
|
|
25
|
+
availableMethods: string[];
|
|
26
|
+
timestamp: Date;
|
|
27
|
+
}
|
|
28
|
+
export declare function getFactoryWarnings(): FactoryWarning[];
|
|
29
|
+
/**
|
|
30
|
+
* Add standard query routes to a router
|
|
31
|
+
*
|
|
32
|
+
* @param router - Express router instance
|
|
33
|
+
* @param config - Query route configuration
|
|
34
|
+
*/
|
|
35
|
+
export declare function addQueryRoutes(router: Router, config: QueryRouteConfig): void;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=QueryRouteFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryRouteFactory.d.ts","sourceRoot":"","sources":["../../../src/shared/factories/QueryRouteFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9C,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,IAAI,CAAC;CACjB;AAID,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAmO7E"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Route Factory
|
|
3
|
+
*
|
|
4
|
+
* Generates standard query routes for features following the Simple RPC Pattern:
|
|
5
|
+
* - GET /filters - Filter configurations (AutoFilter)
|
|
6
|
+
* - GET /counts - Counts for filters
|
|
7
|
+
* - GET /by-ids - Get multiple records by IDs (cross-feature navigation)
|
|
8
|
+
* - GET / - List with pagination, filtering, search
|
|
9
|
+
* - GET /:id - Single record by ID
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* addQueryRoutes(router, {
|
|
13
|
+
* featureConfig: vouchersFeatureConfig,
|
|
14
|
+
* controller: AdminVoucherQueryController,
|
|
15
|
+
* filterController: AdminVoucherFilterController,
|
|
16
|
+
* customValidators: { include: (v) => v ? v.split(',') : [] }
|
|
17
|
+
* });
|
|
18
|
+
*/
|
|
19
|
+
import { validateQueryParams } from '../../middleware/validateQueryParams.js';
|
|
20
|
+
import { validateFeatureConfig } from '../validators/featureConfigValidator.js';
|
|
21
|
+
const factoryWarnings = [];
|
|
22
|
+
export function getFactoryWarnings() {
|
|
23
|
+
return factoryWarnings;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Add standard query routes to a router
|
|
27
|
+
*
|
|
28
|
+
* @param router - Express router instance
|
|
29
|
+
* @param config - Query route configuration
|
|
30
|
+
*/
|
|
31
|
+
export function addQueryRoutes(router, config) {
|
|
32
|
+
const { featureConfig, controller, filterController, customValidators = {}, allowedFields, maxLimit = 50000, defaultLimit = 50, allowSearch = true, singleMethod: customSingleMethod } = config;
|
|
33
|
+
// 🔍 VALIDATE FEATURE CONFIG (fail-fast on startup!)
|
|
34
|
+
// This throws on validation errors - intentionally not catching to fail startup
|
|
35
|
+
validateFeatureConfig(featureConfig, featureConfig.tableName);
|
|
36
|
+
// GET /filters - Filter configurations for AutoFilter
|
|
37
|
+
if (filterController && typeof filterController.getFilters === 'function') {
|
|
38
|
+
router.get('/filters', filterController.getFilters);
|
|
39
|
+
}
|
|
40
|
+
else if (!filterController) {
|
|
41
|
+
// 🚨 CRITICAL: Missing filterController - GeneratedPage will NOT work!
|
|
42
|
+
const warning = {
|
|
43
|
+
feature: featureConfig.tableName,
|
|
44
|
+
route: '/filters',
|
|
45
|
+
expectedMethod: 'filterController.getFilters',
|
|
46
|
+
availableMethods: [],
|
|
47
|
+
timestamp: new Date()
|
|
48
|
+
};
|
|
49
|
+
factoryWarnings.push(warning);
|
|
50
|
+
console.error('\n' + '='.repeat(80));
|
|
51
|
+
console.error('🚨 CRITICAL: Missing FilterController!');
|
|
52
|
+
console.error('='.repeat(80));
|
|
53
|
+
console.error(`Feature: ${featureConfig.tableName}`);
|
|
54
|
+
console.error(`Route: GET /filters (for AutoFilter + GeneratedPage)`);
|
|
55
|
+
console.error(`Problem: filterController parameter is missing!`);
|
|
56
|
+
console.error('');
|
|
57
|
+
console.error('💡 Fix:');
|
|
58
|
+
console.error(' 1. Create controller/AdminXxxFilterController.ts:');
|
|
59
|
+
console.error(' ```typescript');
|
|
60
|
+
console.error(' import { createFilterConfigController } from \'../../../shared/controllers/FilterConfigController\';');
|
|
61
|
+
console.error(` import { ${featureConfig.tableName}FeatureConfig } from '../config/${featureConfig.tableName}.config.js';`);
|
|
62
|
+
console.error(' ');
|
|
63
|
+
console.error(' export const Admin' + capitalize(featureConfig.tableName) + 'FilterController = createFilterConfigController(');
|
|
64
|
+
console.error(` ${featureConfig.tableName}FeatureConfig,`);
|
|
65
|
+
console.error(` '${featureConfig.tableName}'`);
|
|
66
|
+
console.error(' );');
|
|
67
|
+
console.error(' ```');
|
|
68
|
+
console.error('');
|
|
69
|
+
console.error(' 2. Update routes/adminRoutes.ts:');
|
|
70
|
+
console.error(' ```typescript');
|
|
71
|
+
console.error(` import { Admin${capitalize(featureConfig.tableName)}FilterController } from '../controllers/Admin${capitalize(featureConfig.tableName)}FilterController.js';`);
|
|
72
|
+
console.error(' ');
|
|
73
|
+
console.error(' addQueryRoutes(router, {');
|
|
74
|
+
console.error(` featureConfig: ${featureConfig.tableName}FeatureConfig,`);
|
|
75
|
+
console.error(` controller: Admin${capitalize(featureConfig.tableName)}QueryController,`);
|
|
76
|
+
console.error(` filterController: Admin${capitalize(featureConfig.tableName)}FilterController // ← ADD THIS!`);
|
|
77
|
+
console.error(' });');
|
|
78
|
+
console.error(' ```');
|
|
79
|
+
console.error('');
|
|
80
|
+
console.error('📖 Reference: /backend/src/features/orders/');
|
|
81
|
+
console.error(' - controllers/AdminOrderFilterController.ts (4 lines!)');
|
|
82
|
+
console.error(' - routes/adminRoutes.ts (line 28)');
|
|
83
|
+
console.error('');
|
|
84
|
+
console.error('⚠️ IMPACT: GET /api/admin/' + featureConfig.tableName + '/filters will return 404');
|
|
85
|
+
console.error('⚠️ Frontend GeneratedPage will show "Failed to load page configuration"');
|
|
86
|
+
console.error('⚠️ AutoFilter components will not render');
|
|
87
|
+
console.error('='.repeat(80) + '\n');
|
|
88
|
+
}
|
|
89
|
+
else if (!filterController.getFilters) {
|
|
90
|
+
// FilterController exists but missing getFilters method
|
|
91
|
+
const warning = {
|
|
92
|
+
feature: featureConfig.tableName,
|
|
93
|
+
route: '/filters',
|
|
94
|
+
expectedMethod: 'getFilters',
|
|
95
|
+
availableMethods: Object.getOwnPropertyNames(filterController).filter(m => typeof filterController[m] === 'function'),
|
|
96
|
+
timestamp: new Date()
|
|
97
|
+
};
|
|
98
|
+
factoryWarnings.push(warning);
|
|
99
|
+
console.warn(`⚠️ QueryRouteFactory [${featureConfig.tableName}]: FilterController missing 'getFilters' method`);
|
|
100
|
+
console.warn(` Expected: filterController.getFilters`);
|
|
101
|
+
console.warn(` Available: ${warning.availableMethods.join(', ')}`);
|
|
102
|
+
}
|
|
103
|
+
// GET /by-ids - Get multiple records by IDs
|
|
104
|
+
// ⚠️ MUST come BEFORE /:id to avoid route conflicts!
|
|
105
|
+
// ✨ AUTOMATIC: ids validator is handled by validateQueryParams middleware
|
|
106
|
+
if (typeof controller.getByIds === 'function') {
|
|
107
|
+
router.get('/by-ids', validateQueryParams({}), controller.getByIds);
|
|
108
|
+
}
|
|
109
|
+
// GET /counts - Counts for filters (config-driven)
|
|
110
|
+
const featureName = capitalize(featureConfig.tableName);
|
|
111
|
+
const countsMethod = `get${featureName}Counts`;
|
|
112
|
+
if (typeof controller[countsMethod] === 'function') {
|
|
113
|
+
router.get('/counts', validateQueryParams({
|
|
114
|
+
featureConfig,
|
|
115
|
+
maxLimit,
|
|
116
|
+
defaultLimit,
|
|
117
|
+
allowSearch,
|
|
118
|
+
customValidators
|
|
119
|
+
}), controller[countsMethod]);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const availableMethods = Object.getOwnPropertyNames(controller).filter(m => m.startsWith('get'));
|
|
123
|
+
const warning = {
|
|
124
|
+
feature: featureConfig.tableName,
|
|
125
|
+
route: '/counts',
|
|
126
|
+
expectedMethod: countsMethod,
|
|
127
|
+
availableMethods,
|
|
128
|
+
timestamp: new Date()
|
|
129
|
+
};
|
|
130
|
+
factoryWarnings.push(warning);
|
|
131
|
+
console.warn(`⚠️ QueryRouteFactory [${featureConfig.tableName}]: Missing method '${countsMethod}' for /counts route`);
|
|
132
|
+
console.warn(` Expected: controller.${countsMethod} (based on tableName '${featureConfig.tableName}')`);
|
|
133
|
+
console.warn(` Available: ${availableMethods.join(', ')}`);
|
|
134
|
+
}
|
|
135
|
+
// GET / - List with pagination, filtering, search (config-driven)
|
|
136
|
+
const listMethod = `get${featureName}`;
|
|
137
|
+
console.log(`🔍 [QueryRouteFactory] Checking list method for ${featureConfig.tableName}:`, {
|
|
138
|
+
tableName: featureConfig.tableName,
|
|
139
|
+
featureName,
|
|
140
|
+
listMethod,
|
|
141
|
+
exists: typeof controller[listMethod] === 'function',
|
|
142
|
+
availableMethods: Object.getOwnPropertyNames(controller).filter(m => m.startsWith('get'))
|
|
143
|
+
});
|
|
144
|
+
if (typeof controller[listMethod] === 'function') {
|
|
145
|
+
const validationConfig = {
|
|
146
|
+
featureConfig,
|
|
147
|
+
maxLimit,
|
|
148
|
+
defaultLimit,
|
|
149
|
+
allowSearch,
|
|
150
|
+
customValidators
|
|
151
|
+
};
|
|
152
|
+
if (allowedFields) {
|
|
153
|
+
validationConfig.allowedFields = allowedFields;
|
|
154
|
+
}
|
|
155
|
+
router.get('/', validateQueryParams(validationConfig), controller[listMethod]);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const availableMethods = Object.getOwnPropertyNames(controller).filter(m => m.startsWith('get'));
|
|
159
|
+
const warning = {
|
|
160
|
+
feature: featureConfig.tableName,
|
|
161
|
+
route: '/',
|
|
162
|
+
expectedMethod: listMethod,
|
|
163
|
+
availableMethods,
|
|
164
|
+
timestamp: new Date()
|
|
165
|
+
};
|
|
166
|
+
factoryWarnings.push(warning);
|
|
167
|
+
console.warn(`⚠️ QueryRouteFactory [${featureConfig.tableName}]: Missing method '${listMethod}' for / route`);
|
|
168
|
+
console.warn(` Expected: controller.${listMethod} (based on tableName '${featureConfig.tableName}')`);
|
|
169
|
+
console.warn(` Available: ${availableMethods.join(', ')}`);
|
|
170
|
+
}
|
|
171
|
+
// GET /:id - Single record by ID (config-driven)
|
|
172
|
+
// Use custom method name if provided, otherwise try auto-detection
|
|
173
|
+
const singleMethod = customSingleMethod || (() => {
|
|
174
|
+
// Try to find the correct singular method by inspecting available methods
|
|
175
|
+
const singularCandidates = [
|
|
176
|
+
`get${featureName.replace(/s$/, '')}`, // Remove trailing 's'
|
|
177
|
+
`get${capitalize(featureConfig.tableName.split('_')[0]).replace(/s$/, '')}`, // First word singular
|
|
178
|
+
];
|
|
179
|
+
return singularCandidates.find(candidate => typeof controller[candidate] === 'function') || singularCandidates[0];
|
|
180
|
+
})();
|
|
181
|
+
// 🚨 VALIDATION: Check if method exists
|
|
182
|
+
if (typeof controller[singleMethod] !== 'function') {
|
|
183
|
+
const availableMethods = Object.getOwnPropertyNames(controller).filter(m => m.startsWith('get'));
|
|
184
|
+
const warning = {
|
|
185
|
+
feature: featureConfig.tableName,
|
|
186
|
+
route: '/:id',
|
|
187
|
+
expectedMethod: singleMethod,
|
|
188
|
+
availableMethods,
|
|
189
|
+
timestamp: new Date()
|
|
190
|
+
};
|
|
191
|
+
factoryWarnings.push(warning);
|
|
192
|
+
// 🔥 CRITICAL ERROR - Route will not work!
|
|
193
|
+
console.error('\n' + '='.repeat(80));
|
|
194
|
+
console.error('🚨 CRITICAL: QueryRouteFactory Route Registration Failed!');
|
|
195
|
+
console.error('='.repeat(80));
|
|
196
|
+
console.error(`Feature: ${featureConfig.tableName}`);
|
|
197
|
+
console.error(`Route: GET /:id (detail page)`);
|
|
198
|
+
console.error(`Expected method: controller.${singleMethod}`);
|
|
199
|
+
console.error(`Problem: This method does not exist on the controller!`);
|
|
200
|
+
console.error('');
|
|
201
|
+
console.error('📋 Available methods:');
|
|
202
|
+
availableMethods.forEach(method => {
|
|
203
|
+
console.error(` - ${method}${method === singleMethod ? ' ← EXPECTED (but missing!)' : ''}`);
|
|
204
|
+
});
|
|
205
|
+
console.error('');
|
|
206
|
+
console.error('💡 Fix options:');
|
|
207
|
+
console.error(' 1. Add method to controller using BaseQueryController.autoBindStandardMethods()');
|
|
208
|
+
console.error(' 2. Check AdminUserQueryController.ts for correct method binding');
|
|
209
|
+
console.error(' 3. Ensure getSingleItem() is implemented in the service');
|
|
210
|
+
console.error('');
|
|
211
|
+
console.error('⚠️ IMPACT: GET /api/admin/${featureConfig.tableName}/:id will NOT work!');
|
|
212
|
+
console.error('⚠️ Users clicking on items will see wrong data or errors.');
|
|
213
|
+
console.error('='.repeat(80) + '\n');
|
|
214
|
+
// Don't register the route if method doesn't exist
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// ✅ Method exists - register route
|
|
218
|
+
const validationConfig = {
|
|
219
|
+
featureConfig,
|
|
220
|
+
maxLimit,
|
|
221
|
+
defaultLimit,
|
|
222
|
+
allowSearch,
|
|
223
|
+
customValidators
|
|
224
|
+
};
|
|
225
|
+
if (allowedFields) {
|
|
226
|
+
validationConfig.allowedFields = allowedFields;
|
|
227
|
+
}
|
|
228
|
+
router.get('/:id', validateQueryParams(validationConfig), controller[singleMethod]);
|
|
229
|
+
console.log(`✅ QueryRouteFactory: Registered GET /:id → controller.${singleMethod}`);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Convert table name to PascalCase for method names
|
|
233
|
+
* Handles snake_case correctly:
|
|
234
|
+
* - 'orders' → 'Orders'
|
|
235
|
+
* - 'users_public' → 'UsersPublic'
|
|
236
|
+
* - 'survey_invitations' → 'SurveyInvitations'
|
|
237
|
+
*/
|
|
238
|
+
function capitalize(str) {
|
|
239
|
+
return str
|
|
240
|
+
.split('_')
|
|
241
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1))
|
|
242
|
+
.join('');
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=QueryRouteFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryRouteFactory.js","sourceRoot":"","sources":["../../../src/shared/factories/QueryRouteFactory.ts"],"names":[],"mappings":"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"}
|