permissions-contractx 1.0.2 → 1.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.
Files changed (87) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +53 -1346
  3. package/dist/constants/contractx-permissions.constants.d.ts +84 -92
  4. package/dist/constants/contractx-permissions.constants.d.ts.map +1 -1
  5. package/dist/constants/contractx-permissions.constants.js +2 -2
  6. package/dist/constants/contractx-roles.constants.d.ts +150 -254
  7. package/dist/constants/contractx-roles.constants.d.ts.map +1 -1
  8. package/dist/constants/contractx-roles.constants.js +2 -2
  9. package/dist/constants/index.d.ts +1 -0
  10. package/dist/constants/index.d.ts.map +1 -1
  11. package/dist/constants/index.js +1 -0
  12. package/dist/constants/permission-names.constants.d.ts +310 -0
  13. package/dist/constants/permission-names.constants.d.ts.map +1 -0
  14. package/dist/constants/permission-names.constants.js +209 -0
  15. package/dist/constants/security.constants.d.ts +49 -49
  16. package/dist/constants/security.constants.d.ts.map +1 -1
  17. package/dist/constants/security.constants.js +2 -2
  18. package/dist/decorators/current-user.decorator.d.ts +5 -53
  19. package/dist/decorators/current-user.decorator.d.ts.map +1 -1
  20. package/dist/decorators/current-user.decorator.js +4 -51
  21. package/dist/decorators/index.d.ts +1 -0
  22. package/dist/decorators/index.d.ts.map +1 -1
  23. package/dist/decorators/index.js +1 -0
  24. package/dist/decorators/permission-writes.decorator.d.ts +14 -0
  25. package/dist/decorators/permission-writes.decorator.d.ts.map +1 -0
  26. package/dist/decorators/permission-writes.decorator.js +18 -0
  27. package/dist/decorators/permissions.decorator.d.ts +0 -58
  28. package/dist/decorators/permissions.decorator.d.ts.map +1 -1
  29. package/dist/decorators/permissions.decorator.js +0 -58
  30. package/dist/decorators/public.decorator.d.ts +0 -0
  31. package/dist/decorators/public.decorator.d.ts.map +0 -0
  32. package/dist/decorators/public.decorator.js +0 -0
  33. package/dist/decorators/roles.decorator.d.ts +4 -57
  34. package/dist/decorators/roles.decorator.d.ts.map +1 -1
  35. package/dist/decorators/roles.decorator.js +6 -57
  36. package/dist/guards/authorization.guard.d.ts +37 -0
  37. package/dist/guards/authorization.guard.d.ts.map +1 -0
  38. package/dist/guards/authorization.guard.js +150 -0
  39. package/dist/guards/index.d.ts +1 -0
  40. package/dist/guards/index.d.ts.map +1 -1
  41. package/dist/guards/index.js +1 -0
  42. package/dist/guards/jwt-auth.guard.d.ts +0 -0
  43. package/dist/guards/jwt-auth.guard.d.ts.map +1 -1
  44. package/dist/guards/jwt-auth.guard.js +0 -0
  45. package/dist/guards/permissions.guard.d.ts +0 -0
  46. package/dist/guards/permissions.guard.d.ts.map +1 -1
  47. package/dist/guards/permissions.guard.js +8 -2
  48. package/dist/guards/roles.guard.d.ts +0 -0
  49. package/dist/guards/roles.guard.d.ts.map +1 -1
  50. package/dist/guards/roles.guard.js +1 -1
  51. package/dist/index.d.ts +0 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +0 -6
  54. package/dist/interfaces/index.d.ts +1 -0
  55. package/dist/interfaces/index.d.ts.map +1 -1
  56. package/dist/interfaces/index.js +1 -0
  57. package/dist/interfaces/jwt-payload.interface.d.ts +46 -9
  58. package/dist/interfaces/jwt-payload.interface.d.ts.map +1 -1
  59. package/dist/interfaces/jwt-payload.interface.js +19 -0
  60. package/dist/interfaces/permission-mode.enum.d.ts +22 -0
  61. package/dist/interfaces/permission-mode.enum.d.ts.map +1 -0
  62. package/dist/interfaces/permission-mode.enum.js +25 -0
  63. package/dist/modules/index.d.ts +0 -0
  64. package/dist/modules/index.d.ts.map +0 -0
  65. package/dist/modules/index.js +0 -0
  66. package/dist/modules/permissions-contractx.module.d.ts +0 -0
  67. package/dist/modules/permissions-contractx.module.d.ts.map +1 -1
  68. package/dist/modules/permissions-contractx.module.js +4 -2
  69. package/dist/services/contractx-authorization.service.d.ts +198 -27
  70. package/dist/services/contractx-authorization.service.d.ts.map +1 -1
  71. package/dist/services/contractx-authorization.service.js +2 -0
  72. package/dist/services/contractx-validation.service.d.ts +93 -12
  73. package/dist/services/contractx-validation.service.d.ts.map +1 -1
  74. package/dist/services/contractx-validation.service.js +1 -0
  75. package/dist/services/index.d.ts +0 -2
  76. package/dist/services/index.d.ts.map +1 -1
  77. package/dist/services/index.js +2 -0
  78. package/dist/services/user-context.service.d.ts +29 -34
  79. package/dist/services/user-context.service.d.ts.map +1 -1
  80. package/dist/services/user-context.service.js +65 -44
  81. package/package.json +5 -24
  82. package/dist/services/contractx-document-compliance.service.d.ts +0 -85
  83. package/dist/services/contractx-document-compliance.service.d.ts.map +0 -1
  84. package/dist/services/contractx-document-compliance.service.js +0 -536
  85. package/dist/test-document-compliance.d.ts +0 -7
  86. package/dist/test-document-compliance.d.ts.map +0 -1
  87. package/dist/test-document-compliance.js +0 -118
