@stefaninigo/security-client 1.0.1

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 (50) hide show
  1. package/README.md +83 -0
  2. package/dist/decorators/roles.decorator.d.ts +3 -0
  3. package/dist/decorators/roles.decorator.js +8 -0
  4. package/dist/decorators/roles.decorator.js.map +1 -0
  5. package/dist/generated/authentication/authentication.d.ts +20 -0
  6. package/dist/generated/authentication/authentication.js +49 -0
  7. package/dist/generated/authentication/authentication.js.map +1 -0
  8. package/dist/generated/bootstrap/bootstrap.d.ts +12 -0
  9. package/dist/generated/bootstrap/bootstrap.js +24 -0
  10. package/dist/generated/bootstrap/bootstrap.js.map +1 -0
  11. package/dist/generated/client-assignments/client-assignments.d.ts +22 -0
  12. package/dist/generated/client-assignments/client-assignments.js +46 -0
  13. package/dist/generated/client-assignments/client-assignments.js.map +1 -0
  14. package/dist/generated/health/health.d.ts +11 -0
  15. package/dist/generated/health/health.js +21 -0
  16. package/dist/generated/health/health.js.map +1 -0
  17. package/dist/generated/provider-client-assignments/provider-client-assignments.d.ts +20 -0
  18. package/dist/generated/provider-client-assignments/provider-client-assignments.js +42 -0
  19. package/dist/generated/provider-client-assignments/provider-client-assignments.js.map +1 -0
  20. package/dist/generated/providers/providers.d.ts +20 -0
  21. package/dist/generated/providers/providers.js +42 -0
  22. package/dist/generated/providers/providers.js.map +1 -0
  23. package/dist/generated/stefaniniGoSecurityAPI.schemas.d.ts +428 -0
  24. package/dist/generated/stefaniniGoSecurityAPI.schemas.js +105 -0
  25. package/dist/generated/stefaniniGoSecurityAPI.schemas.js.map +1 -0
  26. package/dist/generated/users/users.d.ts +26 -0
  27. package/dist/generated/users/users.js +60 -0
  28. package/dist/generated/users/users.js.map +1 -0
  29. package/dist/guards/cognito-auth.guard.d.ts +12 -0
  30. package/dist/guards/cognito-auth.guard.js +112 -0
  31. package/dist/guards/cognito-auth.guard.js.map +1 -0
  32. package/dist/guards/role.guard.d.ts +7 -0
  33. package/dist/guards/role.guard.js +44 -0
  34. package/dist/guards/role.guard.js.map +1 -0
  35. package/dist/index.d.ts +6 -0
  36. package/dist/index.js +23 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/module/security-client.module.d.ts +5 -0
  39. package/dist/module/security-client.module.js +50 -0
  40. package/dist/module/security-client.module.js.map +1 -0
  41. package/dist/services/security-client.service.d.ts +11 -0
  42. package/dist/services/security-client.service.js +106 -0
  43. package/dist/services/security-client.service.js.map +1 -0
  44. package/dist/types/user.types.d.ts +23 -0
  45. package/dist/types/user.types.js +17 -0
  46. package/dist/types/user.types.js.map +1 -0
  47. package/dist/utils/mutator.d.ts +3 -0
  48. package/dist/utils/mutator.js +22 -0
  49. package/dist/utils/mutator.js.map +1 -0
  50. package/package.json +49 -0
