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
@@ -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
- // Handle different user object formats
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
- const tenant = this.request.tenant;
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.2",
3
+ "version": "1.1.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": "^25.1.0",
65
- "@types/jsonwebtoken": "^9.0.0",
56
+ "@types/jest": "^30.0.0",
66
57
  "@types/node": "^20.0.0",
67
- "@types/supertest": "^2.0.12",
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
- "supertest": "^6.3.0",
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"}