@@ -12,72 +12,21 @@ exports.ROLES_KEY = 'roles';
12
12
  * User must have at least one of the specified roles (OR logic).
13
13
  *
14
14
  * @param roles - Array of role names required to access the route
15
- *
16
- * @example
17
- * ```typescript
18
- * @Roles('superadmin', 'client_contract_admin')
19
- * @Get('admin-data')
20
- * getAdminData() {
21
- * // Only users with superadmin OR client_contract_admin role
22
- * }
23
- * ```
24
15
  */
25
16
  const Roles = (...roles) => (0, common_1.SetMetadata)(exports.ROLES_KEY, roles);
26
17
  exports.Roles = Roles;
27
- /**
28
- * Decorator for ContractX specific admin roles
29
- *
30
- * @example
31
- * ```typescript
32
- * @AdminOnly()
33
- * @Delete(':id')
34
- * deleteResource() {
35
- * // Only admin roles can access
36
- * }
37
- * ```
38
- */
18
+ // NOTA[reconstrucción]: los helpers de abajo hardcodean nombres de rol del vocabulario VIEJO
19
+ // (superadmin, client_performance_manager, ...) "se reemplaza" al portar al modelo nuevo.
20
+ /** Decorator for ContractX specific admin roles */
39
21
  const AdminOnly = () => (0, exports.Roles)('superadmin', 'client_contract_admin', 'provider_contract_admin');
40
22
  exports.AdminOnly = AdminOnly;
41
- /**
42
- * Decorator for client-side roles only
43
- *
44
- * @example
45
- * ```typescript
46
- * @ClientOnly()
47
- * @Get('client-data')
48
- * getClientData() {
49
- * // Only client-side roles can access
50
- * }
51
- * ```
52
- */
23
+ /** Decorator for client-side roles only */
53
24
  const ClientOnly = () => (0, exports.Roles)('client_contract_admin', 'client_performance_manager', 'client_finance_manager', 'client_reports_manager', 'client_relationship_manager', 'client_risk_manager');
54
25
  exports.ClientOnly = ClientOnly;
55
- /**
56
- * Decorator for provider-side roles only
57
- *
58
- * @example
59
- * ```typescript
60
- * @ProviderOnly()
61
- * @Get('provider-data')
62
- * getProviderData() {
63
- * // Only provider-side roles can access
64
- * }
65
- * ```
66
- */
26
+ /** Decorator for provider-side roles only */
67
27
  const ProviderOnly = () => (0, exports.Roles)('provider_contract_admin', 'provider_performance_manager', 'provider_finance_manager', 'provider_reports_manager', 'provider_relationship_manager', 'provider_risk_manager');
68
28
  exports.ProviderOnly = ProviderOnly;
69
- /**
70
- * Decorator for superadmin access only
71
- *
72
- * @example
73
- * ```typescript
74
- * @SuperAdminOnly()
75
- * @Post('system/configure')
76
- * configureSystem() {
77
- * // Only superadmin can access
78
- * }
79
- * ```
80
- */
29
+ /** Decorator for superadmin access only */
81
30
  const SuperAdminOnly = () => (0, exports.Roles)('superadmin');
82
31
  exports.SuperAdminOnly = SuperAdminOnly;
