@xbg.solutions/backend-core 1.0.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 (185) hide show
  1. package/lib/core/src/app.d.ts +28 -0
  2. package/lib/core/src/app.d.ts.map +1 -0
  3. package/lib/core/src/app.js +188 -0
  4. package/lib/core/src/app.js.map +1 -0
  5. package/lib/core/src/base/BaseController.d.ts +108 -0
  6. package/lib/core/src/base/BaseController.d.ts.map +1 -0
  7. package/lib/core/src/base/BaseController.js +307 -0
  8. package/lib/core/src/base/BaseController.js.map +1 -0
  9. package/lib/core/src/base/BaseEntity.d.ts +92 -0
  10. package/lib/core/src/base/BaseEntity.d.ts.map +1 -0
  11. package/lib/core/src/base/BaseEntity.js +143 -0
  12. package/lib/core/src/base/BaseEntity.js.map +1 -0
  13. package/lib/core/src/base/BaseRepository.d.ts +124 -0
  14. package/lib/core/src/base/BaseRepository.d.ts.map +1 -0
  15. package/lib/core/src/base/BaseRepository.js +414 -0
  16. package/lib/core/src/base/BaseRepository.js.map +1 -0
  17. package/lib/core/src/base/BaseService.d.ts +89 -0
  18. package/lib/core/src/base/BaseService.d.ts.map +1 -0
  19. package/lib/core/src/base/BaseService.js +342 -0
  20. package/lib/core/src/base/BaseService.js.map +1 -0
  21. package/lib/core/src/base/index.d.ts +8 -0
  22. package/lib/core/src/base/index.d.ts.map +1 -0
  23. package/lib/core/src/base/index.js +24 -0
  24. package/lib/core/src/base/index.js.map +1 -0
  25. package/lib/core/src/config/app.config.d.ts +70 -0
  26. package/lib/core/src/config/app.config.d.ts.map +1 -0
  27. package/lib/core/src/config/app.config.js +106 -0
  28. package/lib/core/src/config/app.config.js.map +1 -0
  29. package/lib/core/src/config/auth.config.d.ts +54 -0
  30. package/lib/core/src/config/auth.config.d.ts.map +1 -0
  31. package/lib/core/src/config/auth.config.js +88 -0
  32. package/lib/core/src/config/auth.config.js.map +1 -0
  33. package/lib/core/src/config/cache.config.d.ts +47 -0
  34. package/lib/core/src/config/cache.config.d.ts.map +1 -0
  35. package/lib/core/src/config/cache.config.js +225 -0
  36. package/lib/core/src/config/cache.config.js.map +1 -0
  37. package/lib/core/src/config/communications.config.d.ts +175 -0
  38. package/lib/core/src/config/communications.config.d.ts.map +1 -0
  39. package/lib/core/src/config/communications.config.js +219 -0
  40. package/lib/core/src/config/communications.config.js.map +1 -0
  41. package/lib/core/src/config/database.config.d.ts +68 -0
  42. package/lib/core/src/config/database.config.d.ts.map +1 -0
  43. package/lib/core/src/config/database.config.js +95 -0
  44. package/lib/core/src/config/database.config.js.map +1 -0
  45. package/lib/core/src/config/firebase-event-mapping.config.d.ts +41 -0
  46. package/lib/core/src/config/firebase-event-mapping.config.d.ts.map +1 -0
  47. package/lib/core/src/config/firebase-event-mapping.config.js +180 -0
  48. package/lib/core/src/config/firebase-event-mapping.config.js.map +1 -0
  49. package/lib/core/src/config/firestore.config.d.ts +61 -0
  50. package/lib/core/src/config/firestore.config.d.ts.map +1 -0
  51. package/lib/core/src/config/firestore.config.js +74 -0
  52. package/lib/core/src/config/firestore.config.js.map +1 -0
  53. package/lib/core/src/config/index.d.ts +15 -0
  54. package/lib/core/src/config/index.d.ts.map +1 -0
  55. package/lib/core/src/config/index.js +41 -0
  56. package/lib/core/src/config/index.js.map +1 -0
  57. package/lib/core/src/config/maps.config.d.ts +31 -0
  58. package/lib/core/src/config/maps.config.d.ts.map +1 -0
  59. package/lib/core/src/config/maps.config.js +50 -0
  60. package/lib/core/src/config/maps.config.js.map +1 -0
  61. package/lib/core/src/config/middleware.config.d.ts +57 -0
  62. package/lib/core/src/config/middleware.config.d.ts.map +1 -0
  63. package/lib/core/src/config/middleware.config.js +68 -0
  64. package/lib/core/src/config/middleware.config.js.map +1 -0
  65. package/lib/core/src/config/tokens.config.d.ts +53 -0
  66. package/lib/core/src/config/tokens.config.d.ts.map +1 -0
  67. package/lib/core/src/config/tokens.config.js +129 -0
  68. package/lib/core/src/config/tokens.config.js.map +1 -0
  69. package/lib/core/src/generator/generator.d.ts +38 -0
  70. package/lib/core/src/generator/generator.d.ts.map +1 -0
  71. package/lib/core/src/generator/generator.js +159 -0
  72. package/lib/core/src/generator/generator.js.map +1 -0
  73. package/lib/core/src/generator/index.d.ts +7 -0
  74. package/lib/core/src/generator/index.d.ts.map +1 -0
  75. package/lib/core/src/generator/index.js +23 -0
  76. package/lib/core/src/generator/index.js.map +1 -0
  77. package/lib/core/src/generator/parser.d.ts +10 -0
  78. package/lib/core/src/generator/parser.d.ts.map +1 -0
  79. package/lib/core/src/generator/parser.js +197 -0
  80. package/lib/core/src/generator/parser.js.map +1 -0
  81. package/lib/core/src/generator/types.d.ts +112 -0
  82. package/lib/core/src/generator/types.d.ts.map +1 -0
  83. package/lib/core/src/generator/types.js +7 -0
  84. package/lib/core/src/generator/types.js.map +1 -0
  85. package/lib/core/src/index.d.ts +19 -0
  86. package/lib/core/src/index.d.ts.map +1 -0
  87. package/lib/core/src/index.js +46 -0
  88. package/lib/core/src/index.js.map +1 -0
  89. package/lib/core/src/middleware/auth.middleware.d.ts +57 -0
  90. package/lib/core/src/middleware/auth.middleware.d.ts.map +1 -0
  91. package/lib/core/src/middleware/auth.middleware.js +256 -0
  92. package/lib/core/src/middleware/auth.middleware.js.map +1 -0
  93. package/lib/core/src/middleware/cors.middleware.d.ts +13 -0
  94. package/lib/core/src/middleware/cors.middleware.d.ts.map +1 -0
  95. package/lib/core/src/middleware/cors.middleware.js +50 -0
  96. package/lib/core/src/middleware/cors.middleware.js.map +1 -0
  97. package/lib/core/src/middleware/error.middleware.d.ts +46 -0
  98. package/lib/core/src/middleware/error.middleware.d.ts.map +1 -0
  99. package/lib/core/src/middleware/error.middleware.js +174 -0
  100. package/lib/core/src/middleware/error.middleware.js.map +1 -0
  101. package/lib/core/src/middleware/index.d.ts +11 -0
  102. package/lib/core/src/middleware/index.d.ts.map +1 -0
  103. package/lib/core/src/middleware/index.js +27 -0
  104. package/lib/core/src/middleware/index.js.map +1 -0
  105. package/lib/core/src/middleware/logging.middleware.d.ts +10 -0
  106. package/lib/core/src/middleware/logging.middleware.d.ts.map +1 -0
  107. package/lib/core/src/middleware/logging.middleware.js +87 -0
  108. package/lib/core/src/middleware/logging.middleware.js.map +1 -0
  109. package/lib/core/src/middleware/rateLimit.middleware.d.ts +26 -0
  110. package/lib/core/src/middleware/rateLimit.middleware.d.ts.map +1 -0
  111. package/lib/core/src/middleware/rateLimit.middleware.js +105 -0
  112. package/lib/core/src/middleware/rateLimit.middleware.js.map +1 -0
  113. package/lib/core/src/middleware/requestId.middleware.d.ts +11 -0
  114. package/lib/core/src/middleware/requestId.middleware.d.ts.map +1 -0
  115. package/lib/core/src/middleware/requestId.middleware.js +26 -0
  116. package/lib/core/src/middleware/requestId.middleware.js.map +1 -0
  117. package/lib/core/src/middleware/validation.middleware.d.ts +25 -0
  118. package/lib/core/src/middleware/validation.middleware.d.ts.map +1 -0
  119. package/lib/core/src/middleware/validation.middleware.js +133 -0
  120. package/lib/core/src/middleware/validation.middleware.js.map +1 -0
  121. package/lib/core/src/types/errors.d.ts +119 -0
  122. package/lib/core/src/types/errors.d.ts.map +1 -0
  123. package/lib/core/src/types/errors.js +210 -0
  124. package/lib/core/src/types/errors.js.map +1 -0
  125. package/lib/utils-cache-connector/src/cache-connector.d.ts +139 -0
  126. package/lib/utils-cache-connector/src/cache-connector.d.ts.map +1 -0
  127. package/lib/utils-cache-connector/src/cache-connector.js +277 -0
  128. package/lib/utils-cache-connector/src/cache-connector.js.map +1 -0
  129. package/lib/utils-cache-connector/src/index.d.ts +52 -0
  130. package/lib/utils-cache-connector/src/index.d.ts.map +1 -0
  131. package/lib/utils-cache-connector/src/index.js +103 -0
  132. package/lib/utils-cache-connector/src/index.js.map +1 -0
  133. package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts +95 -0
  134. package/lib/utils-cache-connector/src/providers/base-cache-provider.d.ts.map +1 -0
  135. package/lib/utils-cache-connector/src/providers/base-cache-provider.js +120 -0
  136. package/lib/utils-cache-connector/src/providers/base-cache-provider.js.map +1 -0
  137. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts +58 -0
  138. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.d.ts.map +1 -0
  139. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js +418 -0
  140. package/lib/utils-cache-connector/src/providers/firestore-cache-provider.js.map +1 -0
  141. package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts +57 -0
  142. package/lib/utils-cache-connector/src/providers/memory-cache-provider.d.ts.map +1 -0
  143. package/lib/utils-cache-connector/src/providers/memory-cache-provider.js +217 -0
  144. package/lib/utils-cache-connector/src/providers/memory-cache-provider.js.map +1 -0
  145. package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts +21 -0
  146. package/lib/utils-cache-connector/src/providers/noop-cache-provider.d.ts.map +1 -0
  147. package/lib/utils-cache-connector/src/providers/noop-cache-provider.js +42 -0
  148. package/lib/utils-cache-connector/src/providers/noop-cache-provider.js.map +1 -0
  149. package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts +64 -0
  150. package/lib/utils-cache-connector/src/providers/redis-cache-provider.d.ts.map +1 -0
  151. package/lib/utils-cache-connector/src/providers/redis-cache-provider.js +414 -0
  152. package/lib/utils-cache-connector/src/providers/redis-cache-provider.js.map +1 -0
  153. package/lib/utils-cache-connector/src/types.d.ts +342 -0
  154. package/lib/utils-cache-connector/src/types.d.ts.map +1 -0
  155. package/lib/utils-cache-connector/src/types.js +8 -0
  156. package/lib/utils-cache-connector/src/types.js.map +1 -0
  157. package/lib/utils-events/src/event-bus.d.ts +42 -0
  158. package/lib/utils-events/src/event-bus.d.ts.map +1 -0
  159. package/lib/utils-events/src/event-bus.js +93 -0
  160. package/lib/utils-events/src/event-bus.js.map +1 -0
  161. package/lib/utils-events/src/event-types.d.ts +146 -0
  162. package/lib/utils-events/src/event-types.d.ts.map +1 -0
  163. package/lib/utils-events/src/event-types.js +49 -0
  164. package/lib/utils-events/src/event-types.js.map +1 -0
  165. package/lib/utils-events/src/index.d.ts +7 -0
  166. package/lib/utils-events/src/index.d.ts.map +1 -0
  167. package/lib/utils-events/src/index.js +11 -0
  168. package/lib/utils-events/src/index.js.map +1 -0
  169. package/lib/utils-logger/src/index.d.ts +12 -0
  170. package/lib/utils-logger/src/index.d.ts.map +1 -0
  171. package/lib/utils-logger/src/index.js +29 -0
  172. package/lib/utils-logger/src/index.js.map +1 -0
  173. package/lib/utils-logger/src/logger-types.d.ts +32 -0
  174. package/lib/utils-logger/src/logger-types.d.ts.map +1 -0
  175. package/lib/utils-logger/src/logger-types.js +17 -0
  176. package/lib/utils-logger/src/logger-types.js.map +1 -0
  177. package/lib/utils-logger/src/logger.d.ts +42 -0
  178. package/lib/utils-logger/src/logger.d.ts.map +1 -0
  179. package/lib/utils-logger/src/logger.js +123 -0
  180. package/lib/utils-logger/src/logger.js.map +1 -0
  181. package/package.json +49 -0
  182. package/src/templates/controller.hbs +48 -0
  183. package/src/templates/entity.hbs +80 -0
  184. package/src/templates/repository.hbs +56 -0
  185. package/src/templates/service.hbs +108 -0
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /**
3
+ * @xbg/backend-core
4
+ * Core framework for XBG backend projects
5
+ *
6
+ * Exports base classes, middleware, configuration, types, and code generator
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.parseEntitySpecification = exports.createGenerator = exports.CodeGenerator = exports.startServer = exports.registerControllers = exports.createApp = void 0;
24
+ // Base classes
25
+ __exportStar(require("./base/BaseEntity"), exports);
26
+ __exportStar(require("./base/BaseRepository"), exports);
27
+ __exportStar(require("./base/BaseService"), exports);
28
+ __exportStar(require("./base/BaseController"), exports);
29
+ // Middleware
30
+ __exportStar(require("./middleware"), exports);
31
+ // Configuration
32
+ __exportStar(require("./config"), exports);
33
+ // Types
34
+ __exportStar(require("./types/errors"), exports);
35
+ // App factory
36
+ var app_1 = require("./app");
37
+ Object.defineProperty(exports, "createApp", { enumerable: true, get: function () { return app_1.createApp; } });
38
+ Object.defineProperty(exports, "registerControllers", { enumerable: true, get: function () { return app_1.registerControllers; } });
39
+ Object.defineProperty(exports, "startServer", { enumerable: true, get: function () { return app_1.startServer; } });
40
+ // Code generator
41
+ var generator_1 = require("./generator/generator");
42
+ Object.defineProperty(exports, "CodeGenerator", { enumerable: true, get: function () { return generator_1.CodeGenerator; } });
43
+ Object.defineProperty(exports, "createGenerator", { enumerable: true, get: function () { return generator_1.createGenerator; } });
44
+ var parser_1 = require("./generator/parser");
45
+ Object.defineProperty(exports, "parseEntitySpecification", { enumerable: true, get: function () { return parser_1.parseEntitySpecification; } });
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,oDAAkC;AAClC,wDAAsC;AACtC,qDAAmC;AACnC,wDAAsC;AAEtC,aAAa;AACb,+CAA6B;AAE7B,gBAAgB;AAChB,2CAAyB;AAEzB,QAAQ;AACR,iDAA+B;AAE/B,cAAc;AACd,6BAAoE;AAA3D,gGAAA,SAAS,OAAA;AAAE,0GAAA,mBAAmB,OAAA;AAAE,kGAAA,WAAW,OAAA;AAGpD,iBAAiB;AACjB,mDAAuE;AAA9D,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AACvC,6CAA8D;AAArD,kHAAA,wBAAwB,OAAA"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Authentication Middleware
3
+ * Integrates with the token handler utility
4
+ */
5
+ import { Request, Response, NextFunction } from 'express';
6
+ import type { ITokenHandler } from '@xbg/utils-token-handler';
7
+ export interface AuthenticatedRequest extends Request {
8
+ user?: {
9
+ uid: string;
10
+ email?: string;
11
+ role?: string;
12
+ customClaims?: Record<string, any>;
13
+ };
14
+ }
15
+ /**
16
+ * Authentication middleware factory
17
+ * Verifies JWT tokens and attaches user to request
18
+ */
19
+ export declare function createAuthMiddleware(options: {
20
+ tokenHandler: ITokenHandler;
21
+ required?: boolean;
22
+ roles?: string[];
23
+ }): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
24
+ /**
25
+ * Optional authentication middleware
26
+ * Attaches user if token is present but doesn't require it
27
+ */
28
+ export declare function optionalAuth(tokenHandler: ITokenHandler): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
29
+ /**
30
+ * Required authentication middleware
31
+ * Requires valid token
32
+ */
33
+ export declare function requiredAuth(tokenHandler: ITokenHandler): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
34
+ /**
35
+ * Role-based authentication middleware
36
+ * Requires valid token and specific roles
37
+ */
38
+ export declare function requireRoles(tokenHandler: ITokenHandler, roles: string[]): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
39
+ /**
40
+ * Admin-only middleware
41
+ * Pass custom admin roles array to match your project's role names.
42
+ * Default: ['admin']
43
+ */
44
+ export declare function requireAdmin(tokenHandler: ITokenHandler, adminRoles?: string[]): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
45
+ /**
46
+ * Check if user owns resource
47
+ * Pass adminRoles to configure which roles bypass the ownership check.
48
+ * Default: ['admin']
49
+ */
50
+ export declare function requireOwnership(getUserIdFromResource: (req: Request) => string | undefined, adminRoles?: string[]): (req: AuthenticatedRequest, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
51
+ /**
52
+ * API Key authentication middleware
53
+ * For service-to-service communication.
54
+ * Uses timing-safe comparison to prevent timing attacks.
55
+ */
56
+ export declare function requireApiKey(validApiKeys: string[]): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
57
+ //# sourceMappingURL=auth.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.middleware.d.ts","sourceRoot":"","sources":["../../../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,CAAC,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,YAAY,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,IACe,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wDAwE9D;AAqBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,SAjGnC,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDAmG9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,SAzGnC,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDA2G9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,SAjHpD,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDAmH9D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,GAAE,MAAM,EAAc,SA1HrE,OAAO,OAAO,QAAQ,QAAQ,YAAY,wDA4H9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,EAC3D,UAAU,GAAE,MAAM,EAAc,IAElB,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wDAmC3E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IACpC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wDA6B9D"}
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ /**
3
+ * Authentication Middleware
4
+ * Integrates with the token handler utility
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.createAuthMiddleware = createAuthMiddleware;
41
+ exports.optionalAuth = optionalAuth;
42
+ exports.requiredAuth = requiredAuth;
43
+ exports.requireRoles = requireRoles;
44
+ exports.requireAdmin = requireAdmin;
45
+ exports.requireOwnership = requireOwnership;
46
+ exports.requireApiKey = requireApiKey;
47
+ const crypto = __importStar(require("crypto"));
48
+ const utils_logger_1 = require("@xbg/utils-logger");
49
+ const errors_1 = require("../types/errors");
50
+ /**
51
+ * Authentication middleware factory
52
+ * Verifies JWT tokens and attaches user to request
53
+ */
54
+ function createAuthMiddleware(options) {
55
+ return async (req, res, next) => {
56
+ var _a, _b, _c, _d;
57
+ try {
58
+ const token = extractTokenFromHeader(req);
59
+ if (!token) {
60
+ if (options.required !== false) {
61
+ return res.status(401).json({
62
+ success: false,
63
+ error: {
64
+ code: 'UNAUTHORIZED',
65
+ message: 'Authentication required',
66
+ },
67
+ });
68
+ }
69
+ return next();
70
+ }
71
+ // Verify token using token handler (includes blacklist check)
72
+ const verificationResult = await options.tokenHandler.verifyAndUnpack(token, utils_logger_1.logger);
73
+ if (!verificationResult.isValid) {
74
+ return res.status(401).json({
75
+ success: false,
76
+ error: {
77
+ code: verificationResult.isBlacklisted ? 'TOKEN_REVOKED' : 'INVALID_TOKEN',
78
+ message: verificationResult.error || 'Invalid or expired token',
79
+ },
80
+ });
81
+ }
82
+ // Attach user to request
83
+ req.user = {
84
+ uid: verificationResult.token.authUID,
85
+ email: verificationResult.token.email || undefined,
86
+ role: ((_a = verificationResult.token.customClaims) === null || _a === void 0 ? void 0 : _a.role) || 'user',
87
+ customClaims: verificationResult.token.customClaims,
88
+ };
89
+ // Check role requirements
90
+ if (options.roles && options.roles.length > 0) {
91
+ const userRole = (_b = req.user) === null || _b === void 0 ? void 0 : _b.role;
92
+ if (!userRole || !options.roles.includes(userRole)) {
93
+ return res.status(403).json({
94
+ success: false,
95
+ error: {
96
+ code: 'FORBIDDEN',
97
+ message: 'Insufficient permissions',
98
+ },
99
+ });
100
+ }
101
+ }
102
+ utils_logger_1.logger.debug('User authenticated', {
103
+ uid: (_c = req.user) === null || _c === void 0 ? void 0 : _c.uid,
104
+ role: (_d = req.user) === null || _d === void 0 ? void 0 : _d.role,
105
+ });
106
+ return next();
107
+ }
108
+ catch (error) {
109
+ const err = error instanceof Error ? error : new Error(String(error));
110
+ const authError = new errors_1.AuthError('Authentication failed', error);
111
+ utils_logger_1.logger.error(authError.message, err);
112
+ return res.status(500).json({
113
+ success: false,
114
+ error: {
115
+ code: 'AUTH_ERROR',
116
+ message: 'Authentication failed',
117
+ },
118
+ });
119
+ }
120
+ };
121
+ }
122
+ /**
123
+ * Extract token from Authorization header
124
+ */
125
+ function extractTokenFromHeader(req) {
126
+ const authHeader = req.headers.authorization;
127
+ if (!authHeader) {
128
+ return null;
129
+ }
130
+ const parts = authHeader.split(' ');
131
+ if (parts.length !== 2 || parts[0] !== 'Bearer') {
132
+ return null;
133
+ }
134
+ return parts[1];
135
+ }
136
+ /**
137
+ * Optional authentication middleware
138
+ * Attaches user if token is present but doesn't require it
139
+ */
140
+ function optionalAuth(tokenHandler) {
141
+ return createAuthMiddleware({ tokenHandler, required: false });
142
+ }
143
+ /**
144
+ * Required authentication middleware
145
+ * Requires valid token
146
+ */
147
+ function requiredAuth(tokenHandler) {
148
+ return createAuthMiddleware({ tokenHandler, required: true });
149
+ }
150
+ /**
151
+ * Role-based authentication middleware
152
+ * Requires valid token and specific roles
153
+ */
154
+ function requireRoles(tokenHandler, roles) {
155
+ return createAuthMiddleware({ tokenHandler, required: true, roles });
156
+ }
157
+ /**
158
+ * Admin-only middleware
159
+ * Pass custom admin roles array to match your project's role names.
160
+ * Default: ['admin']
161
+ */
162
+ function requireAdmin(tokenHandler, adminRoles = ['admin']) {
163
+ return requireRoles(tokenHandler, adminRoles);
164
+ }
165
+ /**
166
+ * Check if user owns resource
167
+ * Pass adminRoles to configure which roles bypass the ownership check.
168
+ * Default: ['admin']
169
+ */
170
+ function requireOwnership(getUserIdFromResource, adminRoles = ['admin']) {
171
+ return async (req, res, next) => {
172
+ var _a, _b;
173
+ try {
174
+ const userId = (_a = req.user) === null || _a === void 0 ? void 0 : _a.uid;
175
+ const resourceUserId = getUserIdFromResource(req);
176
+ if (!userId || !resourceUserId || userId !== resourceUserId) {
177
+ // Allow if user has an admin role
178
+ if (((_b = req.user) === null || _b === void 0 ? void 0 : _b.role) && adminRoles.includes(req.user.role)) {
179
+ return next();
180
+ }
181
+ return res.status(403).json({
182
+ success: false,
183
+ error: {
184
+ code: 'FORBIDDEN',
185
+ message: 'Access denied to this resource',
186
+ },
187
+ });
188
+ }
189
+ return next();
190
+ }
191
+ catch (error) {
192
+ const err = error instanceof Error ? error : new Error(String(error));
193
+ const authError = new errors_1.AuthError('Failed to verify resource ownership', error);
194
+ utils_logger_1.logger.error(authError.message, err);
195
+ return res.status(500).json({
196
+ success: false,
197
+ error: {
198
+ code: 'AUTHORIZATION_ERROR',
199
+ message: 'Failed to verify resource ownership',
200
+ },
201
+ });
202
+ }
203
+ };
204
+ }
205
+ /**
206
+ * API Key authentication middleware
207
+ * For service-to-service communication.
208
+ * Uses timing-safe comparison to prevent timing attacks.
209
+ */
210
+ function requireApiKey(validApiKeys) {
211
+ return async (req, res, next) => {
212
+ try {
213
+ const apiKey = req.headers['x-api-key'];
214
+ if (!apiKey || !timingSafeIncludes(validApiKeys, apiKey)) {
215
+ return res.status(401).json({
216
+ success: false,
217
+ error: {
218
+ code: 'INVALID_API_KEY',
219
+ message: 'Invalid or missing API key',
220
+ },
221
+ });
222
+ }
223
+ return next();
224
+ }
225
+ catch (error) {
226
+ const err = error instanceof Error ? error : new Error(String(error));
227
+ const authError = new errors_1.AuthError('API key validation failed', error);
228
+ utils_logger_1.logger.error(authError.message, err);
229
+ return res.status(500).json({
230
+ success: false,
231
+ error: {
232
+ code: 'AUTH_ERROR',
233
+ message: 'API key validation failed',
234
+ },
235
+ });
236
+ }
237
+ };
238
+ }
239
+ /**
240
+ * Timing-safe comparison of an API key against a list of valid keys.
241
+ * Prevents timing side-channel attacks that could leak key information.
242
+ */
243
+ function timingSafeIncludes(validKeys, candidate) {
244
+ const candidateBuffer = Buffer.from(candidate);
245
+ let found = false;
246
+ for (const key of validKeys) {
247
+ const keyBuffer = Buffer.from(key);
248
+ if (candidateBuffer.length === keyBuffer.length) {
249
+ if (crypto.timingSafeEqual(candidateBuffer, keyBuffer)) {
250
+ found = true;
251
+ }
252
+ }
253
+ }
254
+ return found;
255
+ }
256
+ //# sourceMappingURL=auth.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.middleware.js","sourceRoot":"","sources":["../../../../src/middleware/auth.middleware.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBH,oDA6EC;AAyBD,oCAEC;AAMD,oCAEC;AAMD,oCAEC;AAOD,oCAEC;AAOD,4CAuCC;AAOD,sCA8BC;AAvOD,+CAAiC;AAEjC,oDAA2C;AAC3C,4CAA4C;AAY5C;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,OAIpC;IACC,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;;QAC/D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;YAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;oBAC/B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC1B,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE;4BACL,IAAI,EAAE,cAAc;4BACpB,OAAO,EAAE,yBAAyB;yBACnC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,8DAA8D;YAC9D,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAM,CAAC,CAAC;YAErF,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;wBAC1E,OAAO,EAAE,kBAAkB,CAAC,KAAK,IAAI,0BAA0B;qBAChE;iBACF,CAAC,CAAC;YACL,CAAC;YAED,yBAAyB;YACxB,GAA4B,CAAC,IAAI,GAAG;gBACnC,GAAG,EAAE,kBAAkB,CAAC,KAAM,CAAC,OAAO;gBACtC,KAAK,EAAE,kBAAkB,CAAC,KAAM,CAAC,KAAK,IAAI,SAAS;gBACnD,IAAI,EAAE,CAAA,MAAA,kBAAkB,CAAC,KAAM,CAAC,YAAY,0CAAE,IAAI,KAAI,MAAM;gBAC5D,YAAY,EAAE,kBAAkB,CAAC,KAAM,CAAC,YAAY;aACrD,CAAC;YAEF,0BAA0B;YAC1B,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,MAAC,GAA4B,CAAC,IAAI,0CAAE,IAAI,CAAC;gBAC1D,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC1B,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE;4BACL,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,0BAA0B;yBACpC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,qBAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACjC,GAAG,EAAE,MAAC,GAA4B,CAAC,IAAI,0CAAE,GAAG;gBAC5C,IAAI,EAAE,MAAC,GAA4B,CAAC,IAAI,0CAAE,IAAI;aAC/C,CAAC,CAAC;YAEH,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,kBAAS,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAChE,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAErC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,uBAAuB;iBACjC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,GAAY;IAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAE7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,YAA2B;IACtD,OAAO,oBAAoB,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,YAA2B;IACtD,OAAO,oBAAoB,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,YAA2B,EAAE,KAAe;IACvE,OAAO,oBAAoB,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,YAA2B,EAAE,aAAuB,CAAC,OAAO,CAAC;IACxF,OAAO,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,qBAA2D,EAC3D,aAAuB,CAAC,OAAO,CAAC;IAEhC,OAAO,KAAK,EAAE,GAAyB,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;;QAC5E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAA,GAAG,CAAC,IAAI,0CAAE,GAAG,CAAC;YAC7B,MAAM,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;YAElD,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;gBAC5D,kCAAkC;gBAClC,IAAI,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,IAAI,KAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzD,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBAED,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,gCAAgC;qBAC1C;iBACF,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,kBAAS,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC9E,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAErC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,qCAAqC;iBAC/C;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,YAAsB;IAClD,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAW,CAAC;YAElD,IAAI,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,iBAAiB;wBACvB,OAAO,EAAE,4BAA4B;qBACtC;iBACF,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,kBAAS,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACpE,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAErC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,2BAA2B;iBACrC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,SAAmB,EAAE,SAAiB;IAChE,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE,CAAC;gBACvD,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CORS Middleware Configuration
3
+ */
4
+ import cors from 'cors';
5
+ /**
6
+ * Create CORS middleware with configuration
7
+ */
8
+ export declare function createCorsMiddleware(): (req: cors.CorsRequest, res: {
9
+ statusCode?: number | undefined;
10
+ setHeader(key: string, value: string): any;
11
+ end(): any;
12
+ }, next: (err?: any) => any) => void;
13
+ //# sourceMappingURL=cors.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.middleware.d.ts","sourceRoot":"","sources":["../../../../src/middleware/cors.middleware.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB;;GAEG;AACH,wBAAgB,oBAAoB;cAqC4I,CAAC;;;aAAmH,CAAC,uBADpS"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * CORS Middleware Configuration
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createCorsMiddleware = createCorsMiddleware;
10
+ const cors_1 = __importDefault(require("cors"));
11
+ const app_config_1 = require("../config/app.config");
12
+ const middleware_config_1 = require("../config/middleware.config");
13
+ /**
14
+ * Create CORS middleware with configuration
15
+ */
16
+ function createCorsMiddleware() {
17
+ return (0, cors_1.default)({
18
+ origin: (origin, callback) => {
19
+ // Allow requests with no origin (mobile apps, Postman, etc.)
20
+ if (!origin) {
21
+ return callback(null, true);
22
+ }
23
+ // Check if origin is allowed
24
+ if (app_config_1.APP_CONFIG.api.corsOrigins.includes(origin)) {
25
+ return callback(null, true);
26
+ }
27
+ // In development, allow all localhost origins
28
+ if (app_config_1.APP_CONFIG.app.environment === 'development' && origin.includes('localhost')) {
29
+ return callback(null, true);
30
+ }
31
+ callback(new Error('Not allowed by CORS'));
32
+ },
33
+ credentials: middleware_config_1.MIDDLEWARE_CONFIG.cors.credentials,
34
+ maxAge: middleware_config_1.MIDDLEWARE_CONFIG.cors.maxAge,
35
+ methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
36
+ allowedHeaders: [
37
+ 'Content-Type',
38
+ 'Authorization',
39
+ 'X-Request-ID',
40
+ 'X-API-Key',
41
+ ],
42
+ exposedHeaders: [
43
+ 'X-Request-ID',
44
+ 'X-Total-Count',
45
+ 'X-Page',
46
+ 'X-Page-Size',
47
+ ],
48
+ });
49
+ }
50
+ //# sourceMappingURL=cors.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.middleware.js","sourceRoot":"","sources":["../../../../src/middleware/cors.middleware.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AASH,oDAoCC;AA3CD,gDAAwB;AACxB,qDAAkD;AAClD,mEAAgE;AAEhE;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,IAAA,cAAI,EAAC;QACV,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YAC3B,6DAA6D;YAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,6BAA6B;YAC7B,IAAI,uBAAU,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChD,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,8CAA8C;YAC9C,IAAI,uBAAU,CAAC,GAAG,CAAC,WAAW,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjF,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,QAAQ,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,WAAW,EAAE,qCAAiB,CAAC,IAAI,CAAC,WAAW;QAC/C,MAAM,EAAE,qCAAiB,CAAC,IAAI,CAAC,MAAM;QACrC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;QAC7D,cAAc,EAAE;YACd,cAAc;YACd,eAAe;YACf,cAAc;YACd,WAAW;SACZ;QACD,cAAc,EAAE;YACd,cAAc;YACd,eAAe;YACf,QAAQ;YACR,aAAa;SACd;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Error Handling Middleware
3
+ * Global error handler and custom error classes
4
+ */
5
+ import { Request, Response, NextFunction } from 'express';
6
+ /**
7
+ * Custom application errors
8
+ */
9
+ export declare class AppError extends Error {
10
+ code: string;
11
+ message: string;
12
+ statusCode: number;
13
+ details?: Record<string, any> | undefined;
14
+ constructor(code: string, message: string, statusCode?: number, details?: Record<string, any> | undefined);
15
+ }
16
+ export declare class NotFoundError extends AppError {
17
+ constructor(resource: string, id?: string);
18
+ }
19
+ export declare class ValidationError extends AppError {
20
+ constructor(message: string, details?: Record<string, any>);
21
+ }
22
+ export declare class UnauthorizedError extends AppError {
23
+ constructor(message?: string);
24
+ }
25
+ export declare class ForbiddenError extends AppError {
26
+ constructor(message?: string);
27
+ }
28
+ export declare class ConflictError extends AppError {
29
+ constructor(message: string, details?: Record<string, any>);
30
+ }
31
+ /**
32
+ * Global error handling middleware
33
+ * Must be registered last in middleware chain
34
+ */
35
+ export declare function errorHandler(): (err: Error, req: Request, res: Response, _next: NextFunction) => Response<any, Record<string, any>>;
36
+ /**
37
+ * 404 Not Found handler
38
+ * For unmatched routes
39
+ */
40
+ export declare function notFoundHandler(): (req: Request, res: Response) => void;
41
+ /**
42
+ * Async handler wrapper
43
+ * Catches async errors and passes to error middleware
44
+ */
45
+ export declare function asyncHandler(fn: (req: Request, res: Response, next: NextFunction) => Promise<any>): (req: Request, res: Response, next: NextFunction) => void;
46
+ //# sourceMappingURL=error.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.middleware.d.ts","sourceRoot":"","sources":["../../../../src/middleware/error.middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,MAAM;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;gBAH7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,EACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAA;CAMvC;AAED,qBAAa,aAAc,SAAQ,QAAQ;gBAC7B,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;CAS1C;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAI3D;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,OAAO,SAA4B;CAIhD;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,OAAO,SAAkB;CAItC;AAED,qBAAa,aAAc,SAAQ,QAAQ;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAI3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,KAClB,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,OAAO,YAAY,wCA4ErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,KACrB,KAAK,OAAO,EAAE,KAAK,QAAQ,UAsBpC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,GAAG,CAAC,IACxF,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,UAGxD"}