@globaltracking/auth-middleware 2.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 (118) hide show
  1. package/README.md +372 -0
  2. package/dist/config.d.ts +9 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +110 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/errors.d.ts +26 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +42 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/extract-user.d.ts +10 -0
  11. package/dist/extract-user.d.ts.map +1 -0
  12. package/dist/extract-user.js +30 -0
  13. package/dist/extract-user.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +42 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/middlewares/authenticate.d.ts +10 -0
  19. package/dist/middlewares/authenticate.d.ts.map +1 -0
  20. package/dist/middlewares/authenticate.js +26 -0
  21. package/dist/middlewares/authenticate.js.map +1 -0
  22. package/dist/middlewares/error-handler.d.ts +12 -0
  23. package/dist/middlewares/error-handler.d.ts.map +1 -0
  24. package/dist/middlewares/error-handler.js +22 -0
  25. package/dist/middlewares/error-handler.js.map +1 -0
  26. package/dist/middlewares/require-permission.d.ts +12 -0
  27. package/dist/middlewares/require-permission.d.ts.map +1 -0
  28. package/dist/middlewares/require-permission.js +63 -0
  29. package/dist/middlewares/require-permission.js.map +1 -0
  30. package/dist/middlewares/require-role.d.ts +12 -0
  31. package/dist/middlewares/require-role.d.ts.map +1 -0
  32. package/dist/middlewares/require-role.js +30 -0
  33. package/dist/middlewares/require-role.js.map +1 -0
  34. package/dist/middlewares/require-self.d.ts +10 -0
  35. package/dist/middlewares/require-self.d.ts.map +1 -0
  36. package/dist/middlewares/require-self.js +40 -0
  37. package/dist/middlewares/require-self.js.map +1 -0
  38. package/dist/middlewares/require-tenant.d.ts +11 -0
  39. package/dist/middlewares/require-tenant.d.ts.map +1 -0
  40. package/dist/middlewares/require-tenant.js +25 -0
  41. package/dist/middlewares/require-tenant.js.map +1 -0
  42. package/dist/nestjs/constants.d.ts +5 -0
  43. package/dist/nestjs/constants.d.ts.map +1 -0
  44. package/dist/nestjs/constants.js +8 -0
  45. package/dist/nestjs/constants.js.map +1 -0
  46. package/dist/nestjs/decorators/index.d.ts +44 -0
  47. package/dist/nestjs/decorators/index.d.ts.map +1 -0
  48. package/dist/nestjs/decorators/index.js +61 -0
  49. package/dist/nestjs/decorators/index.js.map +1 -0
  50. package/dist/nestjs/filters/auth-exception.filter.d.ts +16 -0
  51. package/dist/nestjs/filters/auth-exception.filter.d.ts.map +1 -0
  52. package/dist/nestjs/filters/auth-exception.filter.js +37 -0
  53. package/dist/nestjs/filters/auth-exception.filter.js.map +1 -0
  54. package/dist/nestjs/gt-auth.module.d.ts +31 -0
  55. package/dist/nestjs/gt-auth.module.d.ts.map +1 -0
  56. package/dist/nestjs/gt-auth.module.js +102 -0
  57. package/dist/nestjs/gt-auth.module.js.map +1 -0
  58. package/dist/nestjs/guards/auth.guard.d.ts +13 -0
  59. package/dist/nestjs/guards/auth.guard.d.ts.map +1 -0
  60. package/dist/nestjs/guards/auth.guard.js +53 -0
  61. package/dist/nestjs/guards/auth.guard.js.map +1 -0
  62. package/dist/nestjs/guards/internal-only.guard.d.ts +15 -0
  63. package/dist/nestjs/guards/internal-only.guard.d.ts.map +1 -0
  64. package/dist/nestjs/guards/internal-only.guard.js +51 -0
  65. package/dist/nestjs/guards/internal-only.guard.js.map +1 -0
  66. package/dist/nestjs/guards/permissions.guard.d.ts +23 -0
  67. package/dist/nestjs/guards/permissions.guard.d.ts.map +1 -0
  68. package/dist/nestjs/guards/permissions.guard.js +134 -0
  69. package/dist/nestjs/guards/permissions.guard.js.map +1 -0
  70. package/dist/nestjs/index.d.ts +12 -0
  71. package/dist/nestjs/index.d.ts.map +1 -0
  72. package/dist/nestjs/index.js +40 -0
  73. package/dist/nestjs/index.js.map +1 -0
  74. package/dist/nestjs/interceptors/org-context.interceptor.d.ts +21 -0
  75. package/dist/nestjs/interceptors/org-context.interceptor.d.ts.map +1 -0
  76. package/dist/nestjs/interceptors/org-context.interceptor.js +63 -0
  77. package/dist/nestjs/interceptors/org-context.interceptor.js.map +1 -0
  78. package/dist/nestjs/middleware/trusted-headers.middleware.d.ts +15 -0
  79. package/dist/nestjs/middleware/trusted-headers.middleware.d.ts.map +1 -0
  80. package/dist/nestjs/middleware/trusted-headers.middleware.js +42 -0
  81. package/dist/nestjs/middleware/trusted-headers.middleware.js.map +1 -0
  82. package/dist/nestjs.d.ts +2 -0
  83. package/dist/nestjs.d.ts.map +1 -0
  84. package/dist/nestjs.js +18 -0
  85. package/dist/nestjs.js.map +1 -0
  86. package/dist/strategies/gateway-header.strategy.d.ts +13 -0
  87. package/dist/strategies/gateway-header.strategy.d.ts.map +1 -0
  88. package/dist/strategies/gateway-header.strategy.js +51 -0
  89. package/dist/strategies/gateway-header.strategy.js.map +1 -0
  90. package/dist/strategies/index.d.ts +5 -0
  91. package/dist/strategies/index.d.ts.map +1 -0
  92. package/dist/strategies/index.js +10 -0
  93. package/dist/strategies/index.js.map +1 -0
  94. package/dist/strategies/jwt.strategy.d.ts +13 -0
  95. package/dist/strategies/jwt.strategy.d.ts.map +1 -0
  96. package/dist/strategies/jwt.strategy.js +94 -0
  97. package/dist/strategies/jwt.strategy.js.map +1 -0
  98. package/dist/strategies/strategy.interface.d.ts +15 -0
  99. package/dist/strategies/strategy.interface.d.ts.map +1 -0
  100. package/dist/strategies/strategy.interface.js +3 -0
  101. package/dist/strategies/strategy.interface.js.map +1 -0
  102. package/dist/strategies/trusted-headers.strategy.d.ts +16 -0
  103. package/dist/strategies/trusted-headers.strategy.d.ts.map +1 -0
  104. package/dist/strategies/trusted-headers.strategy.js +50 -0
  105. package/dist/strategies/trusted-headers.strategy.js.map +1 -0
  106. package/dist/types.d.ts +78 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +3 -0
  109. package/dist/types.js.map +1 -0
  110. package/dist/utils/helpers.d.ts +14 -0
  111. package/dist/utils/helpers.d.ts.map +1 -0
  112. package/dist/utils/helpers.js +26 -0
  113. package/dist/utils/helpers.js.map +1 -0
  114. package/dist/utils/jwt.d.ts +12 -0
  115. package/dist/utils/jwt.d.ts.map +1 -0
  116. package/dist/utils/jwt.js +104 -0
  117. package/dist/utils/jwt.js.map +1 -0
  118. package/package.json +82 -0
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasAnyPermission = exports.hasPermission = exports.hasRole = exports.authErrorHandler = exports.requireSelf = exports.requireTenant = exports.requireAnyPermission = exports.requirePermission = exports.requireRole = exports.authenticate = exports.JwtStrategy = exports.TrustedHeadersStrategy = exports.GatewayHeaderStrategy = exports.extractUser = exports.ForbiddenError = exports.UnauthorizedError = exports.AuthError = exports.resetConfig = exports.getConfig = exports.initAuth = void 0;
4
+ // Configuration
5
+ var config_1 = require("./config");
6
+ Object.defineProperty(exports, "initAuth", { enumerable: true, get: function () { return config_1.initAuth; } });
7
+ Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return config_1.getConfig; } });
8
+ Object.defineProperty(exports, "resetConfig", { enumerable: true, get: function () { return config_1.resetConfig; } });
9
+ // Errors
10
+ var errors_1 = require("./errors");
11
+ Object.defineProperty(exports, "AuthError", { enumerable: true, get: function () { return errors_1.AuthError; } });
12
+ Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return errors_1.UnauthorizedError; } });
13
+ Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: function () { return errors_1.ForbiddenError; } });
14
+ // Core extraction
15
+ var extract_user_1 = require("./extract-user");
16
+ Object.defineProperty(exports, "extractUser", { enumerable: true, get: function () { return extract_user_1.extractUser; } });
17
+ var gateway_header_strategy_1 = require("./strategies/gateway-header.strategy");
18
+ Object.defineProperty(exports, "GatewayHeaderStrategy", { enumerable: true, get: function () { return gateway_header_strategy_1.GatewayHeaderStrategy; } });
19
+ var trusted_headers_strategy_1 = require("./strategies/trusted-headers.strategy");
20
+ Object.defineProperty(exports, "TrustedHeadersStrategy", { enumerable: true, get: function () { return trusted_headers_strategy_1.TrustedHeadersStrategy; } });
21
+ var jwt_strategy_1 = require("./strategies/jwt.strategy");
22
+ Object.defineProperty(exports, "JwtStrategy", { enumerable: true, get: function () { return jwt_strategy_1.JwtStrategy; } });
23
+ // Middlewares
24
+ var authenticate_1 = require("./middlewares/authenticate");
25
+ Object.defineProperty(exports, "authenticate", { enumerable: true, get: function () { return authenticate_1.authenticate; } });
26
+ var require_role_1 = require("./middlewares/require-role");
27
+ Object.defineProperty(exports, "requireRole", { enumerable: true, get: function () { return require_role_1.requireRole; } });
28
+ var require_permission_1 = require("./middlewares/require-permission");
29
+ Object.defineProperty(exports, "requirePermission", { enumerable: true, get: function () { return require_permission_1.requirePermission; } });
30
+ Object.defineProperty(exports, "requireAnyPermission", { enumerable: true, get: function () { return require_permission_1.requireAnyPermission; } });
31
+ var require_tenant_1 = require("./middlewares/require-tenant");
32
+ Object.defineProperty(exports, "requireTenant", { enumerable: true, get: function () { return require_tenant_1.requireTenant; } });
33
+ var require_self_1 = require("./middlewares/require-self");
34
+ Object.defineProperty(exports, "requireSelf", { enumerable: true, get: function () { return require_self_1.requireSelf; } });
35
+ var error_handler_1 = require("./middlewares/error-handler");
36
+ Object.defineProperty(exports, "authErrorHandler", { enumerable: true, get: function () { return error_handler_1.authErrorHandler; } });
37
+ // Utility functions
38
+ var helpers_1 = require("./utils/helpers");
39
+ Object.defineProperty(exports, "hasRole", { enumerable: true, get: function () { return helpers_1.hasRole; } });
40
+ Object.defineProperty(exports, "hasPermission", { enumerable: true, get: function () { return helpers_1.hasPermission; } });
41
+ Object.defineProperty(exports, "hasAnyPermission", { enumerable: true, get: function () { return helpers_1.hasAnyPermission; } });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,gBAAgB;AAChB,mCAA4D;AAAnD,kGAAA,QAAQ,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,qGAAA,WAAW,OAAA;AAKzC,SAAS;AACT,mCAAwE;AAA/D,mGAAA,SAAS,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAErD,kBAAkB;AAClB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAIpB,gFAA6E;AAApE,gIAAA,qBAAqB,OAAA;AAC9B,kFAA+E;AAAtE,kIAAA,sBAAsB,OAAA;AAC/B,0DAAwD;AAA/C,2GAAA,WAAW,OAAA;AAEpB,cAAc;AACd,2DAA0D;AAAjD,4GAAA,YAAY,OAAA;AACrB,2DAAyD;AAAhD,2GAAA,WAAW,OAAA;AACpB,uEAA2F;AAAlF,uHAAA,iBAAiB,OAAA;AAAE,0HAAA,oBAAoB,OAAA;AAChD,+DAA6D;AAApD,+GAAA,aAAa,OAAA;AACtB,2DAAyD;AAAhD,2GAAA,WAAW,OAAA;AACpB,6DAA+D;AAAtD,iHAAA,gBAAgB,OAAA;AAEzB,oBAAoB;AACpB,2CAA2E;AAAlE,kGAAA,OAAO,OAAA;AAAE,wGAAA,aAAa,OAAA;AAAE,2GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,10 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ /**
3
+ * Express middleware that extracts user context from the request.
4
+ * Sets `req.user` with the authenticated AuthUser.
5
+ *
6
+ * Tries gateway header first (production), then falls back to JWT (local dev).
7
+ * Passes UnauthorizedError to next() if no valid auth context is found.
8
+ */
9
+ export declare function authenticate(req: Request, _res: Response, next: NextFunction): void;
10
+ //# sourceMappingURL=authenticate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate.d.ts","sourceRoot":"","sources":["../../src/middlewares/authenticate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAWnF"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authenticate = authenticate;
4
+ const extract_user_1 = require("../extract-user");
5
+ const errors_1 = require("../errors");
6
+ /**
7
+ * Express middleware that extracts user context from the request.
8
+ * Sets `req.user` with the authenticated AuthUser.
9
+ *
10
+ * Tries gateway header first (production), then falls back to JWT (local dev).
11
+ * Passes UnauthorizedError to next() if no valid auth context is found.
12
+ */
13
+ function authenticate(req, _res, next) {
14
+ try {
15
+ req.user = (0, extract_user_1.extractUser)(req);
16
+ next();
17
+ }
18
+ catch (err) {
19
+ if (err instanceof errors_1.UnauthorizedError) {
20
+ next(err);
21
+ return;
22
+ }
23
+ next(new errors_1.UnauthorizedError('Authentication failed'));
24
+ }
25
+ }
26
+ //# sourceMappingURL=authenticate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate.js","sourceRoot":"","sources":["../../src/middlewares/authenticate.ts"],"names":[],"mappings":";;AAWA,oCAWC;AArBD,kDAA8C;AAC9C,sCAA8C;AAE9C;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB;IAC3E,IAAI,CAAC;QACH,GAAG,CAAC,IAAI,GAAG,IAAA,0BAAW,EAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,0BAAiB,EAAE,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,0BAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ /**
3
+ * Express error handler for authentication/authorization errors.
4
+ * Catches AuthError (and subclasses) and returns the standard error envelope.
5
+ * Non-auth errors are passed to the next error handler.
6
+ *
7
+ * Must be registered AFTER all routes:
8
+ * @example
9
+ * app.use(authErrorHandler);
10
+ */
11
+ export declare function authErrorHandler(err: Error, _req: Request, res: Response, next: NextFunction): void;
12
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/middlewares/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,KAAK,EACV,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CAQN"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authErrorHandler = authErrorHandler;
4
+ const errors_1 = require("../errors");
5
+ /**
6
+ * Express error handler for authentication/authorization errors.
7
+ * Catches AuthError (and subclasses) and returns the standard error envelope.
8
+ * Non-auth errors are passed to the next error handler.
9
+ *
10
+ * Must be registered AFTER all routes:
11
+ * @example
12
+ * app.use(authErrorHandler);
13
+ */
14
+ function authErrorHandler(err, _req, res, next) {
15
+ if (err instanceof errors_1.AuthError) {
16
+ res.status(err.statusCode).json(err.toResponse());
17
+ return;
18
+ }
19
+ // Not our error — pass to next error handler
20
+ next(err);
21
+ }
22
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/middlewares/error-handler.ts"],"names":[],"mappings":";;AAYA,4CAaC;AAxBD,sCAAsC;AAEtC;;;;;;;;GAQG;AACH,SAAgB,gBAAgB,CAC9B,GAAU,EACV,IAAa,EACb,GAAa,EACb,IAAkB;IAElB,IAAI,GAAG,YAAY,kBAAS,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ /**
3
+ * Returns middleware that checks if the user has ALL of the required permissions.
4
+ * Admin roles (from config.adminRoles) bypass this check.
5
+ */
6
+ export declare function requirePermission(...permissions: string[]): (req: Request, _res: Response, next: NextFunction) => void;
7
+ /**
8
+ * Returns middleware that checks if the user has AT LEAST ONE of the listed permissions.
9
+ * Admin roles (from config.adminRoles) bypass this check.
10
+ */
11
+ export declare function requireAnyPermission(...permissions: string[]): (req: Request, _res: Response, next: NextFunction) => void;
12
+ //# sourceMappingURL=require-permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-permission.d.ts","sourceRoot":"","sources":["../../src/middlewares/require-permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,IAChD,KAAK,OAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CA6BhE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,IACnD,KAAK,OAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CA6BhE"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requirePermission = requirePermission;
4
+ exports.requireAnyPermission = requireAnyPermission;
5
+ const config_1 = require("../config");
6
+ const errors_1 = require("../errors");
7
+ /**
8
+ * Returns middleware that checks if the user has ALL of the required permissions.
9
+ * Admin roles (from config.adminRoles) bypass this check.
10
+ */
11
+ function requirePermission(...permissions) {
12
+ return (req, _res, next) => {
13
+ if (!req.user) {
14
+ next(new errors_1.UnauthorizedError('Authentication required'));
15
+ return;
16
+ }
17
+ const config = (0, config_1.getConfig)();
18
+ // Admin roles bypass all permission checks
19
+ if (config.adminRoles.includes(req.user.role)) {
20
+ next();
21
+ return;
22
+ }
23
+ const userPerms = new Set(req.user.permissions);
24
+ const missing = permissions.filter((p) => !userPerms.has(p));
25
+ if (missing.length > 0) {
26
+ next(new errors_1.ForbiddenError('Insufficient permissions', {
27
+ required: permissions,
28
+ missing_permissions: missing,
29
+ }));
30
+ return;
31
+ }
32
+ next();
33
+ };
34
+ }
35
+ /**
36
+ * Returns middleware that checks if the user has AT LEAST ONE of the listed permissions.
37
+ * Admin roles (from config.adminRoles) bypass this check.
38
+ */
39
+ function requireAnyPermission(...permissions) {
40
+ return (req, _res, next) => {
41
+ if (!req.user) {
42
+ next(new errors_1.UnauthorizedError('Authentication required'));
43
+ return;
44
+ }
45
+ const config = (0, config_1.getConfig)();
46
+ // Admin roles bypass all permission checks
47
+ if (config.adminRoles.includes(req.user.role)) {
48
+ next();
49
+ return;
50
+ }
51
+ const userPerms = new Set(req.user.permissions);
52
+ const hasAny = permissions.some((p) => userPerms.has(p));
53
+ if (!hasAny) {
54
+ next(new errors_1.ForbiddenError('Insufficient permissions — need at least one', {
55
+ required_any: permissions,
56
+ actual: req.user.permissions,
57
+ }));
58
+ return;
59
+ }
60
+ next();
61
+ };
62
+ }
63
+ //# sourceMappingURL=require-permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-permission.js","sourceRoot":"","sources":["../../src/middlewares/require-permission.ts"],"names":[],"mappings":";;AAQA,8CA8BC;AAMD,oDA8BC;AAzED,sCAAsC;AACtC,sCAA8D;AAE9D;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,GAAG,WAAqB;IACxD,OAAO,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB,EAAQ,EAAE;QAChE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,0BAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAE3B,2CAA2C;QAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CACF,IAAI,uBAAc,CAAC,0BAA0B,EAAE;gBAC7C,QAAQ,EAAE,WAAW;gBACrB,mBAAmB,EAAE,OAAO;aAC7B,CAAC,CACH,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,GAAG,WAAqB;IAC3D,OAAO,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB,EAAQ,EAAE;QAChE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,0BAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAE3B,2CAA2C;QAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CACF,IAAI,uBAAc,CAAC,8CAA8C,EAAE;gBACjE,YAAY,EAAE,WAAW;gBACzB,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW;aAC7B,CAAC,CACH,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ /**
3
+ * Returns middleware that checks if the authenticated user has one of the allowed roles.
4
+ *
5
+ * @param roles - One or more allowed role strings
6
+ * @returns Express middleware
7
+ *
8
+ * @example
9
+ * app.delete('/v1/vehicles/:id', authenticate, requireRole('super_admin', 'fleet_manager'), handler);
10
+ */
11
+ export declare function requireRole(...roles: string[]): (req: Request, _res: Response, next: NextFunction) => void;
12
+ //# sourceMappingURL=require-role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-role.d.ts","sourceRoot":"","sources":["../../src/middlewares/require-role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,IACpC,KAAK,OAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAkBhE"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireRole = requireRole;
4
+ const errors_1 = require("../errors");
5
+ /**
6
+ * Returns middleware that checks if the authenticated user has one of the allowed roles.
7
+ *
8
+ * @param roles - One or more allowed role strings
9
+ * @returns Express middleware
10
+ *
11
+ * @example
12
+ * app.delete('/v1/vehicles/:id', authenticate, requireRole('super_admin', 'fleet_manager'), handler);
13
+ */
14
+ function requireRole(...roles) {
15
+ return (req, _res, next) => {
16
+ if (!req.user) {
17
+ next(new errors_1.UnauthorizedError('Authentication required'));
18
+ return;
19
+ }
20
+ if (!roles.includes(req.user.role)) {
21
+ next(new errors_1.ForbiddenError('Insufficient role', {
22
+ required: roles,
23
+ actual: req.user.role,
24
+ }));
25
+ return;
26
+ }
27
+ next();
28
+ };
29
+ }
30
+ //# sourceMappingURL=require-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-role.js","sourceRoot":"","sources":["../../src/middlewares/require-role.ts"],"names":[],"mappings":";;AAYA,kCAmBC;AA9BD,sCAA8D;AAE9D;;;;;;;;GAQG;AACH,SAAgB,WAAW,CAAC,GAAG,KAAe;IAC5C,OAAO,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB,EAAQ,EAAE;QAChE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,0BAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CACF,IAAI,uBAAc,CAAC,mBAAmB,EAAE;gBACtC,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;aACtB,CAAC,CACH,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ /**
3
+ * Returns middleware that ensures the authenticated user can only access their own resources.
4
+ * Compares `req.user.userId` with `req.params[paramName]`.
5
+ * Admin roles (from config.adminRoles) bypass this check.
6
+ *
7
+ * @param paramName - Route parameter name to compare against. Default: 'userId'
8
+ */
9
+ export declare function requireSelf(paramName?: string): (req: Request, _res: Response, next: NextFunction) => void;
10
+ //# sourceMappingURL=require-self.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-self.d.ts","sourceRoot":"","sources":["../../src/middlewares/require-self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,SAAS,SAAW,IACtC,KAAK,OAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAiChE"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireSelf = requireSelf;
4
+ const config_1 = require("../config");
5
+ const errors_1 = require("../errors");
6
+ /**
7
+ * Returns middleware that ensures the authenticated user can only access their own resources.
8
+ * Compares `req.user.userId` with `req.params[paramName]`.
9
+ * Admin roles (from config.adminRoles) bypass this check.
10
+ *
11
+ * @param paramName - Route parameter name to compare against. Default: 'userId'
12
+ */
13
+ function requireSelf(paramName = 'userId') {
14
+ return (req, _res, next) => {
15
+ if (!req.user) {
16
+ next(new errors_1.UnauthorizedError('Authentication required'));
17
+ return;
18
+ }
19
+ const config = (0, config_1.getConfig)();
20
+ // Admin roles bypass self check
21
+ if (config.adminRoles.includes(req.user.role)) {
22
+ next();
23
+ return;
24
+ }
25
+ const targetUserId = req.params[paramName];
26
+ if (!targetUserId) {
27
+ next(new errors_1.ForbiddenError(`Route parameter '${paramName}' is missing`));
28
+ return;
29
+ }
30
+ if (req.user.userId !== targetUserId) {
31
+ next(new errors_1.ForbiddenError('You can only access your own resources', {
32
+ target: targetUserId,
33
+ actual: req.user.userId,
34
+ }));
35
+ return;
36
+ }
37
+ next();
38
+ };
39
+ }
40
+ //# sourceMappingURL=require-self.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-self.js","sourceRoot":"","sources":["../../src/middlewares/require-self.ts"],"names":[],"mappings":";;AAWA,kCAkCC;AA5CD,sCAAsC;AACtC,sCAA8D;AAE9D;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,SAAS,GAAG,QAAQ;IAC9C,OAAO,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB,EAAQ,EAAE;QAChE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,0BAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAE3B,gCAAgC;QAChC,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,uBAAc,CAAC,oBAAoB,SAAS,cAAc,CAAC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACrC,IAAI,CACF,IAAI,uBAAc,CAAC,wCAAwC,EAAE;gBAC3D,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;aACxB,CAAC,CACH,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ /**
3
+ * Middleware that ensures the authenticated user has a tenantId.
4
+ * Sets `req.tenantId` for convenience in downstream handlers.
5
+ *
6
+ * @example
7
+ * app.get('/v1/vehicles', authenticate, requireTenant, handler);
8
+ * // handler can use req.tenantId directly
9
+ */
10
+ export declare function requireTenant(req: Request, _res: Response, next: NextFunction): void;
11
+ //# sourceMappingURL=require-tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-tenant.d.ts","sourceRoot":"","sources":["../../src/middlewares/require-tenant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAapF"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireTenant = requireTenant;
4
+ const errors_1 = require("../errors");
5
+ /**
6
+ * Middleware that ensures the authenticated user has a tenantId.
7
+ * Sets `req.tenantId` for convenience in downstream handlers.
8
+ *
9
+ * @example
10
+ * app.get('/v1/vehicles', authenticate, requireTenant, handler);
11
+ * // handler can use req.tenantId directly
12
+ */
13
+ function requireTenant(req, _res, next) {
14
+ if (!req.user) {
15
+ next(new errors_1.UnauthorizedError('Authentication required'));
16
+ return;
17
+ }
18
+ if (!req.user.tenantId) {
19
+ next(new errors_1.ForbiddenError('Tenant context required'));
20
+ return;
21
+ }
22
+ req.tenantId = req.user.tenantId;
23
+ next();
24
+ }
25
+ //# sourceMappingURL=require-tenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-tenant.js","sourceRoot":"","sources":["../../src/middlewares/require-tenant.ts"],"names":[],"mappings":";;AAWA,sCAaC;AAvBD,sCAA8D;AAE9D;;;;;;;GAOG;AACH,SAAgB,aAAa,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB;IAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,0BAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,uBAAc,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IACjC,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const GT_AUTH_CONFIG = "GT_AUTH_CONFIG";
2
+ export declare const IS_PUBLIC_KEY = "isPublic";
3
+ export declare const PERMISSIONS_KEY = "permissions";
4
+ export declare const ROLES_KEY = "roles";
5
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/nestjs/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAC7C,eAAO,MAAM,SAAS,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ROLES_KEY = exports.PERMISSIONS_KEY = exports.IS_PUBLIC_KEY = exports.GT_AUTH_CONFIG = void 0;
4
+ exports.GT_AUTH_CONFIG = 'GT_AUTH_CONFIG';
5
+ exports.IS_PUBLIC_KEY = 'isPublic';
6
+ exports.PERMISSIONS_KEY = 'permissions';
7
+ exports.ROLES_KEY = 'roles';
8
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/nestjs/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,aAAa,GAAG,UAAU,CAAC;AAC3B,QAAA,eAAe,GAAG,aAAa,CAAC;AAChC,QAAA,SAAS,GAAG,OAAO,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { AuthUser } from '../../types';
2
+ /**
3
+ * Extract the authenticated user (or a specific property) from the request.
4
+ *
5
+ * @example
6
+ * @Get()
7
+ * getProfile(@CurrentUser() user: AuthUser) { ... }
8
+ *
9
+ * @Get()
10
+ * getProfile(@CurrentUser('userId') userId: string) { ... }
11
+ */
12
+ export declare const CurrentUser: (...dataOrPipes: (keyof AuthUser | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>> | undefined)[]) => ParameterDecorator;
13
+ /**
14
+ * Extract the current organization ID from the authenticated user.
15
+ *
16
+ * @example
17
+ * @Get()
18
+ * list(@CurrentOrg() orgId: string) { ... }
19
+ */
20
+ export declare const CurrentOrg: (...dataOrPipes: unknown[]) => ParameterDecorator;
21
+ /**
22
+ * Mark a route as public — bypasses InternalOnlyGuard and PermissionsGuard.
23
+ */
24
+ export declare const Public: () => import("@nestjs/common").CustomDecorator<string>;
25
+ /**
26
+ * Require specific permissions on a route.
27
+ * Format: 'resource:action' e.g. 'vehicles:create', 'geofences:read'
28
+ *
29
+ * @example
30
+ * @Post()
31
+ * @RequirePermissions('vehicles:create')
32
+ * create(@Body() dto: CreateVehicleDto) { ... }
33
+ */
34
+ export declare const RequirePermissions: (...permissions: string[]) => import("@nestjs/common").CustomDecorator<string>;
35
+ /**
36
+ * Require specific roles on a route.
37
+ *
38
+ * @example
39
+ * @Delete(':id')
40
+ * @RequireRoles('system_admin')
41
+ * remove(@Param('id') id: string) { ... }
42
+ */
43
+ export declare const RequireRoles: (...roles: string[]) => import("@nestjs/common").CustomDecorator<string>;
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/nestjs/decorators/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,6MASvB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,mDAKtB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,wDAAyC,CAAC;AAE7D;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,aAAa,MAAM,EAAE,qDAChB,CAAC;AAE5C;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,OAAO,MAAM,EAAE,qDAChB,CAAC"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RequireRoles = exports.RequirePermissions = exports.Public = exports.CurrentOrg = exports.CurrentUser = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const constants_1 = require("../constants");
6
+ /**
7
+ * Extract the authenticated user (or a specific property) from the request.
8
+ *
9
+ * @example
10
+ * @Get()
11
+ * getProfile(@CurrentUser() user: AuthUser) { ... }
12
+ *
13
+ * @Get()
14
+ * getProfile(@CurrentUser('userId') userId: string) { ... }
15
+ */
16
+ exports.CurrentUser = (0, common_1.createParamDecorator)((data, ctx) => {
17
+ const request = ctx.switchToHttp().getRequest();
18
+ const user = request.user;
19
+ if (data) {
20
+ return user?.[data];
21
+ }
22
+ return user;
23
+ });
24
+ /**
25
+ * Extract the current organization ID from the authenticated user.
26
+ *
27
+ * @example
28
+ * @Get()
29
+ * list(@CurrentOrg() orgId: string) { ... }
30
+ */
31
+ exports.CurrentOrg = (0, common_1.createParamDecorator)((_data, ctx) => {
32
+ const request = ctx.switchToHttp().getRequest();
33
+ return request.user?.orgId;
34
+ });
35
+ /**
36
+ * Mark a route as public — bypasses InternalOnlyGuard and PermissionsGuard.
37
+ */
38
+ const Public = () => (0, common_1.SetMetadata)(constants_1.IS_PUBLIC_KEY, true);
39
+ exports.Public = Public;
40
+ /**
41
+ * Require specific permissions on a route.
42
+ * Format: 'resource:action' e.g. 'vehicles:create', 'geofences:read'
43
+ *
44
+ * @example
45
+ * @Post()
46
+ * @RequirePermissions('vehicles:create')
47
+ * create(@Body() dto: CreateVehicleDto) { ... }
48
+ */
49
+ const RequirePermissions = (...permissions) => (0, common_1.SetMetadata)(constants_1.PERMISSIONS_KEY, permissions);
50
+ exports.RequirePermissions = RequirePermissions;
51
+ /**
52
+ * Require specific roles on a route.
53
+ *
54
+ * @example
55
+ * @Delete(':id')
56
+ * @RequireRoles('system_admin')
57
+ * remove(@Param('id') id: string) { ... }
58
+ */
59
+ const RequireRoles = (...roles) => (0, common_1.SetMetadata)(constants_1.ROLES_KEY, roles);
60
+ exports.RequireRoles = RequireRoles;
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/nestjs/decorators/index.ts"],"names":[],"mappings":";;;AAAA,2CAAqF;AAErF,4CAAyE;AAEzE;;;;;;;;;GASG;AACU,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAAC,IAAgC,EAAE,GAAqB,EAAE,EAAE;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAChD,MAAM,IAAI,GAAyB,OAAO,CAAC,IAAI,CAAC;IAChD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CACF,CAAC;AAEF;;;;;;GAMG;AACU,QAAA,UAAU,GAAG,IAAA,6BAAoB,EAC5C,CAAC,KAAc,EAAE,GAAqB,EAAE,EAAE;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAC7B,CAAC,CACF,CAAC;AAEF;;GAEG;AACI,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAA,oBAAW,EAAC,yBAAa,EAAE,IAAI,CAAC,CAAC;AAAhD,QAAA,MAAM,UAA0C;AAE7D;;;;;;;;GAQG;AACI,MAAM,kBAAkB,GAAG,CAAC,GAAG,WAAqB,EAAE,EAAE,CAC7D,IAAA,oBAAW,EAAC,2BAAe,EAAE,WAAW,CAAC,CAAC;AAD/B,QAAA,kBAAkB,sBACa;AAE5C;;;;;;;GAOG;AACI,MAAM,YAAY,GAAG,CAAC,GAAG,KAAe,EAAE,EAAE,CACjD,IAAA,oBAAW,EAAC,qBAAS,EAAE,KAAK,CAAC,CAAC;AADnB,QAAA,YAAY,gBACO"}
@@ -0,0 +1,16 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ import { AuthError } from '../../errors';
3
+ /**
4
+ * NestJS exception filter for AuthError and its subclasses.
5
+ * Returns the standard Global Tracking error envelope via toResponse().
6
+ *
7
+ * Register globally or per-controller:
8
+ * ```
9
+ * app.useGlobalFilters(new AuthExceptionFilter());
10
+ * ```
11
+ */
12
+ export declare class AuthExceptionFilter implements ExceptionFilter {
13
+ private readonly logger;
14
+ catch(exception: AuthError, host: ArgumentsHost): void;
15
+ }
16
+ //# sourceMappingURL=auth-exception.filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-exception.filter.d.ts","sourceRoot":"","sources":["../../../src/nestjs/filters/auth-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAS,eAAe,EAAU,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;GAQG;AACH,qBACa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAQvD"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var AuthExceptionFilter_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.AuthExceptionFilter = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const errors_1 = require("../../errors");
13
+ /**
14
+ * NestJS exception filter for AuthError and its subclasses.
15
+ * Returns the standard Global Tracking error envelope via toResponse().
16
+ *
17
+ * Register globally or per-controller:
18
+ * ```
19
+ * app.useGlobalFilters(new AuthExceptionFilter());
20
+ * ```
21
+ */
22
+ let AuthExceptionFilter = AuthExceptionFilter_1 = class AuthExceptionFilter {
23
+ constructor() {
24
+ this.logger = new common_1.Logger(AuthExceptionFilter_1.name);
25
+ }
26
+ catch(exception, host) {
27
+ const ctx = host.switchToHttp();
28
+ const response = ctx.getResponse();
29
+ this.logger.warn(`${exception.code}: ${exception.message}`);
30
+ response.status(exception.statusCode).json(exception.toResponse());
31
+ }
32
+ };
33
+ exports.AuthExceptionFilter = AuthExceptionFilter;
34
+ exports.AuthExceptionFilter = AuthExceptionFilter = AuthExceptionFilter_1 = __decorate([
35
+ (0, common_1.Catch)(errors_1.AuthError)
36
+ ], AuthExceptionFilter);
37
+ //# sourceMappingURL=auth-exception.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-exception.filter.js","sourceRoot":"","sources":["../../../src/nestjs/filters/auth-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+E;AAE/E,yCAAyC;AAEzC;;;;;;;;GAQG;AAEI,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAAzB;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;IAUjE,CAAC;IARC,KAAK,CAAC,SAAoB,EAAE,IAAmB;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAY,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAE5D,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;IACrE,CAAC;CACF,CAAA;AAXY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,cAAK,EAAC,kBAAS,CAAC;GACJ,mBAAmB,CAW/B"}
@@ -0,0 +1,31 @@
1
+ import { DynamicModule, MiddlewareConsumer, NestModule } from '@nestjs/common';
2
+ import { AuthConfig } from '../types';
3
+ export interface GtAuthModuleOptions extends AuthConfig {
4
+ }
5
+ export interface GtAuthModuleAsyncOptions {
6
+ imports?: any[];
7
+ inject?: any[];
8
+ useFactory: (...args: any[]) => GtAuthModuleOptions | Promise<GtAuthModuleOptions>;
9
+ }
10
+ /**
11
+ * NestJS dynamic module for Global Tracking authentication and authorization.
12
+ *
13
+ * Provides: InternalOnlyGuard, GtPermissionsGuard, GtAuthGuard,
14
+ * OrgContextInterceptor, AuthExceptionFilter, and the GtTrustedHeadersMiddleware.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * GtAuthModule.forRoot({
19
+ * strategies: ['trusted-headers'],
20
+ * internalGatewayToken: 'secret',
21
+ * adminRoles: ['system_admin', 'org_admin'],
22
+ * rbacServiceUrl: 'http://gt-rbac-service:3000',
23
+ * })
24
+ * ```
25
+ */
26
+ export declare class GtAuthModule implements NestModule {
27
+ configure(consumer: MiddlewareConsumer): void;
28
+ static forRoot(options?: GtAuthModuleOptions): DynamicModule;
29
+ static forRootAsync(options: GtAuthModuleAsyncOptions): DynamicModule;
30
+ }
31
+ //# sourceMappingURL=gt-auth.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gt-auth.module.d.ts","sourceRoot":"","sources":["../../src/nestjs/gt-auth.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAUtC,MAAM,WAAW,mBAAoB,SAAQ,UAAU;CAAG;AAE1D,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACpF;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBACa,YAAa,YAAW,UAAU;IAC7C,SAAS,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAI7C,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa;IA4BhE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa;CA+BtE"}