@venturialstd/tenant 0.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.
- package/README.md +974 -0
- package/dist/constants/tenant.constant.d.ts +28 -0
- package/dist/constants/tenant.constant.d.ts.map +1 -0
- package/dist/constants/tenant.constant.js +35 -0
- package/dist/constants/tenant.constant.js.map +1 -0
- package/dist/constants/tenant.settings.constant.d.ts +9 -0
- package/dist/constants/tenant.settings.constant.d.ts.map +1 -0
- package/dist/constants/tenant.settings.constant.js +12 -0
- package/dist/constants/tenant.settings.constant.js.map +1 -0
- package/dist/decorators/roles.decorator.d.ts +3 -0
- package/dist/decorators/roles.decorator.d.ts.map +1 -0
- package/dist/decorators/roles.decorator.js +7 -0
- package/dist/decorators/roles.decorator.js.map +1 -0
- package/dist/decorators/tenant.decorator.d.ts +4 -0
- package/dist/decorators/tenant.decorator.d.ts.map +1 -0
- package/dist/decorators/tenant.decorator.js +22 -0
- package/dist/decorators/tenant.decorator.js.map +1 -0
- package/dist/entities/tenant-user.entity.d.ts +16 -0
- package/dist/entities/tenant-user.entity.d.ts.map +1 -0
- package/dist/entities/tenant-user.entity.js +120 -0
- package/dist/entities/tenant-user.entity.js.map +1 -0
- package/dist/entities/tenant.entity.d.ts +16 -0
- package/dist/entities/tenant.entity.d.ts.map +1 -0
- package/dist/entities/tenant.entity.js +115 -0
- package/dist/entities/tenant.entity.js.map +1 -0
- package/dist/guards/tenant.guard.d.ts +16 -0
- package/dist/guards/tenant.guard.d.ts.map +1 -0
- package/dist/guards/tenant.guard.js +90 -0
- package/dist/guards/tenant.guard.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/services/tenant-user.service.d.ts +30 -0
- package/dist/services/tenant-user.service.d.ts.map +1 -0
- package/dist/services/tenant-user.service.js +245 -0
- package/dist/services/tenant-user.service.js.map +1 -0
- package/dist/services/tenant.service.d.ts +21 -0
- package/dist/services/tenant.service.d.ts.map +1 -0
- package/dist/services/tenant.service.js +157 -0
- package/dist/services/tenant.service.js.map +1 -0
- package/dist/settings/tenant.settings.d.ts +3 -0
- package/dist/settings/tenant.settings.d.ts.map +1 -0
- package/dist/settings/tenant.settings.js +85 -0
- package/dist/settings/tenant.settings.js.map +1 -0
- package/dist/tenant.module.d.ts +3 -0
- package/dist/tenant.module.d.ts.map +1 -0
- package/dist/tenant.module.js +28 -0
- package/dist/tenant.module.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { TypeOrmCrudService } from '@dataui/crud-typeorm';
|
|
2
|
+
import { AppLogger } from '@venturialstd/core';
|
|
3
|
+
import { Repository } from 'typeorm';
|
|
4
|
+
import { TENANT_USER_ROLE } from '../constants/tenant.constant';
|
|
5
|
+
import { Tenant } from '../entities/tenant.entity';
|
|
6
|
+
import { TenantUser } from '../entities/tenant-user.entity';
|
|
7
|
+
export declare class TenantUserService extends TypeOrmCrudService<TenantUser> {
|
|
8
|
+
readonly repo: Repository<TenantUser>;
|
|
9
|
+
private readonly tenantRepo;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(repo: Repository<TenantUser>, tenantRepo: Repository<Tenant>, logger: AppLogger);
|
|
12
|
+
addUserToTenant(tenantId: string, userId: string, role?: TENANT_USER_ROLE, invitedBy?: string): Promise<TenantUser>;
|
|
13
|
+
inviteUserToTenant(tenantId: string, userId: string, role: TENANT_USER_ROLE, invitedBy: string): Promise<TenantUser>;
|
|
14
|
+
acceptInvitation(tenantId: string, userId: string): Promise<TenantUser>;
|
|
15
|
+
removeUserFromTenant(tenantId: string, userId: string): Promise<void>;
|
|
16
|
+
updateUserRole(tenantId: string, userId: string, newRole: TENANT_USER_ROLE): Promise<TenantUser>;
|
|
17
|
+
getUserTenants(userId: string): Promise<TenantUser[]>;
|
|
18
|
+
getTenantUsers(tenantId: string): Promise<TenantUser[]>;
|
|
19
|
+
getActiveTenantUsers(tenantId: string): Promise<TenantUser[]>;
|
|
20
|
+
hasAccess(tenantId: string, userId: string): Promise<boolean>;
|
|
21
|
+
hasRole(tenantId: string, userId: string, role: TENANT_USER_ROLE): Promise<boolean>;
|
|
22
|
+
isAdminOrOwner(tenantId: string, userId: string): Promise<boolean>;
|
|
23
|
+
getUserRole(tenantId: string, userId: string): Promise<TENANT_USER_ROLE | null>;
|
|
24
|
+
setPrimaryOwner(tenantId: string, userId: string): Promise<TenantUser>;
|
|
25
|
+
transferOwnership(tenantId: string, fromUserId: string, toUserId: string): Promise<void>;
|
|
26
|
+
getUserInvitations(userId: string): Promise<TenantUser[]>;
|
|
27
|
+
suspendUser(tenantId: string, userId: string): Promise<TenantUser>;
|
|
28
|
+
reactivateUser(tenantId: string, userId: string): Promise<TenantUser>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=tenant-user.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-user.service.d.ts","sourceRoot":"","sources":["../../src/services/tenant-user.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAsB,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,qBACa,iBAAkB,SAAQ,kBAAkB,CAAC,UAAU,CAAC;aAGjD,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAHP,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,EAE3B,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,SAAS;IAS9B,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,gBAA0C,EAChD,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC;IAuChB,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC;IAmChB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBvE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrE,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAuBhB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IASrD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IASvD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAS7D,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW7D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAWnF,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAelE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAW/E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAyBtE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCxF,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IASzD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBlE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAe5E"}
|
|
@@ -0,0 +1,245 @@
|
|
|
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 TenantUserService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TenantUserService = void 0;
|
|
17
|
+
const crud_typeorm_1 = require("@dataui/crud-typeorm");
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
20
|
+
const core_1 = require("@venturialstd/core");
|
|
21
|
+
const typeorm_2 = require("typeorm");
|
|
22
|
+
const tenant_constant_1 = require("../constants/tenant.constant");
|
|
23
|
+
const tenant_entity_1 = require("../entities/tenant.entity");
|
|
24
|
+
const tenant_user_entity_1 = require("../entities/tenant-user.entity");
|
|
25
|
+
let TenantUserService = TenantUserService_1 = class TenantUserService extends crud_typeorm_1.TypeOrmCrudService {
|
|
26
|
+
repo;
|
|
27
|
+
tenantRepo;
|
|
28
|
+
logger;
|
|
29
|
+
constructor(repo, tenantRepo, logger) {
|
|
30
|
+
super(repo);
|
|
31
|
+
this.repo = repo;
|
|
32
|
+
this.tenantRepo = tenantRepo;
|
|
33
|
+
this.logger = logger;
|
|
34
|
+
this.logger.setContext(TenantUserService_1.name);
|
|
35
|
+
}
|
|
36
|
+
async addUserToTenant(tenantId, userId, role = tenant_constant_1.TENANT_USER_ROLE.MEMBER, invitedBy) {
|
|
37
|
+
const tenant = await this.tenantRepo.findOne({ where: { id: tenantId } });
|
|
38
|
+
if (!tenant) {
|
|
39
|
+
throw new common_1.NotFoundException(`Tenant with id "${tenantId}" not found`);
|
|
40
|
+
}
|
|
41
|
+
if (!tenant.isActive) {
|
|
42
|
+
throw new common_1.BadRequestException('Cannot add users to an inactive tenant');
|
|
43
|
+
}
|
|
44
|
+
const existing = await this.repo.findOne({
|
|
45
|
+
where: { tenantId, userId },
|
|
46
|
+
});
|
|
47
|
+
if (existing) {
|
|
48
|
+
throw new common_1.BadRequestException('User is already a member of this tenant');
|
|
49
|
+
}
|
|
50
|
+
const tenantUser = this.repo.create({
|
|
51
|
+
tenantId,
|
|
52
|
+
userId,
|
|
53
|
+
role,
|
|
54
|
+
status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE,
|
|
55
|
+
invitedBy,
|
|
56
|
+
joinedAt: new Date(),
|
|
57
|
+
isPrimary: false,
|
|
58
|
+
});
|
|
59
|
+
const saved = await this.repo.save(tenantUser);
|
|
60
|
+
this.logger.log(`User ${userId} added to tenant ${tenantId} with role ${role}`);
|
|
61
|
+
return saved;
|
|
62
|
+
}
|
|
63
|
+
async inviteUserToTenant(tenantId, userId, role, invitedBy) {
|
|
64
|
+
const tenant = await this.tenantRepo.findOne({ where: { id: tenantId } });
|
|
65
|
+
if (!tenant) {
|
|
66
|
+
throw new common_1.NotFoundException(`Tenant with id "${tenantId}" not found`);
|
|
67
|
+
}
|
|
68
|
+
const existing = await this.repo.findOne({
|
|
69
|
+
where: { tenantId, userId },
|
|
70
|
+
});
|
|
71
|
+
if (existing) {
|
|
72
|
+
throw new common_1.BadRequestException('User is already a member or has a pending invitation');
|
|
73
|
+
}
|
|
74
|
+
const tenantUser = this.repo.create({
|
|
75
|
+
tenantId,
|
|
76
|
+
userId,
|
|
77
|
+
role,
|
|
78
|
+
status: tenant_constant_1.TENANT_USER_STATUS.INVITED,
|
|
79
|
+
invitedBy,
|
|
80
|
+
invitedAt: new Date(),
|
|
81
|
+
isPrimary: false,
|
|
82
|
+
});
|
|
83
|
+
const saved = await this.repo.save(tenantUser);
|
|
84
|
+
this.logger.log(`User ${userId} invited to tenant ${tenantId} by ${invitedBy}`);
|
|
85
|
+
return saved;
|
|
86
|
+
}
|
|
87
|
+
async acceptInvitation(tenantId, userId) {
|
|
88
|
+
const tenantUser = await this.repo.findOne({
|
|
89
|
+
where: { tenantId, userId, status: tenant_constant_1.TENANT_USER_STATUS.INVITED },
|
|
90
|
+
});
|
|
91
|
+
if (!tenantUser) {
|
|
92
|
+
throw new common_1.NotFoundException('Invitation not found');
|
|
93
|
+
}
|
|
94
|
+
tenantUser.status = tenant_constant_1.TENANT_USER_STATUS.ACTIVE;
|
|
95
|
+
tenantUser.joinedAt = new Date();
|
|
96
|
+
const updated = await this.repo.save(tenantUser);
|
|
97
|
+
this.logger.log(`User ${userId} accepted invitation to tenant ${tenantId}`);
|
|
98
|
+
return updated;
|
|
99
|
+
}
|
|
100
|
+
async removeUserFromTenant(tenantId, userId) {
|
|
101
|
+
const tenantUser = await this.repo.findOne({
|
|
102
|
+
where: { tenantId, userId },
|
|
103
|
+
});
|
|
104
|
+
if (!tenantUser) {
|
|
105
|
+
throw new common_1.NotFoundException('User is not a member of this tenant');
|
|
106
|
+
}
|
|
107
|
+
if (tenantUser.isPrimary) {
|
|
108
|
+
throw new common_1.BadRequestException('Cannot remove the primary owner of a tenant');
|
|
109
|
+
}
|
|
110
|
+
await this.repo.remove(tenantUser);
|
|
111
|
+
this.logger.log(`User ${userId} removed from tenant ${tenantId}`);
|
|
112
|
+
}
|
|
113
|
+
async updateUserRole(tenantId, userId, newRole) {
|
|
114
|
+
const tenantUser = await this.repo.findOne({
|
|
115
|
+
where: { tenantId, userId },
|
|
116
|
+
});
|
|
117
|
+
if (!tenantUser) {
|
|
118
|
+
throw new common_1.NotFoundException('User is not a member of this tenant');
|
|
119
|
+
}
|
|
120
|
+
if (tenantUser.isPrimary && newRole !== tenant_constant_1.TENANT_USER_ROLE.OWNER) {
|
|
121
|
+
throw new common_1.BadRequestException('Cannot change role of primary owner');
|
|
122
|
+
}
|
|
123
|
+
tenantUser.role = newRole;
|
|
124
|
+
const updated = await this.repo.save(tenantUser);
|
|
125
|
+
this.logger.log(`User ${userId} role updated to ${newRole} in tenant ${tenantId}`);
|
|
126
|
+
return updated;
|
|
127
|
+
}
|
|
128
|
+
async getUserTenants(userId) {
|
|
129
|
+
return this.repo.find({
|
|
130
|
+
where: { userId, status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE },
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async getTenantUsers(tenantId) {
|
|
134
|
+
return this.repo.find({
|
|
135
|
+
where: { tenantId },
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async getActiveTenantUsers(tenantId) {
|
|
139
|
+
return this.repo.find({
|
|
140
|
+
where: { tenantId, status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE },
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async hasAccess(tenantId, userId) {
|
|
144
|
+
const tenantUser = await this.repo.findOne({
|
|
145
|
+
where: { tenantId, userId, status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE },
|
|
146
|
+
});
|
|
147
|
+
return !!tenantUser;
|
|
148
|
+
}
|
|
149
|
+
async hasRole(tenantId, userId, role) {
|
|
150
|
+
const tenantUser = await this.repo.findOne({
|
|
151
|
+
where: { tenantId, userId, status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE, role },
|
|
152
|
+
});
|
|
153
|
+
return !!tenantUser;
|
|
154
|
+
}
|
|
155
|
+
async isAdminOrOwner(tenantId, userId) {
|
|
156
|
+
const tenantUser = await this.repo.findOne({
|
|
157
|
+
where: { tenantId, userId, status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE },
|
|
158
|
+
});
|
|
159
|
+
if (!tenantUser) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
return tenantUser.role === tenant_constant_1.TENANT_USER_ROLE.OWNER || tenantUser.role === tenant_constant_1.TENANT_USER_ROLE.ADMIN;
|
|
163
|
+
}
|
|
164
|
+
async getUserRole(tenantId, userId) {
|
|
165
|
+
const tenantUser = await this.repo.findOne({
|
|
166
|
+
where: { tenantId, userId, status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE },
|
|
167
|
+
});
|
|
168
|
+
return tenantUser?.role || null;
|
|
169
|
+
}
|
|
170
|
+
async setPrimaryOwner(tenantId, userId) {
|
|
171
|
+
await this.repo.update({ tenantId, isPrimary: true }, { isPrimary: false });
|
|
172
|
+
const tenantUser = await this.repo.findOne({
|
|
173
|
+
where: { tenantId, userId },
|
|
174
|
+
});
|
|
175
|
+
if (!tenantUser) {
|
|
176
|
+
throw new common_1.NotFoundException('User is not a member of this tenant');
|
|
177
|
+
}
|
|
178
|
+
tenantUser.isPrimary = true;
|
|
179
|
+
tenantUser.role = tenant_constant_1.TENANT_USER_ROLE.OWNER;
|
|
180
|
+
const updated = await this.repo.save(tenantUser);
|
|
181
|
+
this.logger.log(`User ${userId} set as primary owner of tenant ${tenantId}`);
|
|
182
|
+
return updated;
|
|
183
|
+
}
|
|
184
|
+
async transferOwnership(tenantId, fromUserId, toUserId) {
|
|
185
|
+
const currentOwner = await this.repo.findOne({
|
|
186
|
+
where: { tenantId, userId: fromUserId, isPrimary: true },
|
|
187
|
+
});
|
|
188
|
+
if (!currentOwner) {
|
|
189
|
+
throw new common_1.ForbiddenException('Only the primary owner can transfer ownership');
|
|
190
|
+
}
|
|
191
|
+
const newOwner = await this.repo.findOne({
|
|
192
|
+
where: { tenantId, userId: toUserId, status: tenant_constant_1.TENANT_USER_STATUS.ACTIVE },
|
|
193
|
+
});
|
|
194
|
+
if (!newOwner) {
|
|
195
|
+
throw new common_1.NotFoundException('New owner must be an active member of the tenant');
|
|
196
|
+
}
|
|
197
|
+
await this.setPrimaryOwner(tenantId, toUserId);
|
|
198
|
+
currentOwner.isPrimary = false;
|
|
199
|
+
currentOwner.role = tenant_constant_1.TENANT_USER_ROLE.ADMIN;
|
|
200
|
+
await this.repo.save(currentOwner);
|
|
201
|
+
this.logger.log(`Ownership of tenant ${tenantId} transferred from ${fromUserId} to ${toUserId}`);
|
|
202
|
+
}
|
|
203
|
+
async getUserInvitations(userId) {
|
|
204
|
+
return this.repo.find({
|
|
205
|
+
where: { userId, status: tenant_constant_1.TENANT_USER_STATUS.INVITED },
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
async suspendUser(tenantId, userId) {
|
|
209
|
+
const tenantUser = await this.repo.findOne({
|
|
210
|
+
where: { tenantId, userId },
|
|
211
|
+
});
|
|
212
|
+
if (!tenantUser) {
|
|
213
|
+
throw new common_1.NotFoundException('User is not a member of this tenant');
|
|
214
|
+
}
|
|
215
|
+
if (tenantUser.isPrimary) {
|
|
216
|
+
throw new common_1.BadRequestException('Cannot suspend the primary owner');
|
|
217
|
+
}
|
|
218
|
+
tenantUser.status = tenant_constant_1.TENANT_USER_STATUS.SUSPENDED;
|
|
219
|
+
const updated = await this.repo.save(tenantUser);
|
|
220
|
+
this.logger.log(`User ${userId} suspended in tenant ${tenantId}`);
|
|
221
|
+
return updated;
|
|
222
|
+
}
|
|
223
|
+
async reactivateUser(tenantId, userId) {
|
|
224
|
+
const tenantUser = await this.repo.findOne({
|
|
225
|
+
where: { tenantId, userId, status: tenant_constant_1.TENANT_USER_STATUS.SUSPENDED },
|
|
226
|
+
});
|
|
227
|
+
if (!tenantUser) {
|
|
228
|
+
throw new common_1.NotFoundException('User is not suspended in this tenant');
|
|
229
|
+
}
|
|
230
|
+
tenantUser.status = tenant_constant_1.TENANT_USER_STATUS.ACTIVE;
|
|
231
|
+
const updated = await this.repo.save(tenantUser);
|
|
232
|
+
this.logger.log(`User ${userId} reactivated in tenant ${tenantId}`);
|
|
233
|
+
return updated;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
exports.TenantUserService = TenantUserService;
|
|
237
|
+
exports.TenantUserService = TenantUserService = TenantUserService_1 = __decorate([
|
|
238
|
+
(0, common_1.Injectable)(),
|
|
239
|
+
__param(0, (0, typeorm_1.InjectRepository)(tenant_user_entity_1.TenantUser)),
|
|
240
|
+
__param(1, (0, typeorm_1.InjectRepository)(tenant_entity_1.Tenant)),
|
|
241
|
+
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
242
|
+
typeorm_2.Repository,
|
|
243
|
+
core_1.AppLogger])
|
|
244
|
+
], TenantUserService);
|
|
245
|
+
//# sourceMappingURL=tenant-user.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-user.service.js","sourceRoot":"","sources":["../../src/services/tenant-user.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TypeOrmCrudService } from '@dataui/crud-typeorm';
|
|
2
|
+
import { AppLogger, SettingsService } from '@venturialstd/core';
|
|
3
|
+
import { Repository } from 'typeorm';
|
|
4
|
+
import { Tenant } from '../entities/tenant.entity';
|
|
5
|
+
export declare class TenantService extends TypeOrmCrudService<Tenant> {
|
|
6
|
+
readonly repo: Repository<Tenant>;
|
|
7
|
+
private readonly settingsService;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
constructor(repo: Repository<Tenant>, settingsService: SettingsService, logger: AppLogger);
|
|
10
|
+
createTenant(name: string, slug: string, domain?: string, description?: string, ownerId?: string): Promise<Tenant>;
|
|
11
|
+
getTenantBySlug(slug: string): Promise<Tenant>;
|
|
12
|
+
getTenantByDomain(domain: string): Promise<Tenant>;
|
|
13
|
+
updateTenantSettings(tenantId: string, settings: Record<string, unknown>): Promise<Tenant>;
|
|
14
|
+
setTenantStatus(tenantId: string, isActive: boolean): Promise<Tenant>;
|
|
15
|
+
updateTenantPlan(tenantId: string, plan: string, subscriptionEndsAt?: Date): Promise<Tenant>;
|
|
16
|
+
getActiveTenants(): Promise<Tenant[]>;
|
|
17
|
+
getTenantsByOwner(ownerId: string): Promise<Tenant[]>;
|
|
18
|
+
isInTrialPeriod(tenantId: string): Promise<boolean>;
|
|
19
|
+
hasActiveSubscription(tenantId: string): Promise<boolean>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=tenant.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.service.d.ts","sourceRoot":"","sources":["../../src/services/tenant.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,qBACa,aAAc,SAAQ,kBAAkB,CAAC,MAAM,CAAC;aAGzC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFP,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACvB,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,SAAS;IAS9B,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IA2DZ,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9C,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWlD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB1F,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBrE,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,kBAAkB,CAAC,EAAE,IAAI,GACxB,OAAO,CAAC,MAAM,CAAC;IAoBZ,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOrC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOrD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYnD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAmBhE"}
|
|
@@ -0,0 +1,157 @@
|
|
|
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 TenantService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TenantService = void 0;
|
|
17
|
+
const crud_typeorm_1 = require("@dataui/crud-typeorm");
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
20
|
+
const core_1 = require("@venturialstd/core");
|
|
21
|
+
const typeorm_2 = require("typeorm");
|
|
22
|
+
const tenant_constant_1 = require("../constants/tenant.constant");
|
|
23
|
+
const tenant_settings_constant_1 = require("../constants/tenant.settings.constant");
|
|
24
|
+
const tenant_entity_1 = require("../entities/tenant.entity");
|
|
25
|
+
let TenantService = TenantService_1 = class TenantService extends crud_typeorm_1.TypeOrmCrudService {
|
|
26
|
+
repo;
|
|
27
|
+
settingsService;
|
|
28
|
+
logger;
|
|
29
|
+
constructor(repo, settingsService, logger) {
|
|
30
|
+
super(repo);
|
|
31
|
+
this.repo = repo;
|
|
32
|
+
this.settingsService = settingsService;
|
|
33
|
+
this.logger = logger;
|
|
34
|
+
this.logger.setContext(TenantService_1.name);
|
|
35
|
+
}
|
|
36
|
+
async createTenant(name, slug, domain, description, ownerId) {
|
|
37
|
+
try {
|
|
38
|
+
if (ownerId) {
|
|
39
|
+
const maxTenants = await this.settingsService.get(tenant_settings_constant_1.TENANT_SETTING_KEYS.GENERAL_MAX_TENANTS);
|
|
40
|
+
if (maxTenants && parseInt(maxTenants) > 0) {
|
|
41
|
+
const ownerTenantCount = await this.repo.count({ where: { ownerId } });
|
|
42
|
+
if (ownerTenantCount >= parseInt(maxTenants)) {
|
|
43
|
+
throw new common_1.BadRequestException(`Maximum number of tenants (${maxTenants}) reached for this owner`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const existingTenant = await this.repo.findOne({ where: { slug } });
|
|
48
|
+
if (existingTenant) {
|
|
49
|
+
throw new common_1.BadRequestException(`Tenant with slug "${slug}" already exists`);
|
|
50
|
+
}
|
|
51
|
+
const defaultPlan = await this.settingsService.get(tenant_settings_constant_1.TENANT_SETTING_KEYS.GENERAL_DEFAULT_PLAN);
|
|
52
|
+
const trialDays = (await this.settingsService.get(tenant_settings_constant_1.TENANT_SETTING_KEYS.GENERAL_TRIAL_DAYS));
|
|
53
|
+
const trialEndsAt = new Date();
|
|
54
|
+
trialEndsAt.setDate(trialEndsAt.getDate() + (parseInt(trialDays) || tenant_constant_1.TENANT_DEFAULTS.TRIAL_DAYS));
|
|
55
|
+
const tenant = this.repo.create({
|
|
56
|
+
name,
|
|
57
|
+
slug,
|
|
58
|
+
domain,
|
|
59
|
+
description,
|
|
60
|
+
ownerId,
|
|
61
|
+
plan: defaultPlan || tenant_constant_1.TENANT_DEFAULTS.PLAN,
|
|
62
|
+
isActive: true,
|
|
63
|
+
trialEndsAt,
|
|
64
|
+
settings: {},
|
|
65
|
+
});
|
|
66
|
+
const savedTenant = await this.repo.save(tenant);
|
|
67
|
+
this.logger.log(`Tenant created: ${savedTenant.id} - ${savedTenant.name}`);
|
|
68
|
+
return savedTenant;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.logger.error('Error creating tenant:', error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async getTenantBySlug(slug) {
|
|
76
|
+
const tenant = await this.repo.findOne({ where: { slug } });
|
|
77
|
+
if (!tenant) {
|
|
78
|
+
throw new common_1.NotFoundException(`Tenant with slug "${slug}" not found`);
|
|
79
|
+
}
|
|
80
|
+
return tenant;
|
|
81
|
+
}
|
|
82
|
+
async getTenantByDomain(domain) {
|
|
83
|
+
const tenant = await this.repo.findOne({ where: { domain } });
|
|
84
|
+
if (!tenant) {
|
|
85
|
+
throw new common_1.NotFoundException(`Tenant with domain "${domain}" not found`);
|
|
86
|
+
}
|
|
87
|
+
return tenant;
|
|
88
|
+
}
|
|
89
|
+
async updateTenantSettings(tenantId, settings) {
|
|
90
|
+
const tenant = await this.repo.findOne({ where: { id: tenantId } });
|
|
91
|
+
if (!tenant) {
|
|
92
|
+
throw new common_1.NotFoundException(`Tenant with id "${tenantId}" not found`);
|
|
93
|
+
}
|
|
94
|
+
tenant.settings = { ...tenant.settings, ...settings };
|
|
95
|
+
const updatedTenant = await this.repo.save(tenant);
|
|
96
|
+
this.logger.log(`Tenant settings updated: ${tenantId}`);
|
|
97
|
+
return updatedTenant;
|
|
98
|
+
}
|
|
99
|
+
async setTenantStatus(tenantId, isActive) {
|
|
100
|
+
const tenant = await this.repo.findOne({ where: { id: tenantId } });
|
|
101
|
+
if (!tenant) {
|
|
102
|
+
throw new common_1.NotFoundException(`Tenant with id "${tenantId}" not found`);
|
|
103
|
+
}
|
|
104
|
+
tenant.isActive = isActive;
|
|
105
|
+
const updatedTenant = await this.repo.save(tenant);
|
|
106
|
+
this.logger.log(`Tenant ${isActive ? 'activated' : 'deactivated'}: ${tenantId}`);
|
|
107
|
+
return updatedTenant;
|
|
108
|
+
}
|
|
109
|
+
async updateTenantPlan(tenantId, plan, subscriptionEndsAt) {
|
|
110
|
+
const tenant = await this.repo.findOne({ where: { id: tenantId } });
|
|
111
|
+
if (!tenant) {
|
|
112
|
+
throw new common_1.NotFoundException(`Tenant with id "${tenantId}" not found`);
|
|
113
|
+
}
|
|
114
|
+
tenant.plan = plan;
|
|
115
|
+
if (subscriptionEndsAt) {
|
|
116
|
+
tenant.subscriptionEndsAt = subscriptionEndsAt;
|
|
117
|
+
}
|
|
118
|
+
const updatedTenant = await this.repo.save(tenant);
|
|
119
|
+
this.logger.log(`Tenant plan updated: ${tenantId} - ${plan}`);
|
|
120
|
+
return updatedTenant;
|
|
121
|
+
}
|
|
122
|
+
async getActiveTenants() {
|
|
123
|
+
return this.repo.find({ where: { isActive: true } });
|
|
124
|
+
}
|
|
125
|
+
async getTenantsByOwner(ownerId) {
|
|
126
|
+
return this.repo.find({ where: { ownerId } });
|
|
127
|
+
}
|
|
128
|
+
async isInTrialPeriod(tenantId) {
|
|
129
|
+
const tenant = await this.repo.findOne({ where: { id: tenantId } });
|
|
130
|
+
if (!tenant || !tenant.trialEndsAt) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
return new Date() < tenant.trialEndsAt;
|
|
134
|
+
}
|
|
135
|
+
async hasActiveSubscription(tenantId) {
|
|
136
|
+
const tenant = await this.repo.findOne({ where: { id: tenantId } });
|
|
137
|
+
if (!tenant) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
if (await this.isInTrialPeriod(tenantId)) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
if (tenant.subscriptionEndsAt) {
|
|
144
|
+
return new Date() < tenant.subscriptionEndsAt;
|
|
145
|
+
}
|
|
146
|
+
return tenant.plan === tenant_constant_1.TENANT_PLAN.FREE;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
exports.TenantService = TenantService;
|
|
150
|
+
exports.TenantService = TenantService = TenantService_1 = __decorate([
|
|
151
|
+
(0, common_1.Injectable)(),
|
|
152
|
+
__param(0, (0, typeorm_1.InjectRepository)(tenant_entity_1.Tenant)),
|
|
153
|
+
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
154
|
+
core_1.SettingsService,
|
|
155
|
+
core_1.AppLogger])
|
|
156
|
+
], TenantService);
|
|
157
|
+
//# sourceMappingURL=tenant.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.service.js","sourceRoot":"","sources":["../../src/services/tenant.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.settings.d.ts","sourceRoot":"","sources":["../../src/settings/tenant.settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAiB,MAAM,oBAAoB,CAAC;AAI7D,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,EA8EtE,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SETTINGS = void 0;
|
|
4
|
+
const core_1 = require("@venturialstd/core");
|
|
5
|
+
const tenant_constant_1 = require("../constants/tenant.constant");
|
|
6
|
+
exports.SETTINGS = [
|
|
7
|
+
{
|
|
8
|
+
scope: 'GLOBAL',
|
|
9
|
+
module: 'TENANT',
|
|
10
|
+
section: 'GENERAL',
|
|
11
|
+
key: 'ENABLED',
|
|
12
|
+
label: 'Enabled',
|
|
13
|
+
description: 'Enable or disable the multi-tenant module',
|
|
14
|
+
type: core_1.SETTINGS_TYPE.BOOLEAN,
|
|
15
|
+
value: 'true',
|
|
16
|
+
options: null,
|
|
17
|
+
sortOrder: 1,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
scope: 'GLOBAL',
|
|
21
|
+
module: 'TENANT',
|
|
22
|
+
section: 'GENERAL',
|
|
23
|
+
key: 'MAX_TENANTS',
|
|
24
|
+
label: 'Max Tenants',
|
|
25
|
+
description: 'Maximum number of tenants allowed per owner (0 for unlimited)',
|
|
26
|
+
type: core_1.SETTINGS_TYPE.NUMBER,
|
|
27
|
+
value: '0',
|
|
28
|
+
options: null,
|
|
29
|
+
sortOrder: 2,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
scope: 'GLOBAL',
|
|
33
|
+
module: 'TENANT',
|
|
34
|
+
section: 'GENERAL',
|
|
35
|
+
key: 'DEFAULT_PLAN',
|
|
36
|
+
label: 'Default Plan',
|
|
37
|
+
description: 'Default subscription plan for new tenants',
|
|
38
|
+
type: core_1.SETTINGS_TYPE.SELECT,
|
|
39
|
+
value: tenant_constant_1.TENANT_DEFAULTS.PLAN,
|
|
40
|
+
options: [
|
|
41
|
+
{ label: 'Free', value: tenant_constant_1.TENANT_PLAN.FREE },
|
|
42
|
+
{ label: 'Starter', value: tenant_constant_1.TENANT_PLAN.STARTER },
|
|
43
|
+
{ label: 'Professional', value: tenant_constant_1.TENANT_PLAN.PROFESSIONAL },
|
|
44
|
+
{ label: 'Enterprise', value: tenant_constant_1.TENANT_PLAN.ENTERPRISE },
|
|
45
|
+
],
|
|
46
|
+
sortOrder: 3,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
scope: 'GLOBAL',
|
|
50
|
+
module: 'TENANT',
|
|
51
|
+
section: 'GENERAL',
|
|
52
|
+
key: 'TRIAL_DAYS',
|
|
53
|
+
label: 'Trial Days',
|
|
54
|
+
description: 'Number of trial days for new tenants',
|
|
55
|
+
type: core_1.SETTINGS_TYPE.NUMBER,
|
|
56
|
+
value: String(tenant_constant_1.TENANT_DEFAULTS.TRIAL_DAYS),
|
|
57
|
+
options: null,
|
|
58
|
+
sortOrder: 4,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
scope: 'GLOBAL',
|
|
62
|
+
module: 'TENANT',
|
|
63
|
+
section: 'FEATURES',
|
|
64
|
+
key: 'CUSTOM_DOMAIN',
|
|
65
|
+
label: 'Custom Domain Enabled',
|
|
66
|
+
description: 'Allow tenants to use custom domains',
|
|
67
|
+
type: core_1.SETTINGS_TYPE.BOOLEAN,
|
|
68
|
+
value: 'false',
|
|
69
|
+
options: null,
|
|
70
|
+
sortOrder: 5,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
scope: 'GLOBAL',
|
|
74
|
+
module: 'TENANT',
|
|
75
|
+
section: 'FEATURES',
|
|
76
|
+
key: 'API_ACCESS',
|
|
77
|
+
label: 'API Access Enabled',
|
|
78
|
+
description: 'Allow tenants to access the API',
|
|
79
|
+
type: core_1.SETTINGS_TYPE.BOOLEAN,
|
|
80
|
+
value: 'true',
|
|
81
|
+
options: null,
|
|
82
|
+
sortOrder: 6,
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
//# sourceMappingURL=tenant.settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.settings.js","sourceRoot":"","sources":["../../src/settings/tenant.settings.ts"],"names":[],"mappings":";;;AAAA,6CAA6D;AAE7D,kEAA4E;AAE/D,QAAA,QAAQ,GAAuD;IAC1E;QACE,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,2CAA2C;QACxD,IAAI,EAAE,oBAAa,CAAC,OAAO;QAC3B,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC;KACb;IACD;QACE,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,GAAG,EAAE,aAAa;QAClB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,+DAA+D;QAC5E,IAAI,EAAE,oBAAa,CAAC,MAAM;QAC1B,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC;KACb;IACD;QACE,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,GAAG,EAAE,cAAc;QACnB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,2CAA2C;QACxD,IAAI,EAAE,oBAAa,CAAC,MAAM;QAC1B,KAAK,EAAE,iCAAe,CAAC,IAAI;QAC3B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,6BAAW,CAAC,IAAI,EAAE;YAC1C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,6BAAW,CAAC,OAAO,EAAE;YAChD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,6BAAW,CAAC,YAAY,EAAE;YAC1D,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,6BAAW,CAAC,UAAU,EAAE;SACvD;QACD,SAAS,EAAE,CAAC;KACb;IACD;QACE,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,sCAAsC;QACnD,IAAI,EAAE,oBAAa,CAAC,MAAM;QAC1B,KAAK,EAAE,MAAM,CAAC,iCAAe,CAAC,UAAU,CAAC;QACzC,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC;KACb;IACD;QACE,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,UAAU;QACnB,GAAG,EAAE,eAAe;QACpB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,qCAAqC;QAClD,IAAI,EAAE,oBAAa,CAAC,OAAO;QAC3B,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC;KACb;IACD;QACE,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,UAAU;QACnB,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,iCAAiC;QAC9C,IAAI,EAAE,oBAAa,CAAC,OAAO;QAC3B,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC;KACb;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.module.d.ts","sourceRoot":"","sources":["../src/tenant.module.ts"],"names":[],"mappings":"AASA,qBAMa,YAAY;CAAG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TenantModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
12
|
+
const core_1 = require("@venturialstd/core");
|
|
13
|
+
const tenant_entity_1 = require("./entities/tenant.entity");
|
|
14
|
+
const tenant_user_entity_1 = require("./entities/tenant-user.entity");
|
|
15
|
+
const tenant_service_1 = require("./services/tenant.service");
|
|
16
|
+
const tenant_user_service_1 = require("./services/tenant-user.service");
|
|
17
|
+
let TenantModule = class TenantModule {
|
|
18
|
+
};
|
|
19
|
+
exports.TenantModule = TenantModule;
|
|
20
|
+
exports.TenantModule = TenantModule = __decorate([
|
|
21
|
+
(0, common_1.Module)({
|
|
22
|
+
imports: [core_1.SharedModule.forRoot({}), typeorm_1.TypeOrmModule.forFeature([tenant_entity_1.Tenant, tenant_user_entity_1.TenantUser])],
|
|
23
|
+
providers: [tenant_service_1.TenantService, tenant_user_service_1.TenantUserService],
|
|
24
|
+
controllers: [],
|
|
25
|
+
exports: [tenant_service_1.TenantService, tenant_user_service_1.TenantUserService],
|
|
26
|
+
})
|
|
27
|
+
], TenantModule);
|
|
28
|
+
//# sourceMappingURL=tenant.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.module.js","sourceRoot":"","sources":["../src/tenant.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAChD,6CAAkD;AAElD,4DAAkD;AAClD,sEAA2D;AAC3D,8DAA0D;AAC1D,wEAAmE;AAQ5D,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IANxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,mBAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,uBAAa,CAAC,UAAU,CAAC,CAAC,sBAAM,EAAE,+BAAU,CAAC,CAAC,CAAC;QACnF,SAAS,EAAE,CAAC,8BAAa,EAAE,uCAAiB,CAAC;QAC7C,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,CAAC,8BAAa,EAAE,uCAAiB,CAAC;KAC5C,CAAC;GACW,YAAY,CAAG"}
|