permissions-contractx 1.0.2 → 1.2.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.
- package/LICENSE +1 -1
- package/README.md +53 -1346
- package/dist/constants/contractx-permissions.constants.d.ts +84 -92
- package/dist/constants/contractx-permissions.constants.d.ts.map +1 -1
- package/dist/constants/contractx-permissions.constants.js +2 -2
- package/dist/constants/contractx-roles.constants.d.ts +150 -254
- package/dist/constants/contractx-roles.constants.d.ts.map +1 -1
- package/dist/constants/contractx-roles.constants.js +2 -2
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +1 -0
- package/dist/constants/permission-names.constants.d.ts +432 -0
- package/dist/constants/permission-names.constants.d.ts.map +1 -0
- package/dist/constants/permission-names.constants.js +304 -0
- package/dist/constants/security.constants.d.ts +49 -49
- package/dist/constants/security.constants.d.ts.map +1 -1
- package/dist/constants/security.constants.js +2 -2
- package/dist/decorators/current-user.decorator.d.ts +5 -53
- package/dist/decorators/current-user.decorator.d.ts.map +1 -1
- package/dist/decorators/current-user.decorator.js +4 -51
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/permission-writes.decorator.d.ts +14 -0
- package/dist/decorators/permission-writes.decorator.d.ts.map +1 -0
- package/dist/decorators/permission-writes.decorator.js +18 -0
- package/dist/decorators/permissions.decorator.d.ts +0 -58
- package/dist/decorators/permissions.decorator.d.ts.map +1 -1
- package/dist/decorators/permissions.decorator.js +0 -58
- package/dist/decorators/public.decorator.d.ts +0 -0
- package/dist/decorators/public.decorator.d.ts.map +0 -0
- package/dist/decorators/public.decorator.js +0 -0
- package/dist/decorators/roles.decorator.d.ts +4 -57
- package/dist/decorators/roles.decorator.d.ts.map +1 -1
- package/dist/decorators/roles.decorator.js +6 -57
- package/dist/guards/authorization.guard.d.ts +37 -0
- package/dist/guards/authorization.guard.d.ts.map +1 -0
- package/dist/guards/authorization.guard.js +150 -0
- package/dist/guards/index.d.ts +1 -0
- package/dist/guards/index.d.ts.map +1 -1
- package/dist/guards/index.js +1 -0
- package/dist/guards/jwt-auth.guard.d.ts +0 -0
- package/dist/guards/jwt-auth.guard.d.ts.map +1 -1
- package/dist/guards/jwt-auth.guard.js +0 -0
- package/dist/guards/permissions.guard.d.ts +0 -0
- package/dist/guards/permissions.guard.d.ts.map +1 -1
- package/dist/guards/permissions.guard.js +8 -2
- package/dist/guards/roles.guard.d.ts +0 -0
- package/dist/guards/roles.guard.d.ts.map +1 -1
- package/dist/guards/roles.guard.js +1 -1
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -6
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.d.ts.map +1 -1
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/jwt-payload.interface.d.ts +46 -9
- package/dist/interfaces/jwt-payload.interface.d.ts.map +1 -1
- package/dist/interfaces/jwt-payload.interface.js +19 -0
- package/dist/interfaces/permission-mode.enum.d.ts +22 -0
- package/dist/interfaces/permission-mode.enum.d.ts.map +1 -0
- package/dist/interfaces/permission-mode.enum.js +25 -0
- package/dist/modules/index.d.ts +0 -0
- package/dist/modules/index.d.ts.map +0 -0
- package/dist/modules/index.js +0 -0
- package/dist/modules/permissions-contractx.module.d.ts +0 -0
- package/dist/modules/permissions-contractx.module.d.ts.map +1 -1
- package/dist/modules/permissions-contractx.module.js +4 -2
- package/dist/services/contractx-authorization.service.d.ts +198 -27
- package/dist/services/contractx-authorization.service.d.ts.map +1 -1
- package/dist/services/contractx-authorization.service.js +2 -0
- package/dist/services/contractx-validation.service.d.ts +93 -12
- package/dist/services/contractx-validation.service.d.ts.map +1 -1
- package/dist/services/contractx-validation.service.js +1 -0
- package/dist/services/index.d.ts +0 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -0
- package/dist/services/user-context.service.d.ts +29 -34
- package/dist/services/user-context.service.d.ts.map +1 -1
- package/dist/services/user-context.service.js +65 -44
- package/package.json +5 -24
- package/dist/services/contractx-document-compliance.service.d.ts +0 -85
- package/dist/services/contractx-document-compliance.service.d.ts.map +0 -1
- package/dist/services/contractx-document-compliance.service.js +0 -536
- package/dist/test-document-compliance.d.ts +0 -7
- package/dist/test-document-compliance.d.ts.map +0 -1
- package/dist/test-document-compliance.js +0 -118
|
@@ -36,41 +36,122 @@ export declare class ContractXValidationService {
|
|
|
36
36
|
/**
|
|
37
37
|
* Validate a single role
|
|
38
38
|
*/
|
|
39
|
-
validateSingleRole(role:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
validateSingleRole(role: any): {
|
|
40
|
+
isValid: boolean;
|
|
41
|
+
errors: any[];
|
|
42
|
+
warnings: any[];
|
|
43
|
+
roleInfo?: undefined;
|
|
44
|
+
} | {
|
|
45
|
+
isValid: boolean;
|
|
46
|
+
errors: any[];
|
|
47
|
+
warnings: any[];
|
|
48
|
+
roleInfo: {
|
|
49
|
+
name: string;
|
|
50
|
+
description: string;
|
|
51
|
+
type: import("../constants/contractx-roles.constants").ContractXRoleType;
|
|
52
|
+
scope: import("../constants/contractx-roles.constants").ContractXRoleScope;
|
|
53
|
+
level: number;
|
|
54
|
+
tenant: string;
|
|
55
|
+
isSystem: boolean;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
validateRoles(roles: any): {
|
|
59
|
+
isValid: boolean;
|
|
60
|
+
errors: any[];
|
|
61
|
+
warnings: any[];
|
|
62
|
+
metadata?: undefined;
|
|
63
|
+
} | {
|
|
64
|
+
isValid: boolean;
|
|
65
|
+
errors: any[];
|
|
66
|
+
warnings: any[];
|
|
67
|
+
metadata: {
|
|
68
|
+
roleInfos: any[];
|
|
69
|
+
tenantCount: number;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
validateSinglePermission(permission: any): {
|
|
73
|
+
isValid: boolean;
|
|
74
|
+
errors: any[];
|
|
75
|
+
warnings: any[];
|
|
76
|
+
permissionInfo: any[];
|
|
77
|
+
};
|
|
78
|
+
validatePermissions(permissions: any): {
|
|
79
|
+
isValid: boolean;
|
|
80
|
+
errors: any[];
|
|
81
|
+
warnings: any[];
|
|
82
|
+
permissionInfo: any[];
|
|
83
|
+
metadata?: undefined;
|
|
84
|
+
} | {
|
|
85
|
+
isValid: boolean;
|
|
86
|
+
errors: any[];
|
|
87
|
+
warnings: any[];
|
|
88
|
+
permissionInfo: any[];
|
|
89
|
+
metadata: {
|
|
90
|
+
moduleCount: number;
|
|
91
|
+
actionCount: number;
|
|
92
|
+
modules: any[];
|
|
93
|
+
actions: any[];
|
|
94
|
+
};
|
|
95
|
+
};
|
|
43
96
|
/**
|
|
44
97
|
* Validate a complete user (roles + permissions)
|
|
45
98
|
*/
|
|
46
|
-
validateUser(roles:
|
|
99
|
+
validateUser(roles: any, permissions: any): {
|
|
100
|
+
isValid: boolean;
|
|
101
|
+
errors: any[];
|
|
102
|
+
warnings: any[];
|
|
103
|
+
userInfo: {
|
|
104
|
+
hasValidRoles: boolean;
|
|
105
|
+
hasValidPermissions: boolean;
|
|
106
|
+
roleCount: number;
|
|
107
|
+
permissionCount: number;
|
|
108
|
+
tenant: string;
|
|
109
|
+
accessLevel: number;
|
|
110
|
+
};
|
|
111
|
+
metadata: {
|
|
112
|
+
roleValidation: {
|
|
113
|
+
roleInfos: any[];
|
|
114
|
+
tenantCount: number;
|
|
115
|
+
};
|
|
116
|
+
permissionValidation: {
|
|
117
|
+
moduleCount: number;
|
|
118
|
+
actionCount: number;
|
|
119
|
+
modules: any[];
|
|
120
|
+
actions: any[];
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
};
|
|
47
124
|
/**
|
|
48
125
|
* Get expected permissions for a set of roles (based on ODS matrix)
|
|
49
126
|
*/
|
|
50
|
-
|
|
127
|
+
getExpectedPermissionsForRoles(roles: any): unknown[];
|
|
51
128
|
/**
|
|
52
129
|
* Check if user has specific module access
|
|
53
130
|
*/
|
|
54
|
-
checkModuleAccess(permissions:
|
|
131
|
+
checkModuleAccess(permissions: any, module: any, action: any): any;
|
|
55
132
|
/**
|
|
56
133
|
* Check if user has any access to a module
|
|
57
134
|
*/
|
|
58
|
-
checkAnyModuleAccess(permissions:
|
|
135
|
+
checkAnyModuleAccess(permissions: any, module: any): any;
|
|
59
136
|
/**
|
|
60
137
|
* Get all modules the user has access to
|
|
61
138
|
*/
|
|
62
|
-
getUserModules(permissions:
|
|
139
|
+
getUserModules(permissions: any): unknown[];
|
|
63
140
|
/**
|
|
64
141
|
* Get user's effective permissions (roles + explicit permissions)
|
|
65
142
|
*/
|
|
66
|
-
getEffectivePermissions(roles:
|
|
143
|
+
getEffectivePermissions(roles: any, permissions: any): any[];
|
|
67
144
|
/**
|
|
68
145
|
* Parse ODS permission string (e.g., "c,r,u,d,s,f") into permission array
|
|
69
146
|
*/
|
|
70
|
-
parseOdsString(odsString:
|
|
147
|
+
parseOdsString(odsString: any, module: any): any;
|
|
71
148
|
/**
|
|
72
149
|
* Validate JWT payload structure
|
|
73
150
|
*/
|
|
74
|
-
validateJwtPayload(payload: any):
|
|
151
|
+
validateJwtPayload(payload: any): {
|
|
152
|
+
isValid: boolean;
|
|
153
|
+
errors: any[];
|
|
154
|
+
warnings: any[];
|
|
155
|
+
};
|
|
75
156
|
}
|
|
76
157
|
//# sourceMappingURL=contractx-validation.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contractx-validation.service.d.ts","sourceRoot":"","sources":["../../src/services/contractx-validation.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contractx-validation.service.d.ts","sourceRoot":"","sources":["../../src/services/contractx-validation.service.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AACD,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AACD,MAAM,WAAW,0BAA2B,SAAQ,gBAAgB;IAClE,cAAc,CAAC,EAAE;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,EAAE,CAAC;CACL;AACD,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,QAAQ,CAAC,EAAE;QACT,aAAa,EAAE,OAAO,CAAC;QACvB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;QACnD,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,qBACa,0BAA0B;IACnC;;OAEG;IACH,kBAAkB,CAAC,IAAI,KAAA;;;;;;;;;;;;;;;;;;;IAiCvB,aAAa,CAAC,KAAK,KAAA;;;;;;;;;;;;;;IAoCnB,wBAAwB,CAAC,UAAU,KAAA;;;;;;IAqCnC,mBAAmB,CAAC,WAAW,KAAA;;;;;;;;;;;;;;;;;;IAoC/B;;OAEG;IACH,YAAY,CAAC,KAAK,KAAA,EAAE,WAAW,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;IA4D/B;;OAEG;IACH,8BAA8B,CAAC,KAAK,KAAA;IAcpC;;OAEG;IACH,iBAAiB,CAAC,WAAW,KAAA,EAAE,MAAM,KAAA,EAAE,MAAM,KAAA;IAG7C;;OAEG;IACH,oBAAoB,CAAC,WAAW,KAAA,EAAE,MAAM,KAAA;IAGxC;;OAEG;IACH,cAAc,CAAC,WAAW,KAAA;IAU1B;;OAEG;IACH,uBAAuB,CAAC,KAAK,KAAA,EAAE,WAAW,KAAA;IAK1C;;OAEG;IACH,cAAc,CAAC,SAAS,KAAA,EAAE,MAAM,KAAA;IAIhC;;OAEG;IACH,kBAAkB,CAAC,OAAO,KAAA;;;;;CAoC7B"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export * from './user-context.service';
|
|
2
2
|
export * from './contractx-validation.service';
|
|
3
3
|
export * from './contractx-authorization.service';
|
|
4
|
-
export { ValidationResult, RoleValidationResult, PermissionValidationResult, UserValidationResult, } from './contractx-validation.service';
|
|
5
|
-
export { AuthorizationContext, AuthorizationResult, AccessMatrix, } from './contractx-authorization.service';
|
|
6
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC"}
|
package/dist/services/index.js
CHANGED
|
@@ -18,3 +18,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
__exportStar(require("./user-context.service"), exports);
|
|
19
19
|
__exportStar(require("./contractx-validation.service"), exports);
|
|
20
20
|
__exportStar(require("./contractx-authorization.service"), exports);
|
|
21
|
+
// NOTA[reconstrucción]: contractx-document-compliance.service NO se exporta (huérfano en el
|
|
22
|
+
// tarball original — compilado pero ausente de services/index y del index raíz). Ver clasificación "ajeno".
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import { JwtPayload } from '../interfaces';
|
|
2
|
-
|
|
3
|
-
* Request-scoped service to manage current user context
|
|
4
|
-
* Provides convenient methods to access user information and check permissions
|
|
5
|
-
*/
|
|
6
|
-
interface RequestWithUser {
|
|
7
|
-
user?: any;
|
|
1
|
+
import { AuthenticatedRequest, JwtPayload } from '../interfaces';
|
|
2
|
+
type RequestWithUser = AuthenticatedRequest & {
|
|
8
3
|
tenant?: any;
|
|
9
|
-
}
|
|
4
|
+
};
|
|
10
5
|
export declare class UserContextService {
|
|
11
6
|
private readonly request;
|
|
12
7
|
private user;
|
|
@@ -16,40 +11,40 @@ export declare class UserContextService {
|
|
|
16
11
|
* Set the current user context
|
|
17
12
|
* This is typically called by the authentication guard
|
|
18
13
|
*/
|
|
19
|
-
setUser(user:
|
|
14
|
+
setUser(user: any): void;
|
|
20
15
|
/**
|
|
21
16
|
* Auto-initialize user from request if not manually set
|
|
22
17
|
*/
|
|
23
|
-
|
|
18
|
+
tryAutoInitialize(): void;
|
|
24
19
|
/**
|
|
25
20
|
* Get the current authenticated user
|
|
26
21
|
*/
|
|
27
|
-
getUser(): JwtPayload
|
|
22
|
+
getUser(): JwtPayload;
|
|
28
23
|
/**
|
|
29
24
|
* Get the current user's ID
|
|
30
25
|
*/
|
|
31
|
-
getUserId(): string
|
|
26
|
+
getUserId(): string;
|
|
32
27
|
/**
|
|
33
28
|
* Get the current user's full name
|
|
34
29
|
*/
|
|
35
|
-
getUserFullName(): string
|
|
30
|
+
getUserFullName(): string;
|
|
36
31
|
/**
|
|
37
32
|
* Get the current user's email
|
|
38
33
|
*/
|
|
39
|
-
getUserEmail(): string
|
|
34
|
+
getUserEmail(): string;
|
|
40
35
|
/**
|
|
41
36
|
* Get the current user's client ID
|
|
42
37
|
*/
|
|
43
|
-
getClientId(): string
|
|
38
|
+
getClientId(): string;
|
|
44
39
|
/**
|
|
45
40
|
* Get the tenant key (key_client) for multi-tenant operations
|
|
46
41
|
* Tries multiple sources: user.key_client, user.clientId, tenant.key_client
|
|
47
42
|
*/
|
|
48
|
-
getTenantKey():
|
|
43
|
+
getTenantKey(): any;
|
|
49
44
|
/**
|
|
50
45
|
* Get the current user's session ID
|
|
51
46
|
*/
|
|
52
|
-
getSessionId(): string
|
|
47
|
+
getSessionId(): string;
|
|
53
48
|
/**
|
|
54
49
|
* Get all user roles
|
|
55
50
|
*/
|
|
@@ -61,27 +56,27 @@ export declare class UserContextService {
|
|
|
61
56
|
/**
|
|
62
57
|
* Check if user has a specific role
|
|
63
58
|
*/
|
|
64
|
-
hasRole(role:
|
|
59
|
+
hasRole(role: any): boolean;
|
|
65
60
|
/**
|
|
66
61
|
* Check if user has any of the specified roles
|
|
67
62
|
*/
|
|
68
|
-
hasAnyRole(roles:
|
|
63
|
+
hasAnyRole(roles: any): any;
|
|
69
64
|
/**
|
|
70
65
|
* Check if user has all of the specified roles
|
|
71
66
|
*/
|
|
72
|
-
hasAllRoles(roles:
|
|
67
|
+
hasAllRoles(roles: any): any;
|
|
73
68
|
/**
|
|
74
69
|
* Check if user has a specific permission
|
|
75
70
|
*/
|
|
76
|
-
hasPermission(permission:
|
|
71
|
+
hasPermission(permission: any): boolean;
|
|
77
72
|
/**
|
|
78
73
|
* Check if user has any of the specified permissions
|
|
79
74
|
*/
|
|
80
|
-
hasAnyPermission(permissions:
|
|
75
|
+
hasAnyPermission(permissions: any): any;
|
|
81
76
|
/**
|
|
82
77
|
* Check if user has all of the specified permissions
|
|
83
78
|
*/
|
|
84
|
-
hasAllPermissions(permissions:
|
|
79
|
+
hasAllPermissions(permissions: any): any;
|
|
85
80
|
/**
|
|
86
81
|
* Check if user is authenticated
|
|
87
82
|
*/
|
|
@@ -93,38 +88,38 @@ export declare class UserContextService {
|
|
|
93
88
|
/**
|
|
94
89
|
* Check if user has admin privileges (superadmin or contract admin)
|
|
95
90
|
*/
|
|
96
|
-
isAdmin():
|
|
91
|
+
isAdmin(): any;
|
|
97
92
|
/**
|
|
98
93
|
* Check if user has client-side role
|
|
99
94
|
*/
|
|
100
|
-
isClientUser():
|
|
95
|
+
isClientUser(): any;
|
|
101
96
|
/**
|
|
102
97
|
* Check if user has provider-side role
|
|
103
98
|
*/
|
|
104
|
-
isProviderUser():
|
|
99
|
+
isProviderUser(): any;
|
|
105
100
|
/**
|
|
106
101
|
* Check if user can access a specific module based on permissions
|
|
107
102
|
*/
|
|
108
|
-
canAccessModule(module:
|
|
103
|
+
canAccessModule(module: any): boolean;
|
|
109
104
|
/**
|
|
110
105
|
* Get user's permissions for a specific module
|
|
111
106
|
*/
|
|
112
|
-
getModulePermissions(module:
|
|
107
|
+
getModulePermissions(module: any): string[];
|
|
113
108
|
/**
|
|
114
109
|
* Check if user can perform a specific action on a module
|
|
115
110
|
*/
|
|
116
|
-
canPerformAction(module:
|
|
111
|
+
canPerformAction(module: any, action: any): boolean;
|
|
117
112
|
/**
|
|
118
113
|
* Get user summary for logging/debugging
|
|
119
114
|
*/
|
|
120
115
|
getUserSummary(): {
|
|
121
|
-
id: string
|
|
122
|
-
name: string
|
|
123
|
-
email: string
|
|
116
|
+
id: string;
|
|
117
|
+
name: string;
|
|
118
|
+
email: string;
|
|
124
119
|
roles: string[];
|
|
125
120
|
permissionCount: number;
|
|
126
|
-
isAdmin:
|
|
127
|
-
clientId: string
|
|
121
|
+
isAdmin: any;
|
|
122
|
+
clientId: string;
|
|
128
123
|
};
|
|
129
124
|
}
|
|
130
125
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-context.service.d.ts","sourceRoot":"","sources":["../../src/services/user-context.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user-context.service.d.ts","sourceRoot":"","sources":["../../src/services/user-context.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKjE,KAAK,eAAe,GAAG,oBAAoB,GAAG;IAAE,MAAM,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC;AA4D/D,qBACa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,eAAe,CAAS;gBAEH,OAAO,EAAE,eAAe;IAKrD;;;OAGG;IACH,OAAO,CAAC,IAAI,KAAA;IAGZ;;OAEG;IACH,iBAAiB;IA0BjB;;OAEG;IACH,OAAO;IAIP;;OAEG;IACH,SAAS;IAMT;;OAEG;IACH,eAAe;IAMf;;OAEG;IACH,YAAY;IAMZ;;OAEG;IACH,WAAW;IAMX;;;OAGG;IACH,YAAY;IA+BZ;;OAEG;IACH,YAAY;IAMZ;;OAEG;IACH,YAAY;IAIZ;;OAEG;IACH,kBAAkB;IAIlB;;OAEG;IACH,OAAO,CAAC,IAAI,KAAA;IAGZ;;OAEG;IACH,UAAU,CAAC,KAAK,KAAA;IAIhB;;OAEG;IACH,WAAW,CAAC,KAAK,KAAA;IAIjB;;OAEG;IACH,aAAa,CAAC,UAAU,KAAA;IAGxB;;OAEG;IACH,gBAAgB,CAAC,WAAW,KAAA;IAI5B;;OAEG;IACH,iBAAiB,CAAC,WAAW,KAAA;IAI7B;;OAEG;IACH,eAAe;IAIf;;OAEG;IACH,YAAY;IAGZ;;OAEG;IACH,OAAO;IAGP;;OAEG;IACH,YAAY;IAGZ;;OAEG;IACH,cAAc;IAGd;;OAEG;IACH,eAAe,CAAC,MAAM,KAAA;IAItB;;OAEG;IACH,oBAAoB,CAAC,MAAM,KAAA;IAG3B;;OAEG;IACH,gBAAgB,CAAC,MAAM,KAAA,EAAE,MAAM,KAAA;IAG/B;;OAEG;IACH,cAAc;;;;;;;;;CAWjB"}
|
|
@@ -16,8 +16,70 @@ exports.UserContextService = void 0;
|
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const core_1 = require("@nestjs/core");
|
|
18
18
|
const contractx_roles_constants_1 = require("../constants/contractx-roles.constants");
|
|
19
|
+
function coerceStringOrNumber(...vals) {
|
|
20
|
+
for (const v of vals) {
|
|
21
|
+
if (typeof v === 'string' && v.length > 0)
|
|
22
|
+
return v;
|
|
23
|
+
if (typeof v === 'number')
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
function coerceString(...vals) {
|
|
29
|
+
for (const v of vals)
|
|
30
|
+
if (typeof v === 'string' && v.length > 0)
|
|
31
|
+
return v;
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
function coerceStringArray(...vals) {
|
|
35
|
+
for (const v of vals) {
|
|
36
|
+
if (Array.isArray(v)) {
|
|
37
|
+
const arr = v.filter((x) => typeof x === 'string');
|
|
38
|
+
if (arr.length > 0)
|
|
39
|
+
return arr;
|
|
40
|
+
}
|
|
41
|
+
if (typeof v === 'string' && v.length > 0)
|
|
42
|
+
return [v];
|
|
43
|
+
}
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
function coerceOptionalString(...vals) {
|
|
47
|
+
for (const v of vals)
|
|
48
|
+
if (typeof v === 'string' && v.length > 0)
|
|
49
|
+
return v;
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function coerceOptionalNumber(v) {
|
|
53
|
+
return typeof v === 'number' ? v : undefined;
|
|
54
|
+
}
|
|
55
|
+
function normalizeToPayload(raw) {
|
|
56
|
+
return {
|
|
57
|
+
sub: coerceStringOrNumber(raw.sub, raw.id, raw.user_id),
|
|
58
|
+
role: coerceStringArray(raw.role, raw.roles),
|
|
59
|
+
permissions: coerceStringArray(raw.permissions),
|
|
60
|
+
permissionsView: Array.isArray(raw.permissionsView)
|
|
61
|
+
? raw.permissionsView.filter((x) => typeof x === 'string')
|
|
62
|
+
: undefined,
|
|
63
|
+
fullName: coerceString(raw.fullName, raw.full_name, raw.username),
|
|
64
|
+
email: coerceOptionalString(raw.email),
|
|
65
|
+
clientId: coerceStringArray(raw.clientId, raw.client_id),
|
|
66
|
+
providerId: coerceOptionalString(raw.providerId),
|
|
67
|
+
tenantContext: (() => {
|
|
68
|
+
const t = raw.tenantContext;
|
|
69
|
+
return t === 'client' || t === 'provider' || t === 'system' ? t : undefined;
|
|
70
|
+
})(),
|
|
71
|
+
key_client: coerceStringArray(raw.key_client),
|
|
72
|
+
sessionId: coerceOptionalString(raw.sessionId, raw.session_id),
|
|
73
|
+
iat: coerceOptionalNumber(raw.iat),
|
|
74
|
+
exp: coerceOptionalNumber(raw.exp),
|
|
75
|
+
iss: coerceOptionalString(raw.iss),
|
|
76
|
+
aud: coerceOptionalString(raw.aud),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
19
79
|
let UserContextService = class UserContextService {
|
|
20
80
|
constructor(request) {
|
|
81
|
+
this.user = null;
|
|
82
|
+
this.autoInitialized = false;
|
|
21
83
|
this.request = request;
|
|
22
84
|
this.user = null;
|
|
23
85
|
this.autoInitialized = false;
|
|
@@ -40,31 +102,7 @@ let UserContextService = class UserContextService {
|
|
|
40
102
|
// Try to get user from request.user (populated by JWT middleware)
|
|
41
103
|
if (this.request?.user) {
|
|
42
104
|
try {
|
|
43
|
-
|
|
44
|
-
const requestUser = this.request.user;
|
|
45
|
-
// Convert to JwtPayload format
|
|
46
|
-
const payload = {
|
|
47
|
-
sub: requestUser.sub || requestUser.id || requestUser.user_id,
|
|
48
|
-
role: requestUser.role || requestUser.roles || [],
|
|
49
|
-
permissions: requestUser.permissions || [],
|
|
50
|
-
fullName: requestUser.fullName || requestUser.full_name || requestUser.username || '',
|
|
51
|
-
email: requestUser.email,
|
|
52
|
-
clientId: Array.isArray(requestUser.clientId)
|
|
53
|
-
? requestUser.clientId[0]
|
|
54
|
-
: (requestUser.clientId || requestUser.client_id),
|
|
55
|
-
sessionId: requestUser.sessionId || requestUser.session_id,
|
|
56
|
-
iat: requestUser.iat,
|
|
57
|
-
exp: requestUser.exp,
|
|
58
|
-
iss: requestUser.iss,
|
|
59
|
-
aud: requestUser.aud,
|
|
60
|
-
};
|
|
61
|
-
// Copy any additional properties
|
|
62
|
-
Object.keys(requestUser).forEach(key => {
|
|
63
|
-
if (!(key in payload)) {
|
|
64
|
-
payload[key] = requestUser[key];
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
this.user = payload;
|
|
105
|
+
this.user = normalizeToPayload(this.request.user);
|
|
68
106
|
return;
|
|
69
107
|
}
|
|
70
108
|
catch (error) {
|
|
@@ -74,25 +112,7 @@ let UserContextService = class UserContextService {
|
|
|
74
112
|
// Fallback: try to get user from request.tenant (if populated by custom middleware)
|
|
75
113
|
if (this.request?.tenant) {
|
|
76
114
|
try {
|
|
77
|
-
|
|
78
|
-
const payload = {
|
|
79
|
-
sub: tenant.user_id || tenant.sub || tenant.id,
|
|
80
|
-
role: tenant.roles || [tenant.role].filter(Boolean),
|
|
81
|
-
permissions: tenant.permissions || [],
|
|
82
|
-
fullName: tenant.fullName || tenant.full_name || tenant.username || '',
|
|
83
|
-
email: tenant.email,
|
|
84
|
-
clientId: Array.isArray(tenant.clientId)
|
|
85
|
-
? tenant.clientId[0]
|
|
86
|
-
: (tenant.clientId || tenant.client_id),
|
|
87
|
-
sessionId: tenant.sessionId || tenant.session_id,
|
|
88
|
-
};
|
|
89
|
-
// Copy additional properties
|
|
90
|
-
Object.keys(tenant).forEach(key => {
|
|
91
|
-
if (!(key in payload)) {
|
|
92
|
-
payload[key] = tenant[key];
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
this.user = payload;
|
|
115
|
+
this.user = normalizeToPayload(this.request.tenant);
|
|
96
116
|
return;
|
|
97
117
|
}
|
|
98
118
|
catch (error) {
|
|
@@ -312,3 +332,4 @@ exports.UserContextService = UserContextService = __decorate([
|
|
|
312
332
|
__param(0, (0, common_1.Inject)(core_1.REQUEST)),
|
|
313
333
|
__metadata("design:paramtypes", [Object])
|
|
314
334
|
], UserContextService);
|
|
335
|
+
;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "permissions-contractx",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Enterprise-grade authentication and authorization package for NestJS microservices with role-based and permission-based access control",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -36,14 +36,6 @@
|
|
|
36
36
|
],
|
|
37
37
|
"author": "ContractX Development Team",
|
|
38
38
|
"license": "MIT",
|
|
39
|
-
"homepage": "https://github.com/your-org/permissions-contractx#readme",
|
|
40
|
-
"repository": {
|
|
41
|
-
"type": "git",
|
|
42
|
-
"url": "git+https://github.com/your-org/permissions-contractx.git"
|
|
43
|
-
},
|
|
44
|
-
"bugs": {
|
|
45
|
-
"url": "https://github.com/your-org/permissions-contractx/issues"
|
|
46
|
-
},
|
|
47
39
|
"engines": {
|
|
48
40
|
"node": ">=16.0.0",
|
|
49
41
|
"npm": ">=7.0.0"
|
|
@@ -53,30 +45,19 @@
|
|
|
53
45
|
"@nestjs/config": "^4.0.2",
|
|
54
46
|
"@nestjs/core": "^11.1.6",
|
|
55
47
|
"@nestjs/jwt": "^11.0.0",
|
|
48
|
+
"express": "^5.0.0",
|
|
56
49
|
"jsonwebtoken": "^9.0.0",
|
|
57
50
|
"reflect-metadata": "^0.1.13",
|
|
58
51
|
"rxjs": "^7.0.0"
|
|
59
52
|
},
|
|
60
53
|
"devDependencies": {
|
|
61
54
|
"@nestjs/platform-express": "^11.1.6",
|
|
62
|
-
"@nestjs/testing": "^11.1.6",
|
|
63
55
|
"@types/express": "^5.0.3",
|
|
64
|
-
"@types/jest": "^
|
|
65
|
-
"@types/jsonwebtoken": "^9.0.0",
|
|
56
|
+
"@types/jest": "^30.0.0",
|
|
66
57
|
"@types/node": "^20.0.0",
|
|
67
|
-
"
|
|
68
|
-
"@typescript-eslint/eslint-plugin": "^8.43.0",
|
|
69
|
-
"@typescript-eslint/parser": "^8.43.0",
|
|
70
|
-
"eslint": "^9.35.0",
|
|
71
|
-
"jest": "^30.1.3",
|
|
58
|
+
"jest": "^30.4.2",
|
|
72
59
|
"rimraf": "^5.0.0",
|
|
73
|
-
"
|
|
74
|
-
"ts-jest": "^28.0.5",
|
|
75
|
-
"ts-node": "^10.9.0",
|
|
60
|
+
"ts-jest": "^29.4.11",
|
|
76
61
|
"typescript": "^5.0.0"
|
|
77
|
-
},
|
|
78
|
-
"directories": {
|
|
79
|
-
"example": "examples",
|
|
80
|
-
"test": "test"
|
|
81
62
|
}
|
|
82
63
|
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ContractX Document Compliance Service
|
|
3
|
-
* Validates permissions-contractx package compliance with PermisosRoles.odt document requirements
|
|
4
|
-
*/
|
|
5
|
-
export interface ComplianceValidationResult {
|
|
6
|
-
isCompliant: boolean;
|
|
7
|
-
summary: {
|
|
8
|
-
totalRoles: number;
|
|
9
|
-
validatedRoles: number;
|
|
10
|
-
totalPermissions: number;
|
|
11
|
-
validatedPermissions: number;
|
|
12
|
-
compliantRoles: string[];
|
|
13
|
-
nonCompliantRoles: string[];
|
|
14
|
-
};
|
|
15
|
-
roleAnalysis: Array<{
|
|
16
|
-
role: string;
|
|
17
|
-
isCompliant: boolean;
|
|
18
|
-
expectedPermissions: string[];
|
|
19
|
-
actualPermissions: string[];
|
|
20
|
-
missingPermissions: string[];
|
|
21
|
-
extraPermissions: string[];
|
|
22
|
-
documentReference: string;
|
|
23
|
-
}>;
|
|
24
|
-
modulesCoverage: Array<{
|
|
25
|
-
module: string;
|
|
26
|
-
covered: boolean;
|
|
27
|
-
usedByRoles: string[];
|
|
28
|
-
}>;
|
|
29
|
-
warnings: string[];
|
|
30
|
-
errors: string[];
|
|
31
|
-
}
|
|
32
|
-
export interface DocumentRequirement {
|
|
33
|
-
role: string;
|
|
34
|
-
category: 'system' | 'client' | 'provider';
|
|
35
|
-
permissions: Record<string, string[]>;
|
|
36
|
-
restrictions: string[];
|
|
37
|
-
}
|
|
38
|
-
export declare class ContractXDocumentComplianceService {
|
|
39
|
-
private readonly logger;
|
|
40
|
-
/**
|
|
41
|
-
* Document-based role requirements extracted from PermisosRoles.odt
|
|
42
|
-
*/
|
|
43
|
-
private readonly DOCUMENT_REQUIREMENTS;
|
|
44
|
-
/**
|
|
45
|
-
* Permission action mappings from document notation to system notation
|
|
46
|
-
*/
|
|
47
|
-
private readonly ACTION_MAPPINGS;
|
|
48
|
-
/**
|
|
49
|
-
* Validates complete package compliance with PermisosRoles.odt document
|
|
50
|
-
*/
|
|
51
|
-
validateDocumentCompliance(): Promise<ComplianceValidationResult>;
|
|
52
|
-
/**
|
|
53
|
-
* Validates a specific role against document requirements
|
|
54
|
-
*/
|
|
55
|
-
private validateRoleCompliance;
|
|
56
|
-
/**
|
|
57
|
-
* Converts document requirements to permission strings
|
|
58
|
-
*/
|
|
59
|
-
private convertRequirementsToPermissions;
|
|
60
|
-
/**
|
|
61
|
-
* Validates module coverage across all roles
|
|
62
|
-
*/
|
|
63
|
-
private validateModulesCoverage;
|
|
64
|
-
/**
|
|
65
|
-
* Finds roles that use a specific module
|
|
66
|
-
*/
|
|
67
|
-
private findRolesUsingModule;
|
|
68
|
-
/**
|
|
69
|
-
* Counts total validated permissions across all roles
|
|
70
|
-
*/
|
|
71
|
-
private countValidatedPermissions;
|
|
72
|
-
/**
|
|
73
|
-
* Adds warnings for roles present in package but not in document
|
|
74
|
-
*/
|
|
75
|
-
private addMissingRoleWarnings;
|
|
76
|
-
/**
|
|
77
|
-
* Gets the document section for a role
|
|
78
|
-
*/
|
|
79
|
-
private getRoleSection;
|
|
80
|
-
/**
|
|
81
|
-
* Generates a compliance report summary
|
|
82
|
-
*/
|
|
83
|
-
generateComplianceReport(validation: ComplianceValidationResult): string;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=contractx-document-compliance.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contractx-document-compliance.service.d.ts","sourceRoot":"","sources":["../../src/services/contractx-document-compliance.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;QACrB,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC,CAAC;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBACa,kCAAkC;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;IAE9E;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAwRpC;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAO9B;IAEF;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAuDvE;;OAEG;YACW,sBAAsB;IA+BpC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAexC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAWjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,wBAAwB,CAAC,UAAU,EAAE,0BAA0B,GAAG,MAAM;CA2DzE"}
|