83
32
  /**
@@ -0,0 +1,37 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ /**
4
+ * [ADR-004] AuthorizationGuard — guard de 4 estados portado desde Auth.
5
+ *
6
+ * Lee dos conjuntos ya resueltos del JWT (la resolución deny-wins ocurre en Auth,
7
+ * vía resolvePermissionEntitlements, NO aquí):
8
+ * - user.permissions = acceso pleno (write/full)
9
+ * - user.permissionsView = modo-ver (👁, solo lectura)
10
+ *
11
+ * Eje lectura/escritura (D3): por método HTTP (GET/HEAD/OPTIONS = lectura), salvo
12
+ * override @PermissionWrites. En lectura vale acceso pleno O modo-ver; en escritura
13
+ * SOLO acceso pleno (modo-ver bloquea).
14
+ *
15
+ * Doble gateo rol+permiso (D4) vía env AUTHZ_ENFORCEMENT:
16
+ * - legacy (default): rol O permiso (comportamiento previo, sin cambio).
17
+ * - observe: el rol decide; se loguea la discrepancia con el permiso (recolección).
18
+ * - strict: el permiso decide.
19
+ */
20
+ export declare class AuthorizationGuard implements CanActivate {
21
+ private reflector;
22
+ private readonly logger;
23
+ constructor(reflector: Reflector);
24
+ canActivate(context: ExecutionContext): boolean;
25
+ /**
26
+ * [D4] Modo de enforcement del doble gateo, vía env `AUTHZ_ENFORCEMENT`.
27
+ * Default 'legacy' ⇒ comportamiento previo (rol O permiso) sin cambio hasta optar in.
28
+ */
29
+ private resolveEnforcementMode;
30
+ /**
31
+ * Clasifica la petición como escritura o lectura para el eje modo-ver (D3).
32
+ * Override explícito @PermissionWrites(boolean) gana; si no, cae por método HTTP
33
+ * (GET/HEAD/OPTIONS = lectura; el resto = escritura).
34
+ */
35
+ private isWriteRequest;
36
+ }
37
+ //# sourceMappingURL=authorization.guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.guard.d.ts","sourceRoot":"","sources":["../../src/guards/authorization.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAGjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAWzC;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,kBAAmB,YAAW,WAAW;IAGxC,OAAO,CAAC,SAAS;IAF7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAE1C,SAAS,EAAE,SAAS;IAExC,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;IA+G/C;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;;;OAIG;IACH,OAAO,CAAC,cAAc;CAUvB"}
@@ -0,0 +1,150 @@
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 __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AuthorizationGuard_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AuthorizationGuard = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const core_1 = require("@nestjs/core");
16
+ const permission_writes_decorator_1 = require("../decorators/permission-writes.decorator");
17
+ const READ_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
18
+ /**
19
+ * [ADR-004] AuthorizationGuard — guard de 4 estados portado desde Auth.
20
+ *
21
+ * Lee dos conjuntos ya resueltos del JWT (la resolución deny-wins ocurre en Auth,
22
+ * vía resolvePermissionEntitlements, NO aquí):
23
+ * - user.permissions = acceso pleno (write/full)
24
+ * - user.permissionsView = modo-ver (👁, solo lectura)
25
+ *
26
+ * Eje lectura/escritura (D3): por método HTTP (GET/HEAD/OPTIONS = lectura), salvo
27
+ * override @PermissionWrites. En lectura vale acceso pleno O modo-ver; en escritura
28
+ * SOLO acceso pleno (modo-ver bloquea).
29
+ *
30
+ * Doble gateo rol+permiso (D4) vía env AUTHZ_ENFORCEMENT:
31
+ * - legacy (default): rol O permiso (comportamiento previo, sin cambio).
32
+ * - observe: el rol decide; se loguea la discrepancia con el permiso (recolección).
33
+ * - strict: el permiso decide.
34
+ */
35
+ let AuthorizationGuard = AuthorizationGuard_1 = class AuthorizationGuard {
36
+ constructor(reflector) {
37
+ this.reflector = reflector;
38
+ this.logger = new common_1.Logger(AuthorizationGuard_1.name);
39
+ }
40
+ canActivate(context) {
41
+ const requiredRoles = this.reflector.getAllAndOverride('roles', [
42
+ context.getHandler(),
43
+ context.getClass(),
44
+ ]);
45
+ const requiredPermissions = this.reflector.getAllAndOverride('permissions', [
46
+ context.getHandler(),
47
+ context.getClass(),
48
+ ]);
49
+ if ((!requiredRoles || requiredRoles.length === 0) &&
50
+ (!requiredPermissions || requiredPermissions.length === 0)) {
51
+ return true;
52
+ }
53
+ const request = context.switchToHttp().getRequest();
54
+ const user = request.user;
55
+ if (!user) {
56
+ this.logger.warn('No user found in request context for authorization');
57
+ throw new common_1.ForbiddenException('Authentication required for access');
58
+ }
59
+ const userId = user.sub;
60
+ const userRoles = user.role || [];
61
+ // Dos conjuntos resueltos en la carga del JWT: permissions = acceso pleno;
62
+ // permissionsView = modo-ver (solo lectura). Las filas `deny` ya fueron retiradas
63
+ // en origen (resolvePermissionEntitlements), así que el guard no necesita conocer
64
+ // grant_type — la decisión es pertenencia a estos arrays.
65
+ const userPermissions = user.permissions || [];
66
+ const userPermissionsView = user.permissionsView || [];
67
+ let hasRole = true;
68
+ if (requiredRoles && requiredRoles.length > 0) {
69
+ hasRole = requiredRoles.some((role) => userRoles.includes(role));
70
+ if (!hasRole) {
71
+ this.logger.warn(`Role access denied: User ${userId} with roles [${userRoles.join(', ')}] attempted to access resource requiring [${requiredRoles.join(', ')}]`);
72
+ }
73
+ }
74
+ let hasPermissions = true;
75
+ if (requiredPermissions && requiredPermissions.length > 0) {
76
+ // Eje lectura/escritura (D3): por método HTTP, salvo override @PermissionWrites.
77
+ const isWrite = this.isWriteRequest(context, request.method);
78
+ // Lectura: vale acceso pleno O modo-ver. Escritura: SOLO acceso pleno (modo-ver bloquea).
79
+ const allowsCode = (permission) => isWrite
80
+ ? userPermissions.includes(permission)
81
+ : userPermissions.includes(permission) || userPermissionsView.includes(permission);
82
+ hasPermissions = requiredPermissions.every(allowsCode);
83
+ if (!hasPermissions) {
84
+ const missingPermissions = requiredPermissions.filter((permission) => !allowsCode(permission));
85
+ const viewOnlyBlocked = requiredPermissions.filter((permission) => isWrite && userPermissionsView.includes(permission) && !userPermissions.includes(permission));
86
+ this.logger.warn(`Permission access denied: User ${userId} (${isWrite ? 'write' : 'read'}) missing [${missingPermissions.join(', ')}]` +
87
+ (viewOnlyBlocked.length ? ` — view-only on [${viewOnlyBlocked.join(', ')}] cannot write` : ''));
88
+ }
89
+ }
90
+ const bothPresent = requiredRoles && requiredRoles.length > 0 && requiredPermissions && requiredPermissions.length > 0;
91
+ let hasAccess;
92
+ if (bothPresent) {
93
+ const mode = this.resolveEnforcementMode();
94
+ if (mode === 'observe') {
95
+ if (hasRole !== hasPermissions) {
96
+ this.logger.warn(`AUTHZ_DISCREPANCY user=${userId} ${request.method ?? '?'} ${request.url ?? '?'} ` +
97
+ `role_decides=${hasRole} permission_would=${hasPermissions} ` +
98
+ `roles=[${(requiredRoles ?? []).join(', ')}] perms=[${(requiredPermissions ?? []).join(', ')}]`);
99
+ }
100
+ hasAccess = hasRole;
101
+ }
102
+ else if (mode === 'strict') {
103
+ hasAccess = hasPermissions;
104
+ }
105
+ else {
106
+ hasAccess = hasRole || hasPermissions;
107
+ }
108
+ }
109
+ else {
110
+ // Solo uno presente → ése decide (el ausente quedó en true por defecto).
111
+ hasAccess = hasRole && hasPermissions;
112
+ }
113
+ if (!hasAccess) {
114
+ const roleMsg = requiredRoles?.length > 0 ? `roles: [${requiredRoles.join(', ')}]` : '';
115
+ const permMsg = requiredPermissions?.length > 0 ? `permissions: [${requiredPermissions.join(', ')}]` : '';
116
+ const requirements = [roleMsg, permMsg].filter(Boolean).join(' or ');
117
+ throw new common_1.ForbiddenException(`Access denied. Required ${requirements}`);
118
+ }
119
+ this.logger.debug(`Authorization granted: User ${userId} accessing resource with roles [${userRoles.join(', ')}] and permissions [${userPermissions.join(', ')}]`);
120
+ return true;
121
+ }
122
+ /**
123
+ * [D4] Modo de enforcement del doble gateo, vía env `AUTHZ_ENFORCEMENT`.
124
+ * Default 'legacy' ⇒ comportamiento previo (rol O permiso) sin cambio hasta optar in.
125
+ */
126
+ resolveEnforcementMode() {
127
+ const v = (process.env.AUTHZ_ENFORCEMENT ?? 'legacy').toLowerCase();
128
+ return v === 'observe' || v === 'strict' ? v : 'legacy';
129
+ }
130
+ /**
131
+ * Clasifica la petición como escritura o lectura para el eje modo-ver (D3).
132
+ * Override explícito @PermissionWrites(boolean) gana; si no, cae por método HTTP
133
+ * (GET/HEAD/OPTIONS = lectura; el resto = escritura).
134
+ */
135
+ isWriteRequest(context, method) {
136
+ const override = this.reflector.getAllAndOverride(permission_writes_decorator_1.PERMISSION_WRITES_KEY, [
137
+ context.getHandler(),
138
+ context.getClass(),
139
+ ]);
140
+ if (typeof override === 'boolean') {
141
+ return override;
142
+ }
143
+ return !READ_METHODS.has((method ?? '').toUpperCase());
144
+ }
145
+ };
146
+ exports.AuthorizationGuard = AuthorizationGuard;
147
+ exports.AuthorizationGuard = AuthorizationGuard = AuthorizationGuard_1 = __decorate([
148
+ (0, common_1.Injectable)(),
149
+ __metadata("design:paramtypes", [core_1.Reflector])
150
+ ], AuthorizationGuard);
@@ -1,4 +1,5 @@
1
1
  export * from './jwt-auth.guard';
