@lenne.tech/nest-server 11.20.1 → 11.21.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 (84) hide show
  1. package/README.md +444 -100
  2. package/dist/core/common/decorators/restricted.decorator.d.ts +1 -0
  3. package/dist/core/common/decorators/restricted.decorator.js +4 -1
  4. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  5. package/dist/core/common/helpers/input.helper.js +11 -8
  6. package/dist/core/common/helpers/input.helper.js.map +1 -1
  7. package/dist/core/common/interceptors/check-security.interceptor.js +10 -8
  8. package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
  9. package/dist/core/common/interfaces/server-options.interface.d.ts +5 -1
  10. package/dist/core/common/middleware/request-context.middleware.js +10 -6
  11. package/dist/core/common/middleware/request-context.middleware.js.map +1 -1
  12. package/dist/core/common/plugins/mongoose-tenant.plugin.js +40 -24
  13. package/dist/core/common/plugins/mongoose-tenant.plugin.js.map +1 -1
  14. package/dist/core/common/services/email.service.d.ts +5 -1
  15. package/dist/core/common/services/email.service.js +16 -2
  16. package/dist/core/common/services/email.service.js.map +1 -1
  17. package/dist/core/common/services/request-context.service.d.ts +3 -0
  18. package/dist/core/common/services/request-context.service.js +6 -0
  19. package/dist/core/common/services/request-context.service.js.map +1 -1
  20. package/dist/core/modules/auth/guards/roles.guard.js +6 -10
  21. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  22. package/dist/core/modules/auth/tokens.decorator.d.ts +1 -1
  23. package/dist/core/modules/better-auth/better-auth-roles.guard.js +5 -6
  24. package/dist/core/modules/better-auth/better-auth-roles.guard.js.map +1 -1
  25. package/dist/core/modules/better-auth/core-better-auth-user.mapper.d.ts +6 -0
  26. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +52 -17
  27. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
  28. package/dist/core/modules/better-auth/core-better-auth.service.d.ts +3 -1
  29. package/dist/core/modules/better-auth/core-better-auth.service.js +14 -0
  30. package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
  31. package/dist/core/modules/tenant/core-tenant-member.model.d.ts +11 -0
  32. package/dist/core/modules/tenant/core-tenant-member.model.js +106 -0
  33. package/dist/core/modules/tenant/core-tenant-member.model.js.map +1 -0
  34. package/dist/core/modules/tenant/core-tenant.decorators.d.ts +3 -0
  35. package/dist/core/modules/tenant/core-tenant.decorators.js +12 -0
  36. package/dist/core/modules/tenant/core-tenant.decorators.js.map +1 -0
  37. package/dist/core/modules/tenant/core-tenant.enums.d.ts +13 -0
  38. package/dist/core/modules/tenant/core-tenant.enums.js +25 -0
  39. package/dist/core/modules/tenant/core-tenant.enums.js.map +1 -0
  40. package/dist/core/modules/tenant/core-tenant.guard.d.ts +25 -0
  41. package/dist/core/modules/tenant/core-tenant.guard.js +271 -0
  42. package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -0
  43. package/dist/core/modules/tenant/core-tenant.helpers.d.ts +7 -0
  44. package/dist/core/modules/tenant/core-tenant.helpers.js +60 -0
  45. package/dist/core/modules/tenant/core-tenant.helpers.js.map +1 -0
  46. package/dist/core/modules/tenant/core-tenant.module.d.ts +12 -0
  47. package/dist/core/modules/tenant/core-tenant.module.js +58 -0
  48. package/dist/core/modules/tenant/core-tenant.module.js.map +1 -0
  49. package/dist/core/modules/tenant/core-tenant.service.d.ts +19 -0
  50. package/dist/core/modules/tenant/core-tenant.service.js +170 -0
  51. package/dist/core/modules/tenant/core-tenant.service.js.map +1 -0
  52. package/dist/core/modules/user/core-user.service.js +12 -1
  53. package/dist/core/modules/user/core-user.service.js.map +1 -1
  54. package/dist/core.module.js +11 -0
  55. package/dist/core.module.js.map +1 -1
  56. package/dist/index.d.ts +7 -0
  57. package/dist/index.js +7 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/tsconfig.build.tsbuildinfo +1 -1
  60. package/package.json +35 -24
  61. package/src/core/common/decorators/restricted.decorator.ts +12 -2
  62. package/src/core/common/helpers/input.helper.ts +24 -9
  63. package/src/core/common/interceptors/check-security.interceptor.ts +19 -13
  64. package/src/core/common/interfaces/server-options.interface.ts +80 -28
  65. package/src/core/common/middleware/request-context.middleware.ts +12 -5
  66. package/src/core/common/plugins/mongoose-tenant.plugin.ts +78 -45
  67. package/src/core/common/services/email.service.ts +26 -5
  68. package/src/core/common/services/request-context.service.ts +15 -1
  69. package/src/core/modules/auth/guards/roles.guard.ts +10 -10
  70. package/src/core/modules/better-auth/better-auth-roles.guard.ts +9 -6
  71. package/src/core/modules/better-auth/core-better-auth-user.mapper.ts +86 -21
  72. package/src/core/modules/better-auth/core-better-auth.service.ts +27 -2
  73. package/src/core/modules/tenant/INTEGRATION-CHECKLIST.md +165 -0
  74. package/src/core/modules/tenant/README.md +268 -0
  75. package/src/core/modules/tenant/core-tenant-member.model.ts +121 -0
  76. package/src/core/modules/tenant/core-tenant.decorators.ts +46 -0
  77. package/src/core/modules/tenant/core-tenant.enums.ts +77 -0
  78. package/src/core/modules/tenant/core-tenant.guard.ts +441 -0
  79. package/src/core/modules/tenant/core-tenant.helpers.ts +103 -0
  80. package/src/core/modules/tenant/core-tenant.module.ts +102 -0
  81. package/src/core/modules/tenant/core-tenant.service.ts +244 -0
  82. package/src/core/modules/user/core-user.service.ts +17 -1
  83. package/src/core.module.ts +15 -0
  84. package/src/index.ts +12 -0
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultHR = exports.DEFAULT_ROLE_HIERARCHY = exports.TenantMemberStatus = exports.TENANT_MEMBER_MODEL_TOKEN = void 0;
4
+ exports.createHierarchyRoles = createHierarchyRoles;
5
+ exports.TENANT_MEMBER_MODEL_TOKEN = 'TenantMember';
6
+ var TenantMemberStatus;
7
+ (function (TenantMemberStatus) {
8
+ TenantMemberStatus["ACTIVE"] = "ACTIVE";
9
+ TenantMemberStatus["INVITED"] = "INVITED";
10
+ TenantMemberStatus["SUSPENDED"] = "SUSPENDED";
11
+ })(TenantMemberStatus || (exports.TenantMemberStatus = TenantMemberStatus = {}));
12
+ exports.DEFAULT_ROLE_HIERARCHY = {
13
+ member: 1,
14
+ manager: 2,
15
+ owner: 3,
16
+ };
17
+ function createHierarchyRoles(hierarchy) {
18
+ const result = {};
19
+ for (const key of Object.keys(hierarchy)) {
20
+ result[key.toUpperCase()] = key;
21
+ }
22
+ return result;
23
+ }
24
+ exports.DefaultHR = createHierarchyRoles(exports.DEFAULT_ROLE_HIERARCHY);
25
+ //# sourceMappingURL=core-tenant.enums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tenant.enums.js","sourceRoot":"","sources":["../../../../src/core/modules/tenant/core-tenant.enums.ts"],"names":[],"mappings":";;;AAuDA,oDAQC;AA3DY,QAAA,yBAAyB,GAAG,cAAc,CAAC;AAKxD,IAAY,kBAKX;AALD,WAAY,kBAAkB;IAC5B,uCAAiB,CAAA;IAEjB,yCAAmB,CAAA;IACnB,6CAAuB,CAAA;AACzB,CAAC,EALW,kBAAkB,kCAAlB,kBAAkB,QAK7B;AAmBY,QAAA,sBAAsB,GAA2B;IAC5D,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;CACT,CAAC;AAkBF,SAAgB,oBAAoB,CAClC,SAAY;IAEZ,MAAM,MAAM,GAAG,EAAS,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAaY,QAAA,SAAS,GAAG,oBAAoB,CAAC,8BAAsB,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { CanActivate, ExecutionContext, OnModuleDestroy } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { Model } from 'mongoose';
4
+ import { CoreTenantMemberModel } from './core-tenant-member.model';
5
+ export declare class CoreTenantGuard implements CanActivate, OnModuleDestroy {
6
+ private readonly reflector;
7
+ private readonly memberModel;
8
+ private readonly logger;
9
+ private readonly membershipCache;
10
+ private readonly tenantIdsCache;
11
+ private cacheTtlMs;
12
+ private static readonly MAX_CACHE_SIZE;
13
+ private cleanupInterval;
14
+ private lastSeenConfig;
15
+ constructor(reflector: Reflector, memberModel: Model<CoreTenantMemberModel>);
16
+ onModuleDestroy(): void;
17
+ invalidateUser(userId: string): void;
18
+ invalidateAll(): void;
19
+ canActivate(context: ExecutionContext): Promise<boolean>;
20
+ private resolveUserTenantIds;
21
+ private getRequest;
22
+ private findMembershipCached;
23
+ private evictIfOverCapacity;
24
+ private evictExpired;
25
+ }
@@ -0,0 +1,271 @@
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 CoreTenantGuard_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.CoreTenantGuard = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const core_1 = require("@nestjs/core");
19
+ const graphql_1 = require("@nestjs/graphql");
20
+ const mongoose_1 = require("@nestjs/mongoose");
21
+ const mongoose_2 = require("mongoose");
22
+ const role_enum_1 = require("../../common/enums/role.enum");
23
+ const config_service_1 = require("../../common/services/config.service");
24
+ const core_tenant_decorators_1 = require("./core-tenant.decorators");
25
+ const core_tenant_enums_1 = require("./core-tenant.enums");
26
+ const core_tenant_helpers_1 = require("./core-tenant.helpers");
27
+ let CoreTenantGuard = class CoreTenantGuard {
28
+ static { CoreTenantGuard_1 = this; }
29
+ reflector;
30
+ memberModel;
31
+ logger = new common_1.Logger(CoreTenantGuard_1.name);
32
+ membershipCache = new Map();
33
+ tenantIdsCache = new Map();
34
+ cacheTtlMs = 30_000;
35
+ static MAX_CACHE_SIZE = 500;
36
+ cleanupInterval = null;
37
+ lastSeenConfig = null;
38
+ constructor(reflector, memberModel) {
39
+ this.reflector = reflector;
40
+ this.memberModel = memberModel;
41
+ this.cleanupInterval = setInterval(() => this.evictExpired(), 60_000);
42
+ if (this.cleanupInterval.unref) {
43
+ this.cleanupInterval.unref();
44
+ }
45
+ }
46
+ onModuleDestroy() {
47
+ if (this.cleanupInterval) {
48
+ clearInterval(this.cleanupInterval);
49
+ this.cleanupInterval = null;
50
+ }
51
+ this.membershipCache.clear();
52
+ this.tenantIdsCache.clear();
53
+ }
54
+ invalidateUser(userId) {
55
+ for (const key of this.membershipCache.keys()) {
56
+ if (key.startsWith(`${userId}:`)) {
57
+ this.membershipCache.delete(key);
58
+ }
59
+ }
60
+ for (const key of this.tenantIdsCache.keys()) {
61
+ if (key === userId || key.startsWith(`${userId}:`)) {
62
+ this.tenantIdsCache.delete(key);
63
+ }
64
+ }
65
+ }
66
+ invalidateAll() {
67
+ this.membershipCache.clear();
68
+ this.tenantIdsCache.clear();
69
+ }
70
+ async canActivate(context) {
71
+ const config = config_service_1.ConfigService.configFastButReadOnly?.multiTenancy;
72
+ if (!config || config.enabled === false) {
73
+ return true;
74
+ }
75
+ if (this.lastSeenConfig !== config) {
76
+ this.lastSeenConfig = config;
77
+ const isTestEnv = process.env.VITEST === 'true' || process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'e2e';
78
+ this.cacheTtlMs = config.cacheTtlMs ?? (isTestEnv ? 0 : 30_000);
79
+ this.invalidateAll();
80
+ }
81
+ const request = this.getRequest(context);
82
+ if (!request) {
83
+ return true;
84
+ }
85
+ const headerName = (config.headerName ?? 'x-tenant-id').toLowerCase();
86
+ const rawHeader = request.headers?.[headerName];
87
+ const headerTenantId = rawHeader && typeof rawHeader === 'string' && rawHeader.length <= 128 ? rawHeader.trim() : undefined;
88
+ const rolesMetadata = this.reflector.getAll('roles', [context.getHandler(), context.getClass()]);
89
+ const roles = (0, core_tenant_helpers_1.mergeRolesMetadata)(rolesMetadata);
90
+ const user = request.user;
91
+ const adminBypass = config.adminBypass !== false;
92
+ const isAdmin = adminBypass && user?.roles?.includes(role_enum_1.RoleEnum.ADMIN);
93
+ const hasNonSystemRoles = roles.some((r) => !(0, core_tenant_helpers_1.isSystemRole)(r));
94
+ const checkableRoles = hasNonSystemRoles ? roles.filter((r) => !(0, core_tenant_helpers_1.isSystemRole)(r)) : [];
95
+ const minRequiredLevel = checkableRoles.length > 0 ? (0, core_tenant_helpers_1.getMinRequiredLevel)(checkableRoles) : undefined;
96
+ const skipTenantCheck = this.reflector.getAllAndOverride(core_tenant_decorators_1.SKIP_TENANT_CHECK_KEY, [
97
+ context.getHandler(),
98
+ context.getClass(),
99
+ ]);
100
+ if (skipTenantCheck) {
101
+ if (checkableRoles.length > 0 && user) {
102
+ if (!isAdmin && !(0, core_tenant_helpers_1.checkRoleAccess)(checkableRoles, user.roles, undefined)) {
103
+ throw new common_1.ForbiddenException('Insufficient role');
104
+ }
105
+ }
106
+ return true;
107
+ }
108
+ if (headerTenantId) {
109
+ if (isAdmin) {
110
+ request.tenantId = headerTenantId;
111
+ request.isAdminBypass = true;
112
+ const requiredRole = checkableRoles.length > 0 ? checkableRoles.join(',') : 'none';
113
+ this.logger.log(`Admin bypass: user ${user.id} accessing tenant ${headerTenantId} (required: ${requiredRole})`);
114
+ return true;
115
+ }
116
+ if (!user) {
117
+ throw new common_1.ForbiddenException('Authentication required for tenant access');
118
+ }
119
+ const membership = await this.findMembershipCached(user.id, headerTenantId);
120
+ if (!membership) {
121
+ throw new common_1.ForbiddenException('Not a member of this tenant');
122
+ }
123
+ const memberRole = membership.role;
124
+ if (checkableRoles.length > 0) {
125
+ if (!(0, core_tenant_helpers_1.checkRoleAccess)(checkableRoles, undefined, memberRole)) {
126
+ throw new common_1.ForbiddenException('Insufficient tenant role');
127
+ }
128
+ }
129
+ request.tenantId = headerTenantId;
130
+ request.tenantRole = memberRole;
131
+ return true;
132
+ }
133
+ if (isAdmin) {
134
+ request.isAdminBypass = true;
135
+ return true;
136
+ }
137
+ if (checkableRoles.length > 0) {
138
+ if (!user) {
139
+ throw new common_1.ForbiddenException('Authentication required');
140
+ }
141
+ if (!(0, core_tenant_helpers_1.checkRoleAccess)(checkableRoles, user.roles, undefined)) {
142
+ throw new common_1.ForbiddenException('Insufficient role');
143
+ }
144
+ await this.resolveUserTenantIds(request, minRequiredLevel);
145
+ return true;
146
+ }
147
+ if (user) {
148
+ await this.resolveUserTenantIds(request);
149
+ }
150
+ return true;
151
+ }
152
+ async resolveUserTenantIds(request, minLevel) {
153
+ if (request.tenantIds) {
154
+ return;
155
+ }
156
+ const userId = request.user.id;
157
+ const ttl = this.cacheTtlMs;
158
+ if (ttl > 0) {
159
+ const cacheKey = minLevel !== undefined ? `${userId}:${minLevel}` : userId;
160
+ const now = Date.now();
161
+ const cached = this.tenantIdsCache.get(cacheKey);
162
+ if (cached && now < cached.expiresAt) {
163
+ request.tenantIds = cached.ids;
164
+ return;
165
+ }
166
+ }
167
+ const memberships = await this.memberModel
168
+ .find({
169
+ status: core_tenant_enums_1.TenantMemberStatus.ACTIVE,
170
+ user: userId,
171
+ })
172
+ .select('tenant role')
173
+ .lean()
174
+ .exec();
175
+ let ids;
176
+ if (minLevel !== undefined) {
177
+ const hierarchy = (0, core_tenant_helpers_1.getRoleHierarchy)();
178
+ ids = memberships
179
+ .filter((m) => {
180
+ const level = hierarchy[m.role] ?? 0;
181
+ return level >= minLevel;
182
+ })
183
+ .map((m) => m.tenant);
184
+ }
185
+ else {
186
+ ids = memberships.map((m) => m.tenant);
187
+ }
188
+ request.tenantIds = ids;
189
+ if (ttl > 0) {
190
+ const cacheKey = minLevel !== undefined ? `${userId}:${minLevel}` : userId;
191
+ this.evictIfOverCapacity(this.tenantIdsCache);
192
+ this.tenantIdsCache.set(cacheKey, { expiresAt: Date.now() + ttl, ids });
193
+ }
194
+ }
195
+ getRequest(context) {
196
+ if (context.getType() === 'graphql') {
197
+ const ctx = graphql_1.GqlExecutionContext.create(context);
198
+ return ctx.getContext()?.req;
199
+ }
200
+ try {
201
+ return context.switchToHttp().getRequest();
202
+ }
203
+ catch {
204
+ return null;
205
+ }
206
+ }
207
+ async findMembershipCached(userId, tenantId) {
208
+ const ttl = this.cacheTtlMs;
209
+ if (ttl <= 0) {
210
+ return this.memberModel
211
+ .findOne({ status: core_tenant_enums_1.TenantMemberStatus.ACTIVE, tenant: tenantId, user: userId })
212
+ .lean()
213
+ .exec();
214
+ }
215
+ const key = `${userId}:${tenantId}`;
216
+ const now = Date.now();
217
+ const cached = this.membershipCache.get(key);
218
+ if (cached && now < cached.expiresAt) {
219
+ return cached.result;
220
+ }
221
+ const result = (await this.memberModel
222
+ .findOne({
223
+ status: core_tenant_enums_1.TenantMemberStatus.ACTIVE,
224
+ tenant: tenantId,
225
+ user: userId,
226
+ })
227
+ .lean()
228
+ .exec());
229
+ if (result) {
230
+ this.evictIfOverCapacity(this.membershipCache);
231
+ this.membershipCache.set(key, { expiresAt: now + ttl, result });
232
+ }
233
+ else {
234
+ this.membershipCache.delete(key);
235
+ }
236
+ return result;
237
+ }
238
+ evictIfOverCapacity(cache) {
239
+ if (cache.size >= CoreTenantGuard_1.MAX_CACHE_SIZE) {
240
+ const deleteCount = Math.max(1, Math.floor(CoreTenantGuard_1.MAX_CACHE_SIZE * 0.1));
241
+ let deleted = 0;
242
+ for (const key of cache.keys()) {
243
+ if (deleted >= deleteCount)
244
+ break;
245
+ cache.delete(key);
246
+ deleted++;
247
+ }
248
+ }
249
+ }
250
+ evictExpired() {
251
+ const now = Date.now();
252
+ for (const [key, entry] of this.membershipCache.entries()) {
253
+ if (now >= entry.expiresAt) {
254
+ this.membershipCache.delete(key);
255
+ }
256
+ }
257
+ for (const [key, entry] of this.tenantIdsCache.entries()) {
258
+ if (now >= entry.expiresAt) {
259
+ this.tenantIdsCache.delete(key);
260
+ }
261
+ }
262
+ }
263
+ };
264
+ exports.CoreTenantGuard = CoreTenantGuard;
265
+ exports.CoreTenantGuard = CoreTenantGuard = CoreTenantGuard_1 = __decorate([
266
+ (0, common_1.Injectable)(),
267
+ __param(1, (0, mongoose_1.InjectModel)(core_tenant_enums_1.TENANT_MEMBER_MODEL_TOKEN)),
268
+ __metadata("design:paramtypes", [core_1.Reflector,
269
+ mongoose_2.Model])
270
+ ], CoreTenantGuard);
271
+ //# sourceMappingURL=core-tenant.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tenant.guard.js","sourceRoot":"","sources":["../../../../src/core/modules/tenant/core-tenant.guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function mergeRolesMetadata(meta: (string[] | undefined)[]): string[];
2
+ export declare function getRoleHierarchy(): Record<string, number>;
3
+ export declare function isSystemRole(role: string): boolean;
4
+ export declare function isMultiTenancyActive(): boolean;
5
+ export declare function isHierarchyRole(role: string): boolean;
6
+ export declare function getMinRequiredLevel(roles: string[]): number | undefined;
7
+ export declare function checkRoleAccess(requiredRoles: string[], userRoles?: string[], tenantRole?: string): boolean;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeRolesMetadata = mergeRolesMetadata;
4
+ exports.getRoleHierarchy = getRoleHierarchy;
5
+ exports.isSystemRole = isSystemRole;
6
+ exports.isMultiTenancyActive = isMultiTenancyActive;
7
+ exports.isHierarchyRole = isHierarchyRole;
8
+ exports.getMinRequiredLevel = getMinRequiredLevel;
9
+ exports.checkRoleAccess = checkRoleAccess;
10
+ const config_service_1 = require("../../common/services/config.service");
11
+ const core_tenant_enums_1 = require("./core-tenant.enums");
12
+ const SYSTEM_ROLE_PREFIX = 's_';
13
+ function mergeRolesMetadata(meta) {
14
+ return meta[0] ? (meta[1] ? [...meta[0], ...meta[1]] : meta[0]) : meta[1] || [];
15
+ }
16
+ function getRoleHierarchy() {
17
+ return config_service_1.ConfigService.configFastButReadOnly?.multiTenancy?.roleHierarchy ?? core_tenant_enums_1.DEFAULT_ROLE_HIERARCHY;
18
+ }
19
+ function isSystemRole(role) {
20
+ return role.startsWith(SYSTEM_ROLE_PREFIX);
21
+ }
22
+ function isMultiTenancyActive() {
23
+ const config = config_service_1.ConfigService.configFastButReadOnly?.multiTenancy;
24
+ return !!config && config.enabled !== false;
25
+ }
26
+ function isHierarchyRole(role) {
27
+ if (!isMultiTenancyActive())
28
+ return false;
29
+ const hierarchy = getRoleHierarchy();
30
+ return role in hierarchy;
31
+ }
32
+ function getMinRequiredLevel(roles) {
33
+ const hierarchy = getRoleHierarchy();
34
+ const levels = roles.filter((r) => r in hierarchy).map((r) => hierarchy[r]);
35
+ if (levels.length === 0)
36
+ return undefined;
37
+ return Math.min(...levels);
38
+ }
39
+ function checkRoleAccess(requiredRoles, userRoles, tenantRole) {
40
+ const availableRoles = tenantRole ? [tenantRole] : (userRoles ?? []);
41
+ if (availableRoles.length === 0)
42
+ return false;
43
+ const multiTenancyActive = isMultiTenancyActive();
44
+ const hierarchy = multiTenancyActive ? getRoleHierarchy() : {};
45
+ const hierarchyRequired = requiredRoles.filter((r) => r in hierarchy);
46
+ const nonHierarchyRequired = requiredRoles.filter((r) => !(r in hierarchy));
47
+ if (hierarchyRequired.length === 0 && nonHierarchyRequired.length === 0)
48
+ return true;
49
+ if (hierarchyRequired.length > 0) {
50
+ const minRequired = Math.min(...hierarchyRequired.map((r) => hierarchy[r]));
51
+ if (availableRoles.some((r) => r in hierarchy && hierarchy[r] >= minRequired))
52
+ return true;
53
+ }
54
+ if (nonHierarchyRequired.length > 0) {
55
+ if (nonHierarchyRequired.some((r) => availableRoles.includes(r)))
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ //# sourceMappingURL=core-tenant.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tenant.helpers.js","sourceRoot":"","sources":["../../../../src/core/modules/tenant/core-tenant.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { CanActivate, DynamicModule, Type } from '@nestjs/common';
2
+ import { CoreTenantMemberModel } from './core-tenant-member.model';
3
+ import { CoreTenantService } from './core-tenant.service';
4
+ export interface CoreTenantModuleOptions {
5
+ memberModel?: Type<CoreTenantMemberModel>;
6
+ guard?: Type<CanActivate>;
7
+ service?: Type<CoreTenantService>;
8
+ modelName?: string;
9
+ }
10
+ export declare class CoreTenantModule {
11
+ static forRoot(options?: CoreTenantModuleOptions): DynamicModule;
12
+ }
@@ -0,0 +1,58 @@
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 CoreTenantModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CoreTenantModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const core_1 = require("@nestjs/core");
13
+ const mongoose_1 = require("@nestjs/mongoose");
14
+ const core_tenant_member_model_1 = require("./core-tenant-member.model");
15
+ const core_tenant_enums_1 = require("./core-tenant.enums");
16
+ const core_tenant_guard_1 = require("./core-tenant.guard");
17
+ const core_tenant_service_1 = require("./core-tenant.service");
18
+ let CoreTenantModule = CoreTenantModule_1 = class CoreTenantModule {
19
+ static forRoot(options = {}) {
20
+ const MemberModel = options.memberModel || core_tenant_member_model_1.CoreTenantMemberModel;
21
+ const Guard = options.guard || core_tenant_guard_1.CoreTenantGuard;
22
+ const Service = options.service || core_tenant_service_1.CoreTenantService;
23
+ const modelName = options.modelName || core_tenant_enums_1.TENANT_MEMBER_MODEL_TOKEN;
24
+ const memberSchema = mongoose_1.SchemaFactory.createForClass(MemberModel);
25
+ memberSchema.index({ user: 1, tenant: 1 }, { unique: true });
26
+ memberSchema.index({ user: 1, tenant: 1, status: 1 });
27
+ const providers = [
28
+ {
29
+ provide: core_tenant_service_1.CoreTenantService,
30
+ useClass: Service,
31
+ },
32
+ {
33
+ provide: core_1.APP_GUARD,
34
+ useClass: Guard,
35
+ },
36
+ ];
37
+ if (modelName !== core_tenant_enums_1.TENANT_MEMBER_MODEL_TOKEN) {
38
+ providers.push({
39
+ provide: (0, mongoose_1.getModelToken)(core_tenant_enums_1.TENANT_MEMBER_MODEL_TOKEN),
40
+ useFactory: (model) => model,
41
+ inject: [(0, mongoose_1.getModelToken)(modelName)],
42
+ });
43
+ }
44
+ return {
45
+ exports: [core_tenant_service_1.CoreTenantService],
46
+ global: true,
47
+ imports: [mongoose_1.MongooseModule.forFeature([{ name: modelName, schema: memberSchema }])],
48
+ module: CoreTenantModule_1,
49
+ providers,
50
+ };
51
+ }
52
+ };
53
+ exports.CoreTenantModule = CoreTenantModule;
54
+ exports.CoreTenantModule = CoreTenantModule = CoreTenantModule_1 = __decorate([
55
+ (0, common_1.Global)(),
56
+ (0, common_1.Module)({})
57
+ ], CoreTenantModule);
58
+ //# sourceMappingURL=core-tenant.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tenant.module.js","sourceRoot":"","sources":["../../../../src/core/modules/tenant/core-tenant.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAkF;AAClF,uCAAyC;AACzC,+CAAgF;AAGhF,yEAAmE;AACnE,2DAAgE;AAChE,2DAAsD;AACtD,+DAA0D;AAkDnD,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAC3B,MAAM,CAAC,OAAO,CAAC,UAAmC,EAAE;QAClD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,gDAAqB,CAAC;QACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,mCAAe,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,uCAAiB,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,6CAAyB,CAAC;QAEjE,MAAM,YAAY,GAAG,wBAAa,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAG/D,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAEtD,MAAM,SAAS,GAAU;YACvB;gBACE,OAAO,EAAE,uCAAiB;gBAC1B,QAAQ,EAAE,OAAO;aAClB;YACD;gBACE,OAAO,EAAE,gBAAS;gBAClB,QAAQ,EAAE,KAAK;aAChB;SACF,CAAC;QAIF,IAAI,SAAS,KAAK,6CAAyB,EAAE,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,IAAA,wBAAa,EAAC,6CAAyB,CAAC;gBACjD,UAAU,EAAE,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK;gBACxC,MAAM,EAAE,CAAC,IAAA,wBAAa,EAAC,SAAS,CAAC,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,uCAAiB,CAAC;YAC5B,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,yBAAc,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,EAAE,kBAAgB;YACxB,SAAS;SACV,CAAC;IACJ,CAAC;CACF,CAAA;AA3CY,4CAAgB;2BAAhB,gBAAgB;IAF5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gBAAgB,CA2C5B"}
@@ -0,0 +1,19 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import { Model } from 'mongoose';
3
+ import { CoreTenantMemberModel } from './core-tenant-member.model';
4
+ import { CoreTenantGuard } from './core-tenant.guard';
5
+ export declare class CoreTenantService {
6
+ protected readonly memberModel: Model<CoreTenantMemberModel>;
7
+ protected readonly tenantGuard?: CoreTenantGuard;
8
+ protected readonly logger: Logger;
9
+ constructor(memberModel: Model<CoreTenantMemberModel>, tenantGuard?: CoreTenantGuard);
10
+ protected getHierarchy(): Record<string, number>;
11
+ protected getDefaultRole(): string;
12
+ protected getHighestRole(): string;
13
+ findMemberships(userId: string): Promise<CoreTenantMemberModel[]>;
14
+ getMembership(tenantId: string, userId: string): Promise<CoreTenantMemberModel | null>;
15
+ addMember(tenantId: string, userId: string, role?: string, invitedById?: string): Promise<CoreTenantMemberModel>;
16
+ removeMember(tenantId: string, userId: string): Promise<CoreTenantMemberModel>;
17
+ updateMemberRole(tenantId: string, userId: string, role: string): Promise<CoreTenantMemberModel>;
18
+ assertNotLastOwner(tenantId: string, userId: string): Promise<void>;
19
+ }