@@ -0,0 +1,112 @@
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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CognitoAuthGuard = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const aws_jwt_verify_1 = require("aws-jwt-verify");
18
+ const security_client_service_1 = require("../services/security-client.service");
19
+ const security_client_service_2 = require("../services/security-client.service");
20
+ let CognitoAuthGuard = class CognitoAuthGuard {
21
+ constructor(securityClient, config) {
22
+ this.securityClient = securityClient;
23
+ this.config = config;
24
+ this.useSecurityService = !!securityClient && !!config?.securityServiceUrl;
25
+ }
26
+ async canActivate(context) {
27
+ const request = context.switchToHttp().getRequest();
28
+ const token = this.extractTokenFromHeader(request);
29
+ if (!token) {
30
+ throw new common_1.UnauthorizedException('Token de acceso requerido');
31
+ }
32
+ const userPoolId = process.env.AWS_USER_POOL_ID;
33
+ const clientId = process.env.AWS_CLIENT_ID;
34
+ if (!userPoolId || !clientId) {
35
+ throw new common_1.UnauthorizedException('AWS Cognito configuration missing. AWS_USER_POOL_ID and AWS_CLIENT_ID must be configured');
36
+ }
37
+ const verifier = aws_jwt_verify_1.CognitoJwtVerifier.create({
38
+ userPoolId,
39
+ tokenUse: 'access',
40
+ clientId,
41
+ });
42
+ try {
43
+ const payload = await verifier.verify(token);
44
+ const username = typeof payload.username === 'string' ? payload.username : '';
45
+ if (!username) {
46
+ throw new common_1.UnauthorizedException('Token no contiene username válido');
47
+ }
48
+ let user;
49
+ if (this.useSecurityService && this.securityClient) {
50
+ try {
51
+ user = await this.securityClient.validateTokenAndGetUser(token);
52
+ }
53
+ catch (serviceError) {
54
+ if (serviceError instanceof Error) {
55
+ const errorMsg = serviceError.message.toLowerCase();
56
+ if (errorMsg.includes('security service error')) {
57
+ const statusMatch = serviceError.message.match(/status: (\d+)/);
58
+ if (statusMatch && statusMatch[1] === '401') {
59
+ throw new common_1.UnauthorizedException('Token inválido o expirado');
60
+ }
61
+ if (statusMatch && statusMatch[1] === '404') {
62
+ throw new common_1.UnauthorizedException('Usuario no encontrado');
63
+ }
64
+ throw new common_1.UnauthorizedException('Error al validar usuario con servicio Security');
65
+ }
66
+ }
67
+ throw new common_1.UnauthorizedException('Error de autenticación');
68
+ }
69
+ }
70
+ else {
71
+ throw new common_1.UnauthorizedException('Security client service not configured. Please configure SecurityClientModule.');
72
+ }
73
+ if (user.status !== 'active') {
74
+ throw new common_1.UnauthorizedException('Usuario inactivo');
75
+ }
76
+ request.user = user;
77
+ return true;
78
+ }
79
+ catch (error) {
80
+ if (error instanceof common_1.UnauthorizedException) {
81
+ throw error;
82
+ }
83
+ if (error instanceof Error) {
84
+ const errorMsg = error.message.toLowerCase();
85
+ if (errorMsg.includes('expired') || errorMsg.includes('jwt expired')) {
86
+ throw new common_1.UnauthorizedException('Token expirado');
87
+ }
88
+ if (errorMsg.includes('invalid') ||
89
+ errorMsg.includes('signature') ||
90
+ errorMsg.includes('malformed') ||
91
+ errorMsg.includes('jwt malformed')) {
92
+ throw new common_1.UnauthorizedException('Token inválido');
93
+ }
94
+ }
95
+ throw new common_1.UnauthorizedException('Error de autenticación');
96
+ }
97
+ }
98
+ extractTokenFromHeader(request) {
99
+ const [type, token] = request.headers.authorization?.split(' ') ?? [];
100
+ return type === 'Bearer' ? token : undefined;
101
+ }
102
+ };
103
+ exports.CognitoAuthGuard = CognitoAuthGuard;
104
+ exports.CognitoAuthGuard = CognitoAuthGuard = __decorate([
105
+ (0, common_1.Injectable)(),
106
+ __param(0, (0, common_1.Optional)()),
107
+ __param(0, (0, common_1.Inject)(security_client_service_1.SecurityClientService)),
108
+ __param(1, (0, common_1.Optional)()),
109
+ __param(1, (0, common_1.Inject)(security_client_service_2.SECURITY_CLIENT_CONFIG)),
110
+ __metadata("design:paramtypes", [security_client_service_1.SecurityClientService, Object])
111
+ ], CognitoAuthGuard);
112
+ //# sourceMappingURL=cognito-auth.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cognito-auth.guard.js","sourceRoot":"","sources":["../../src/guards/cognito-auth.guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ export declare class RoleGuard implements CanActivate {
4
+ private reflector;
5
+ constructor(reflector: Reflector);
6
+ canActivate(context: ExecutionContext): boolean;
7
+ }
@@ -0,0 +1,44 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RoleGuard = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const roles_decorator_1 = require("../decorators/roles.decorator");
16
+ let RoleGuard = class RoleGuard {
17
+ constructor(reflector) {
18
+ this.reflector = reflector;
19
+ }
20
+ canActivate(context) {
21
+ const requiredRoles = this.reflector.getAllAndOverride(roles_decorator_1.ROLES_KEY, [
22
+ context.getHandler(),
23
+ context.getClass(),
24
+ ]);
25
+ if (!requiredRoles) {
26
+ return true;
27
+ }
28
+ const { user } = context.switchToHttp().getRequest();
29
+ if (!user) {
30
+ throw new common_1.ForbiddenException('Usuario no autenticado');
31
+ }
32
+ const hasRole = requiredRoles.some((role) => user.role === role);
33
+ if (!hasRole) {
34
+ throw new common_1.ForbiddenException(`Se requiere uno de los siguientes roles: ${requiredRoles.join(', ')}`);
35
+ }
36
+ return true;
37
+ }
38
+ };
39
+ exports.RoleGuard = RoleGuard;
40
+ exports.RoleGuard = RoleGuard = __decorate([
41
+ (0, common_1.Injectable)(),
42
+ __metadata("design:paramtypes", [core_1.Reflector])
43
+ ], RoleGuard);
44
+ //# sourceMappingURL=role.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.guard.js","sourceRoot":"","sources":["../../src/guards/role.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA+F;AAC/F,uCAAyC;AAEzC,mEAA0D;AAGnD,IAAM,SAAS,GAAf,MAAM,SAAS;IACpB,YAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE5C,WAAW,CAAC,OAAyB;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAa,2BAAS,EAAE;YAC5E,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAErD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,2BAAkB,CAAC,wBAAwB,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,2BAAkB,CAAC,4CAA4C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA3BY,8BAAS;oBAAT,SAAS;IADrB,IAAA,mBAAU,GAAE;qCAEoB,gBAAS;GAD7B,SAAS,CA2BrB"}
@@ -0,0 +1,6 @@
1
+ export * from './guards/cognito-auth.guard';
2
+ export * from './guards/role.guard';
3
+ export * from './decorators/roles.decorator';
4
+ export * from './services/security-client.service';
5
+ export * from './module/security-client.module';
6
+ export * from './types/user.types';
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./guards/cognito-auth.guard"), exports);
18
+ __exportStar(require("./guards/role.guard"), exports);
19
+ __exportStar(require("./decorators/roles.decorator"), exports);
20
+ __exportStar(require("./services/security-client.service"), exports);
21
+ __exportStar(require("./module/security-client.module"), exports);
22
+ __exportStar(require("./types/user.types"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,sDAAoC;AACpC,+DAA6C;AAC7C,qEAAmD;AACnD,kEAAgD;AAChD,qDAAmC"}
@@ -0,0 +1,5 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { SecurityClientConfig } from '../types/user.types';
3
+ export declare class SecurityClientModule {
4
+ static forRoot(config: SecurityClientConfig): DynamicModule;
5
+ }
@@ -0,0 +1,50 @@
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 SecurityClientModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SecurityClientModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const security_client_service_1 = require("../services/security-client.service");
13
+ const cognito_auth_guard_1 = require("../guards/cognito-auth.guard");
14
+ const role_guard_1 = require("../guards/role.guard");
15
+ let SecurityClientModule = SecurityClientModule_1 = class SecurityClientModule {
16
+ static forRoot(config) {
17
+ if (!config.securityServiceUrl || typeof config.securityServiceUrl !== 'string' || config.securityServiceUrl.trim() === '') {
18
+ throw new Error('securityServiceUrl is required and must be a non-empty string in SecurityClientConfig');
19
+ }
20
+ try {
21
+ new URL(config.securityServiceUrl);
22
+ }
23
+ catch {
24
+ throw new Error(`Invalid securityServiceUrl format: ${config.securityServiceUrl}. Must be a valid URL.`);
25
+ }
26
+ return {
27
+ module: SecurityClientModule_1,
28
+ providers: [
29
+ {
30
+ provide: security_client_service_1.SECURITY_CLIENT_CONFIG,
31
+ useValue: config,
32
+ },
33
+ security_client_service_1.SecurityClientService,
34
+ cognito_auth_guard_1.CognitoAuthGuard,
35
+ role_guard_1.RoleGuard,
36
+ ],
37
+ exports: [
38
+ security_client_service_1.SecurityClientService,
39
+ cognito_auth_guard_1.CognitoAuthGuard,
40
+ role_guard_1.RoleGuard,
41
+ ],
42
+ };
43
+ }
44
+ };
45
+ exports.SecurityClientModule = SecurityClientModule;
46
+ exports.SecurityClientModule = SecurityClientModule = SecurityClientModule_1 = __decorate([
47
+ (0, common_1.Global)(),
48
+ (0, common_1.Module)({})
49
+ ], SecurityClientModule);
50
+ //# sourceMappingURL=security-client.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-client.module.js","sourceRoot":"","sources":["../../src/module/security-client.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,iFAAoG;AACpG,qEAAgE;AAChE,qDAAiD;AAK1C,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAC/B,MAAM,CAAC,OAAO,CAAC,MAA4B;QAEzC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3H,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;QAC3G,CAAC;QAGD,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,kBAAkB,wBAAwB,CAAC,CAAC;QAC3G,CAAC;QAED,OAAO;YACL,MAAM,EAAE,sBAAoB;YAC5B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,gDAAsB;oBAC/B,QAAQ,EAAE,MAAM;iBACjB;gBACD,+CAAqB;gBACrB,qCAAgB;gBAChB,sBAAS;aACV;YACD,OAAO,EAAE;gBACP,+CAAqB;gBACrB,qCAAgB;gBAChB,sBAAS;aACV;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAhCY,oDAAoB;+BAApB,oBAAoB;IAFhC,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,oBAAoB,CAgChC"}
@@ -0,0 +1,11 @@
1
+ import { SecurityClientConfig } from '../types/user.types';
2
+ import { AuthUser } from '../types/user.types';
3
+ export declare const SECURITY_CLIENT_CONFIG = "SECURITY_CLIENT_CONFIG";
4
+ export declare class SecurityClientService {
5
+ private readonly config;
6
+ private readonly logger;
7
+ private readonly httpClient;
8
+ constructor(config: SecurityClientConfig);
9
+ validateTokenAndGetUser(token: string): Promise<AuthUser>;
10
+ getUserById(userId: string, token: string): Promise<AuthUser>;
11
+ }
@@ -0,0 +1,106 @@
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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var SecurityClientService_1;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.SecurityClientService = exports.SECURITY_CLIENT_CONFIG = void 0;
20
+ const common_1 = require("@nestjs/common");
21
+ const axios_1 = __importDefault(require("axios"));
22
+ exports.SECURITY_CLIENT_CONFIG = 'SECURITY_CLIENT_CONFIG';
23
+ let SecurityClientService = SecurityClientService_1 = class SecurityClientService {
24
+ constructor(config) {
25
+ this.config = config;
26
+ this.logger = new common_1.Logger(SecurityClientService_1.name);
27
+ this.httpClient = axios_1.default.create({
28
+ baseURL: config.securityServiceUrl,
29
+ timeout: config.timeout || 5000,
30
+ headers: {
31
+ 'Content-Type': 'application/json',
32
+ },
33
+ });
34
+ }
35
+ async validateTokenAndGetUser(token) {
36
+ try {
37
+ const response = await this.httpClient.get('/api/v1/security/users/me', {
38
+ headers: {
39
+ Authorization: `Bearer ${token}`,
40
+ },
41
+ });
42
+ if (!response.data || typeof response.data !== 'object') {
43
+ throw new Error('Invalid response format from security service');
44
+ }
45
+ const userData = response.data;
46
+ if (!userData.id || !userData.email || !userData.role || !userData.status) {
47
+ this.logger.warn('Security service returned incomplete user data', {
48
+ hasId: !!userData.id,
49
+ hasEmail: !!userData.email,
50
+ hasRole: !!userData.role,
51
+ hasStatus: !!userData.status
52
+ });
53
+ throw new Error('Incomplete user data from security service');
54
+ }
55
+ return userData;
56
+ }
57
+ catch (error) {
58
+ this.logger.error(`Error validating token: ${error.message}`);
59
+ if (error.response) {
60
+ const status = error.response.status;
61
+ const message = error.response.data?.message || error.response.data?.detail || 'Unknown error';
62
+ throw new Error(`Security service error: status: ${status} - ${message}`);
63
+ }
64
+ throw new Error(`Failed to connect to security service: ${error.message}`);
65
+ }
66
+ }
67
+ async getUserById(userId, token) {
68
+ try {
69
+ const response = await this.httpClient.get(`/api/v1/security/users/${userId}`, {
70
+ headers: {
71
+ Authorization: `Bearer ${token}`,
72
+ },
73
+ });
74
+ if (!response.data || typeof response.data !== 'object') {
75
+ throw new Error('Invalid response format from security service');
76
+ }
77
+ const userData = response.data;
78
+ if (!userData.id || !userData.email || !userData.role || !userData.status) {
79
+ this.logger.warn('Security service returned incomplete user data', {
80
+ hasId: !!userData.id,
81
+ hasEmail: !!userData.email,
82
+ hasRole: !!userData.role,
83
+ hasStatus: !!userData.status
84
+ });
85
+ throw new Error('Incomplete user data from security service');
86
+ }
87
+ return userData;
88
+ }
89
+ catch (error) {
90
+ this.logger.error(`Error getting user: ${error.message}`);
91
+ if (error.response) {
92
+ const status = error.response.status;
93
+ const message = error.response.data?.message || error.response.data?.detail || 'Unknown error';
94
+ throw new Error(`Security service error: status: ${status} - ${message}`);
95
+ }
96
+ throw new Error(`Failed to connect to security service: ${error.message}`);
97
+ }
98
+ }
99
+ };
100
+ exports.SecurityClientService = SecurityClientService;
101
+ exports.SecurityClientService = SecurityClientService = SecurityClientService_1 = __decorate([
102
+ (0, common_1.Injectable)(),
103
+ __param(0, (0, common_1.Inject)(exports.SECURITY_CLIENT_CONFIG)),
104
+ __metadata("design:paramtypes", [Object])
105
+ ], SecurityClientService);
106
+ //# sourceMappingURL=security-client.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-client.service.js","sourceRoot":"","sources":["../../src/services/security-client.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare enum UserRole {
2
+ ROOT = "root",
3
+ ADMIN = "admin",
4
+ DISPATCHER = "dispatcher",
5
+ TECHNICIAN = "technician"
6
+ }
7
+ export declare enum UserStatus {
8
+ ACTIVE = "active",
9
+ PENDING = "pending",
10
+ BLOCKED = "blocked"
11
+ }
12
+ export interface AuthUser {
13
+ id: string;
14
+ email: string;
15
+ role: UserRole;
16
+ providerId?: string;
17
+ status: UserStatus;
18
+ cognitoSub?: string;
19
+ }
20
+ export interface SecurityClientConfig {
21
+ securityServiceUrl: string;
22
+ timeout?: number;
23
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserStatus = exports.UserRole = void 0;
4
+ var UserRole;
5
+ (function (UserRole) {
6
+ UserRole["ROOT"] = "root";
7
+ UserRole["ADMIN"] = "admin";
8
+ UserRole["DISPATCHER"] = "dispatcher";
9
+ UserRole["TECHNICIAN"] = "technician";
10
+ })(UserRole || (exports.UserRole = UserRole = {}));
11
+ var UserStatus;
12
+ (function (UserStatus) {
13
+ UserStatus["ACTIVE"] = "active";
14
+ UserStatus["PENDING"] = "pending";
15
+ UserStatus["BLOCKED"] = "blocked";
16
+ })(UserStatus || (exports.UserStatus = UserStatus = {}));
17
+ //# sourceMappingURL=user.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.types.js","sourceRoot":"","sources":["../../src/types/user.types.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,2BAAe,CAAA;IACf,qCAAyB,CAAA;IACzB,qCAAyB,CAAA;AAC3B,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,+BAAiB,CAAA;IACjB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;AACrB,CAAC,EAJW,UAAU,0BAAV,UAAU,QAIrB"}
@@ -0,0 +1,3 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ export declare const customInstance: <T>(config: AxiosRequestConfig, options?: AxiosRequestConfig) => Promise<T>;
3
+ export default customInstance;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.customInstance = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const customInstance = (config, options) => {
9
+ const source = axios_1.default.CancelToken.source();
10
+ const promise = (0, axios_1.default)({
11
+ ...config,
12
+ ...options,
13
+ cancelToken: source.token,
14
+ }).then(({ data }) => data);
15
+ promise.cancel = () => {
16
+ source.cancel('Query was cancelled');
17
+ };
18
+ return promise;
19
+ };
20
+ exports.customInstance = customInstance;
21
+ exports.default = exports.customInstance;
22
+ //# sourceMappingURL=mutator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutator.js","sourceRoot":"","sources":["../../src/utils/mutator.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAkD;AAE3C,MAAM,cAAc,GAAG,CAC5B,MAA0B,EAC1B,OAA4B,EAChB,EAAE;IACd,MAAM,MAAM,GAAG,eAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAA,eAAK,EAAC;QACpB,GAAG,MAAM;QACT,GAAG,OAAO;QACV,WAAW,EAAE,MAAM,CAAC,KAAK;KAC1B,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAG5B,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE;QACpB,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAjBW,QAAA,cAAc,kBAiBzB;AAEF,kBAAe,sBAAc,CAAC"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@stefaninigo/security-client",
3
+ "version": "1.0.1",
4
+ "description": "StefaniniGo Security Client SDK - Guards, decorators and HTTP client for authentication and authorization",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": [
16
+ "nestjs",
17
+ "security",
18
+ "authentication",
19
+ "authorization",
20
+ "guards",
21
+ "cognito"
22
+ ],
23
+ "author": "StefaniniGo Team",
24
+ "license": "UNLICENSED",
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/stefanini-go/stefanini-go-security.git",
31
+ "directory": "packages/security-client"
32
+ },
33
+ "dependencies": {
34
+ "@nestjs/common": "^11.1.6",
35
+ "@nestjs/core": "^11.1.6",
36
+ "axios": "^1.7.9",
37
+ "aws-jwt-verify": "^5.1.1",
38
+ "reflect-metadata": "^0.2.2",
39
+ "rxjs": "^7.8.2"
40
+ },
41
+ "peerDependencies": {
42
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
43
+ "@nestjs/core": "^10.0.0 || ^11.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^24.7.2",
47
+ "typescript": "^5.9.3"
48
+ }
49
+ }