2
2
  export * from './roles.guard';
3
3
  export * from './permissions.guard';
4
+ export * from './authorization.guard';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./jwt-auth.guard"), exports);
18
18
  __exportStar(require("./roles.guard"), exports);
19
19
  __exportStar(require("./permissions.guard"), exports);
20
+ __exportStar(require("./authorization.guard"), exports);
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"jwt-auth.guard.d.ts","sourceRoot":"","sources":["../../src/guards/jwt-auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAc,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAIrE;;;GAGG;AACH,qBACa,YAAa,YAAW,WAAW;IAI5C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAGrC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EAEpB,OAAO,EAAE,wBAAwB;IAG9C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA2E9D;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAe/B"}
1
+ {"version":3,"file":"jwt-auth.guard.d.ts","sourceRoot":"","sources":["../../src/guards/jwt-auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAqD,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD;;;GAGG;AACH,qBACa,YAAa,YAAW,WAAW;IAI5C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAGrC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EAEpB,OAAO,EAAE,wBAAwB;IAG9C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA2D9D;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAY/B"}
File without changes
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.guard.d.ts","sourceRoot":"","sources":["../../src/guards/permissions.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAGjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC;;;;GAIG;AACH,qBACa,gBAAiB,YAAW,WAAW;IAGtC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAE/B,SAAS,EAAE,SAAS;IAEjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CAwFhD"}
1
+ {"version":3,"file":"permissions.guard.d.ts","sourceRoot":"","sources":["../../src/guards/permissions.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAA0C,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;;;GAIG;AACH,qBACa,gBAAiB,YAAW,WAAW;IAGtC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAE/B,SAAS,EAAE,SAAS;IAEjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CA6DhD"}
@@ -26,9 +26,15 @@ let PermissionsGuard = PermissionsGuard_1 = class PermissionsGuard {
26
26
  }
27
27
  canActivate(context) {
28
28
  // Check for required permissions (AND logic)
29
- const requiredPermissions = this.reflector.getAllAndOverride(decorators_1.PERMISSIONS_KEY, [context.getHandler(), context.getClass()]);
29
+ const requiredPermissions = this.reflector.getAllAndOverride(decorators_1.PERMISSIONS_KEY, [
30
+ context.getHandler(),
31
+ context.getClass(),
32
+ ]);
30
33
  // Check for any permissions (OR logic)
31
- const anyPermissions = this.reflector.getAllAndOverride('anyPermissions', [context.getHandler(), context.getClass()]);
34
+ const anyPermissions = this.reflector.getAllAndOverride('anyPermissions', [
35
+ context.getHandler(),
36
+ context.getClass(),
37
+ ]);
32
38
  // If no permissions are specified, allow access
33
39
  if ((!requiredPermissions || requiredPermissions.length === 0) &&
34
40
  (!anyPermissions || anyPermissions.length === 0)) {
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"roles.guard.d.ts","sourceRoot":"","sources":["../../src/guards/roles.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAGjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC;;;GAGG;AACH,qBACa,UAAW,YAAW,WAAW;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAEzB,SAAS,EAAE,SAAS;IAEjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CA2ChD"}
1
+ {"version":3,"file":"roles.guard.d.ts","sourceRoot":"","sources":["../../src/guards/roles.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAA0C,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;;GAGG;AACH,qBACa,UAAW,YAAW,WAAW;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAEzB,SAAS,EAAE,SAAS;IAEjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CA8BhD"}
@@ -41,7 +41,7 @@ let RolesGuard = RolesGuard_1 = class RolesGuard {
41
41
  const userRoles = user.role || [];
42
42
  const hasRole = requiredRoles.some((role) => userRoles.includes(role));
43
43
  if (!hasRole) {
44
- const missingRoles = requiredRoles.filter(role => !userRoles.includes(role));
44
+ const missingRoles = requiredRoles.filter((role) => !userRoles.includes(role));
45
45
  this.logger.warn(`Access denied: User ${user.sub} (${user.fullName}) missing required roles. ` +
46
46
  `Required: [${requiredRoles.join(', ')}], ` +
47
47
  `User has: [${userRoles.join(', ')}], ` +
package/dist/index.d.ts CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAG1B,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAG7B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,aAAa,CAAC;AAG5B,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -14,15 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- // Main module
18
17
  __exportStar(require("./modules"), exports);
19
- // Guards
20
18
  __exportStar(require("./guards"), exports);
21
- // Decorators
22
19
  __exportStar(require("./decorators"), exports);
23
- // Services
24
20
  __exportStar(require("./services"), exports);
25
- // Interfaces
26
21
  __exportStar(require("./interfaces"), exports);
27
- // Constants
28
22
  __exportStar(require("./constants"), exports);
@@ -1,2 +1,3 @@
1
1
  export * from './jwt-payload.interface';
2
+ export * from './permission-mode.enum';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC"}
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./jwt-payload.interface"), exports);
18
+ __exportStar(require("./permission-mode.enum"), exports);
@@ -1,5 +1,24 @@
1
1
  /**
2
- * JWT Payload interface for ContractX authentication system
2
+ * jwt-payload.interface.ts
3
+ * ------------------------------------------------------------------------
4
+ * Interfaces de autenticación del paquete permissions-contractx.
5
+ *
6
+ * [ADR-004 Fase 2 — Porte] JwtPayload portado IDÉNTICO al de Auth
7
+ * (Contractos-Autenticacion/src/common/interfaces/jwt-payload.interface.ts),
8
+ * para que el paquete refleje la verdad del token que emite Auth. Cambios
9
+ * frente a la versión 1.0.x del paquete:
10
+ * - AÑADIDO permissionsView?: string[] (modo-ver 👁, solo lectura)
11
+ * - AÑADIDO providerId?, tenantContext?, key_client?
12
+ * - CAMBIO clientId: string -> string[] (el token real trae array;
13
+ * los consumidores ya lo manejan defensivamente)
14
+ * - CAMBIO index signature: [key: string]: any -> unknown
15
+ *
16
+ * Las otras 3 interfaces (AuthenticatedRequest, JwtAuthConfig,
17
+ * PermissionsModuleOptions) se conservan SIN cambios respecto a 1.0.x.
18
+ * ------------------------------------------------------------------------
19
+ */
20
+ /**
21
+ * JWT Payload de ContractX. Refleja exactamente el token emitido por Auth.
3
22
  */
4
23
  export interface JwtPayload {
5
24
  /** User ID */
@@ -8,14 +27,29 @@ export interface JwtPayload {
8
27
  id?: string;
9
28
  /** User roles array */
10
29
  role: string[];
11
- /** User permissions array */
30
+ /** Permisos con acceso pleno (escritura + lectura) */
12
31
  permissions: string[];
32
+ /**
33
+ * [ADR-004 Fase 2 / Bloque 1] Códigos en modo-ver (👁): solo lectura. Aditivo y
34
+ * backward-compatible — consumidores que solo leen `permissions` (acceso pleno)
35
+ * no se afectan. El AuthorizationGuard usa este conjunto para bloquear escrituras.
36
+ */
37
+ permissionsView?: string[];
13
38
  /** User's full name */
14
39
  fullName: string;
15
40
  /** User's email */
16
41
  email?: string;
17
- /** Client organization ID */
18
- clientId?: string;
42
+ /**
43
+ * IDs de cliente/tenant del usuario. ARRAY (el token real puede traer varios).
44
+ * Cambió de `string` a `string[]` en el porte ADR-004 para reflejar el token.
45
+ */
46
+ clientId?: string[];
47
+ /** ID de proveedor (lado proveedor) */
48
+ providerId?: string;
49
+ /** Contexto de tenant resuelto */
50
+ tenantContext?: 'client' | 'provider' | 'system';
51
+ /** Identificador primario de tenant para selección de schema */
52
+ key_client?: string[];
19
53
  /** Session ID for tracking */
20
54
  sessionId?: string;
21
55
  /** Token issued at timestamp */
@@ -26,17 +60,19 @@ export interface JwtPayload {
26
60
  iss?: string;
27
61
  /** Token audience */
28
62
  aud?: string;
29
- /** Additional custom properties */
30
- [key: string]: any;
63
+ /** Propiedades adicionales (tipadas como unknown: exigen comprobación antes de usar) */
64
+ [key: string]: unknown;
31
65
  }
32
66
  /**
33
- * Extended request interface with authenticated user
67
+ * Extended request interface with authenticated user.
68
+ * (Conservada sin cambios respecto a 1.0.x.)
34
69
  */
35
70
  export interface AuthenticatedRequest extends Request {
36
71
  user: JwtPayload;
37
72
  }
38
73
  /**
39
- * Configuration options for JWT authentication
74
+ * Configuration options for JWT authentication.
75
+ * (Conservada sin cambios respecto a 1.0.x.)
40
76
  */
41
77
  export interface JwtAuthConfig {
42
78
  /** JWT secret key */
@@ -57,7 +93,8 @@ export interface JwtAuthConfig {
57
93
  ignoreExpiration?: boolean;
58
94
  }
59
95
  /**
60
- * Module configuration options
96
+ * Module configuration options.
97
+ * (Conservada sin cambios respecto a 1.0.x.)
61
98
  */
62
99
  export interface PermissionsModuleOptions {
63
100
  /** JWT configuration */
@@ -1 +1 @@
1
- {"version":3,"file":"jwt-payload.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/jwt-payload.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc;IACd,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAErB,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,uBAAuB;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,6BAA6B;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IAEjB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,mBAAmB;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,mCAAmC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IAEf,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,GAAG,EAAE,aAAa,CAAC;IAEnB,kCAAkC;IAClC,MAAM,CAAC,EAAE;QACP,0CAA0C;QAC1C,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAE3B,iCAAiC;QACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAE5B,uCAAuC;QACvC,uBAAuB,CAAC,EAAE,OAAO,CAAC;KACnC,CAAC;IAEF,6BAA6B;IAC7B,QAAQ,CAAC,EAAE;QACT,6BAA6B;QAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;QAExB,2BAA2B;QAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;QAE1B,wCAAwC;QACxC,eAAe,CAAC,EAAE,MAAM,CAAC;QAEzB,kCAAkC;QAClC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF,gCAAgC;IAChC,WAAW,CAAC,EAAE;QACZ,4CAA4C;QAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;QAEtB,gCAAgC;QAChC,QAAQ,CAAC,EAAE,UAAU,CAAC;KACvB,CAAC;CACH"}
1
+ {"version":3,"file":"jwt-payload.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/jwt-payload.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc;IACd,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uBAAuB;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,aAAa,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjD,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,GAAG,EAAE,aAAa,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE;QACP,0CAA0C;QAC1C,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,iCAAiC;QACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,uCAAuC;QACvC,uBAAuB,CAAC,EAAE,OAAO,CAAC;KACnC,CAAC;IACF,6BAA6B;IAC7B,QAAQ,CAAC,EAAE;QACT,6BAA6B;QAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,2BAA2B;QAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,wCAAwC;QACxC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kCAAkC;QAClC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,gCAAgC;IAChC,WAAW,CAAC,EAAE;QACZ,4CAA4C;QAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,gCAAgC;QAChC,QAAQ,CAAC,EAAE,UAAU,CAAC;KACvB,CAAC;CACH"}
@@ -1,2 +1,21 @@
1
1
  "use strict";
2
+ /**
3
+ * jwt-payload.interface.ts
4
+ * ------------------------------------------------------------------------
5
+ * Interfaces de autenticación del paquete permissions-contractx.
6
+ *
7
+ * [ADR-004 Fase 2 — Porte] JwtPayload portado IDÉNTICO al de Auth
8
+ * (Contractos-Autenticacion/src/common/interfaces/jwt-payload.interface.ts),
9
+ * para que el paquete refleje la verdad del token que emite Auth. Cambios
10
+ * frente a la versión 1.0.x del paquete:
11
+ * - AÑADIDO permissionsView?: string[] (modo-ver 👁, solo lectura)
12
+ * - AÑADIDO providerId?, tenantContext?, key_client?
13
+ * - CAMBIO clientId: string -> string[] (el token real trae array;
14
+ * los consumidores ya lo manejan defensivamente)
15
+ * - CAMBIO index signature: [key: string]: any -> unknown
16
+ *
17
+ * Las otras 3 interfaces (AuthenticatedRequest, JwtAuthConfig,
18
+ * PermissionsModuleOptions) se conservan SIN cambios respecto a 1.0.x.
19
+ * ------------------------------------------------------------------------
20
+ */
2
21
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * permission-mode.enum.ts
3
+ * ------------------------------------------------------------------------
4
+ * [ADR-004 Fase 2 — Porte] Espejo IDÉNTICO del enum definido en Auth
5
+ * (Contractos-Autenticacion/src/modules/roles-permissions/domain/constants/
6
+ * permissions.constants.ts).
7
+ *
8
+ * Modo de una asignación rol→permiso:
9
+ * - WRITE: acceso pleno (lectura + escritura).
10
+ * - READ: modo-ver (👁) — solo lecturas; el AuthorizationGuard bloquea escrituras.
11
+ *
12
+ * Default WRITE ⇒ las asignaciones existentes no cambian de comportamiento.
13
+ *
14
+ * Fuente única: a futuro Auth debería importar este enum del paquete en lugar de
15
+ * mantener su propia copia, para no divergir. (No se toca Auth en este porte.)
16
+ * ------------------------------------------------------------------------
17
+ */
18
+ export declare enum PermissionMode {
19
+ WRITE = "write",
20
+ READ = "read"
21
+ }
22
+ //# sourceMappingURL=permission-mode.enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-mode.enum.d.ts","sourceRoot":"","sources":["../../src/interfaces/permission-mode.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,IAAI,SAAS;CACd"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PermissionMode = void 0;
4
+ /**
5
+ * permission-mode.enum.ts
6
+ * ------------------------------------------------------------------------
7
+ * [ADR-004 Fase 2 — Porte] Espejo IDÉNTICO del enum definido en Auth
8
+ * (Contractos-Autenticacion/src/modules/roles-permissions/domain/constants/
9
+ * permissions.constants.ts).
10
+ *
11
+ * Modo de una asignación rol→permiso:
12
+ * - WRITE: acceso pleno (lectura + escritura).
13
+ * - READ: modo-ver (👁) — solo lecturas; el AuthorizationGuard bloquea escrituras.
14
+ *
15
+ * Default WRITE ⇒ las asignaciones existentes no cambian de comportamiento.
16
+ *
17
+ * Fuente única: a futuro Auth debería importar este enum del paquete en lugar de
18
+ * mantener su propia copia, para no divergir. (No se toca Auth en este porte.)
19
+ * ------------------------------------------------------------------------
20
+ */
21
+ var PermissionMode;
22
+ (function (PermissionMode) {
23
+ PermissionMode["WRITE"] = "write";
24
+ PermissionMode["READ"] = "read";
25
+ })(PermissionMode || (exports.PermissionMode = PermissionMode = {}));
File without changes
File without changes
File without changes
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"permissions-contractx.module.d.ts","sourceRoot":"","sources":["../../src/modules/permissions-contractx.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAK/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AASzD;;;GAGG;AACH,qBAKa,0BAA0B;IACrC;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa;IAsEjE;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;QAC5B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC7F,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;KAChB,GAAG,aAAa;IAgEjB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,OAAO,IAAI,aAAa;CA2BhC"}
1
+ {"version":3,"file":"permissions-contractx.module.d.ts","sourceRoot":"","sources":["../../src/modules/permissions-contractx.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAO/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD;;;GAGG;AACH,qBAKa,0BAA0B;IACrC;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa;IAwEjE;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;QAC5B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC7F,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;KAChB,GAAG,aAAa;IAgEjB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,OAAO,IAAI,aAAa;CA2BhC"}
@@ -34,7 +34,9 @@ let PermissionsContractXModule = PermissionsContractXModule_1 = class Permission
34
34
  jwt_1.JwtModule.register({
35
35
  secret: options.jwt.secret,
36
36
  signOptions: {
37
- expiresIn: options.jwt.expiresIn || '15m',
37
+ // [PASO 3] cast: @nestjs/jwt v11 tipa expiresIn como number|StringValue (más estricto
38
+ // que la versión original). El paquete nuevo fijará la versión; cast para verificación.
39
+ expiresIn: (options.jwt.expiresIn || '15m'),
38
40
  issuer: options.jwt.issuer,
39
41
  audience: options.jwt.audience,
40
42
  },
@@ -113,7 +115,7 @@ let PermissionsContractXModule = PermissionsContractXModule_1 = class Permission
113
115
  return {
114
116
  secret: moduleOptions.jwt.secret,
115
117
  signOptions: {
116
- expiresIn: moduleOptions.jwt.expiresIn || '15m',
118
+ expiresIn: (moduleOptions.jwt.expiresIn || '15m'),
117
119
  issuer: moduleOptions.jwt.issuer,
118
120
  audience: moduleOptions.jwt.audience,
119
121
  },