@ackplus/nest-auth 0.0.23 → 0.0.24
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/package.json +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/auth.constants.d.ts +1 -0
- package/src/lib/auth.constants.js +2 -1
- package/src/lib/auth.constants.js.map +1 -1
- package/src/lib/auth.module.d.ts +0 -0
- package/src/lib/auth.module.js +1 -0
- package/src/lib/auth.module.js.map +1 -0
- package/src/lib/decorators/nest-auth-role.decorator.d.ts +3 -0
- package/src/lib/decorators/nest-auth-role.decorator.js +14 -0
- package/src/lib/decorators/nest-auth-role.decorator.js.map +1 -0
- package/src/lib/dto/responses/auth.response.dto.d.ts +6 -6
- package/src/lib/dto/responses/auth.response.dto.js +14 -19
- package/src/lib/dto/responses/auth.response.dto.js.map +1 -1
- package/src/lib/entities/access-key.entity.d.ts +16 -0
- package/src/lib/entities/access-key.entity.js +63 -0
- package/src/lib/entities/access-key.entity.js.map +1 -0
- package/src/lib/entities/index.d.ts +3 -1
- package/src/lib/entities/index.js +2 -0
- package/src/lib/entities/index.js.map +1 -1
- package/src/lib/entities/permission.entity.d.ts +1 -0
- package/src/lib/entities/permission.entity.js +5 -0
- package/src/lib/entities/permission.entity.js.map +1 -1
- package/src/lib/entities/role-permission.entity.d.ts +2 -1
- package/src/lib/entities/role-permission.entity.js +1 -1
- package/src/lib/entities/role-permission.entity.js.map +1 -1
- package/src/lib/entities/role.entity.d.ts +12 -2
- package/src/lib/entities/role.entity.js +65 -4
- package/src/lib/entities/role.entity.js.map +1 -1
- package/src/lib/entities/tenant.entity.d.ts +3 -3
- package/src/lib/entities/tenant.entity.js +9 -6
- package/src/lib/entities/tenant.entity.js.map +1 -1
- package/src/lib/entities/user.entity.js +1 -1
- package/src/lib/entities/user.entity.js.map +1 -1
- package/src/lib/events/index.d.ts +34 -0
- package/src/lib/events/index.js +39 -0
- package/src/lib/events/index.js.map +1 -0
- package/src/lib/events/logged-out-all.event.d.ts +15 -0
- package/src/lib/events/logged-out-all.event.js +10 -0
- package/src/lib/events/logged-out-all.event.js.map +1 -0
- package/src/lib/events/logged-out.event.d.ts +13 -0
- package/src/lib/events/logged-out.event.js +10 -0
- package/src/lib/events/logged-out.event.js.map +1 -0
- package/src/lib/events/password-reset-requested.event.d.ts +15 -0
- package/src/lib/events/password-reset-requested.event.js +10 -0
- package/src/lib/events/password-reset-requested.event.js.map +1 -0
- package/src/lib/events/password-reset.event.d.ts +11 -0
- package/src/lib/events/password-reset.event.js +10 -0
- package/src/lib/events/password-reset.event.js.map +1 -0
- package/src/lib/events/tenant-created.event.d.ts +8 -0
- package/src/lib/events/tenant-created.event.js +10 -0
- package/src/lib/events/tenant-created.event.js.map +1 -0
- package/src/lib/events/tenant-deleted.event.d.ts +8 -0
- package/src/lib/events/tenant-deleted.event.js +10 -0
- package/src/lib/events/tenant-deleted.event.js.map +1 -0
- package/src/lib/events/tenant-updated.event.d.ts +9 -0
- package/src/lib/events/tenant-updated.event.js +10 -0
- package/src/lib/events/tenant-updated.event.js.map +1 -0
- package/src/lib/events/user-2fa-verified.event.d.ts +15 -0
- package/src/lib/events/user-2fa-verified.event.js +10 -0
- package/src/lib/events/user-2fa-verified.event.js.map +1 -0
- package/src/lib/events/user-created.event.d.ts +9 -0
- package/src/lib/events/user-created.event.js +10 -0
- package/src/lib/events/user-created.event.js.map +1 -0
- package/src/lib/events/user-deleted.event.d.ts +9 -0
- package/src/lib/events/user-deleted.event.js +10 -0
- package/src/lib/events/user-deleted.event.js.map +1 -0
- package/src/lib/events/user-logged-in.event.d.ts +17 -0
- package/src/lib/events/user-logged-in.event.js +10 -0
- package/src/lib/events/user-logged-in.event.js.map +1 -0
- package/src/lib/events/user-refresh-token.event.d.ts +11 -0
- package/src/lib/events/user-refresh-token.event.js +10 -0
- package/src/lib/events/user-refresh-token.event.js.map +1 -0
- package/src/lib/events/user-registered.event.d.ts +17 -0
- package/src/lib/events/user-registered.event.js +10 -0
- package/src/lib/events/user-registered.event.js.map +1 -0
- package/src/lib/events/user-updated.event.d.ts +10 -0
- package/src/lib/events/user-updated.event.js +10 -0
- package/src/lib/events/user-updated.event.js.map +1 -0
- package/src/lib/guards/auth.guard.d.ts +8 -5
- package/src/lib/guards/auth.guard.js +59 -32
- package/src/lib/guards/auth.guard.js.map +1 -1
- package/src/lib/guards/nest-auth-role.guard.d.ts +7 -0
- package/src/lib/guards/nest-auth-role.guard.js +37 -0
- package/src/lib/guards/nest-auth-role.guard.js.map +1 -0
- package/src/lib/nest-auth.module.js +26 -13
- package/src/lib/nest-auth.module.js.map +1 -1
- package/src/lib/services/access-key.service.d.ts +19 -0
- package/src/lib/services/access-key.service.js +119 -0
- package/src/lib/services/access-key.service.js.map +1 -0
- package/src/lib/services/auth.service.d.ts +5 -3
- package/src/lib/services/auth.service.js +80 -15
- package/src/lib/services/auth.service.js.map +1 -1
- package/src/lib/services/role.service.d.ts +16 -0
- package/src/lib/services/role.service.js +194 -0
- package/src/lib/services/role.service.js.map +1 -0
- package/src/lib/services/tenant.service.d.ts +16 -0
- package/src/lib/services/tenant.service.js +134 -0
- package/src/lib/services/tenant.service.js.map +1 -0
- package/src/lib/services/user.service.d.ts +20 -0
- package/src/lib/services/user.service.js +211 -0
- package/src/lib/services/user.service.js.map +1 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FindManyOptions, FindOneOptions, Repository } from 'typeorm';
|
|
2
|
+
import { Role } from '../entities/role.entity';
|
|
3
|
+
export declare class RoleService {
|
|
4
|
+
private roleRepository;
|
|
5
|
+
constructor(roleRepository: Repository<Role>);
|
|
6
|
+
createRole(name: string, guard: string, tenantId?: string, isSystem?: boolean, permissionIds?: string | string[]): Promise<Role>;
|
|
7
|
+
getRoleById(id: string, options?: FindOneOptions<Role>): Promise<Role>;
|
|
8
|
+
getRoleByName(name: string, guard?: string, tenantId?: string, options?: FindOneOptions<Role>): Promise<Role>;
|
|
9
|
+
getAllRoles(options?: FindManyOptions<Role>): Promise<Role[]>;
|
|
10
|
+
getRolesByGuard(guard: string, tenantId?: string, options?: FindManyOptions<Role>): Promise<Role[]>;
|
|
11
|
+
getRolesByTenant(tenantId: string, includeSystemRoles?: boolean, options?: FindManyOptions<Role>): Promise<Role[]>;
|
|
12
|
+
updateRole(id: string, data: Partial<Role>): Promise<Role>;
|
|
13
|
+
updateRolePermissions(id: string, permissionIds: string | string[]): Promise<Role>;
|
|
14
|
+
deleteRole(id: string): Promise<void>;
|
|
15
|
+
deleteSystemRole(id: string): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RoleService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
7
|
+
const typeorm_2 = require("typeorm");
|
|
8
|
+
const role_entity_1 = require("../entities/role.entity");
|
|
9
|
+
let RoleService = class RoleService {
|
|
10
|
+
constructor(roleRepository) {
|
|
11
|
+
this.roleRepository = roleRepository;
|
|
12
|
+
}
|
|
13
|
+
async createRole(name, guard, tenantId = null, isSystem = false, permissionIds) {
|
|
14
|
+
const existingRole = await this.roleRepository.findOne({
|
|
15
|
+
where: {
|
|
16
|
+
name,
|
|
17
|
+
guard,
|
|
18
|
+
tenantId: tenantId || (0, typeorm_2.IsNull)()
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
if (existingRole) {
|
|
22
|
+
throw new common_1.ConflictException({
|
|
23
|
+
message: `Role with name '${name}' already exists in guard '${guard}'${tenantId ? ` for tenant '${tenantId}'` : ''}`,
|
|
24
|
+
code: 'ROLE_ALREADY_EXISTS'
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const role = await role_entity_1.Role.createRole(name, guard, isSystem, tenantId);
|
|
28
|
+
if (permissionIds) {
|
|
29
|
+
await role.syncPermissions(permissionIds);
|
|
30
|
+
}
|
|
31
|
+
await this.roleRepository.save(role);
|
|
32
|
+
return role;
|
|
33
|
+
}
|
|
34
|
+
async getRoleById(id, options) {
|
|
35
|
+
if (!id) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const role = await this.roleRepository.findOne({
|
|
39
|
+
...(options ? options : {}),
|
|
40
|
+
where: { id }
|
|
41
|
+
});
|
|
42
|
+
if (!role) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return role;
|
|
46
|
+
}
|
|
47
|
+
async getRoleByName(name, guard, tenantId, options) {
|
|
48
|
+
const systemRole = await this.roleRepository.findOne({
|
|
49
|
+
...(options ? options : {}),
|
|
50
|
+
where: {
|
|
51
|
+
name,
|
|
52
|
+
...(guard ? { guard } : {}),
|
|
53
|
+
isSystem: true
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
if (systemRole) {
|
|
57
|
+
return systemRole;
|
|
58
|
+
}
|
|
59
|
+
const role = await this.roleRepository.findOne({
|
|
60
|
+
...(options ? options : {}),
|
|
61
|
+
where: {
|
|
62
|
+
name,
|
|
63
|
+
...(guard ? { guard } : {}),
|
|
64
|
+
...(tenantId ? { tenantId } : { tenantId: (0, typeorm_2.IsNull)() })
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return role;
|
|
68
|
+
}
|
|
69
|
+
async getAllRoles(options) {
|
|
70
|
+
return this.roleRepository.find(options);
|
|
71
|
+
}
|
|
72
|
+
async getRolesByGuard(guard, tenantId, options) {
|
|
73
|
+
if (!guard) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
return this.roleRepository.find({
|
|
77
|
+
...(options ? options : {}),
|
|
78
|
+
where: {
|
|
79
|
+
guard,
|
|
80
|
+
...(tenantId ? { tenantId } : { tenantId: (0, typeorm_2.IsNull)() }),
|
|
81
|
+
...(options?.where ? options.where : {})
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async getRolesByTenant(tenantId, includeSystemRoles = true, options) {
|
|
86
|
+
if (!tenantId) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
const query = this.roleRepository.createQueryBuilder('role')
|
|
90
|
+
.leftJoinAndSelect('role.rolePermissions', 'rolePermission');
|
|
91
|
+
query.where('role.tenantId = :tenantId', { tenantId });
|
|
92
|
+
if (includeSystemRoles) {
|
|
93
|
+
query.orWhere('role.tenantId IS NULL AND role.isSystem = :isSystem', { isSystem: true });
|
|
94
|
+
}
|
|
95
|
+
if (options) {
|
|
96
|
+
if (options.where) {
|
|
97
|
+
query.andWhere(options.where);
|
|
98
|
+
}
|
|
99
|
+
if (options.order) {
|
|
100
|
+
Object.entries(options.order).forEach(([key, value]) => {
|
|
101
|
+
query.addOrderBy(`role.${key}`, value);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (options.skip) {
|
|
105
|
+
query.skip(options.skip);
|
|
106
|
+
}
|
|
107
|
+
if (options.take) {
|
|
108
|
+
query.take(options.take);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return query.getMany();
|
|
112
|
+
}
|
|
113
|
+
async updateRole(id, data) {
|
|
114
|
+
const role = await this.getRoleById(id);
|
|
115
|
+
if (!role) {
|
|
116
|
+
throw new common_1.NotFoundException({
|
|
117
|
+
message: `Role with ID ${id} not found`,
|
|
118
|
+
code: 'ROLE_NOT_FOUND'
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (role.isSystem) {
|
|
122
|
+
throw new common_1.ConflictException({
|
|
123
|
+
message: 'Cannot update system role',
|
|
124
|
+
code: 'SYSTEM_ROLE_UPDATE_ERROR',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
delete data.isSystem;
|
|
128
|
+
delete data.tenantId;
|
|
129
|
+
if ((data.name && data.name !== role.name) || (data.guard && data.guard !== role.guard)) {
|
|
130
|
+
const systemRole = await this.getRoleByName(data.name || role.name, data.guard || role.guard);
|
|
131
|
+
if (systemRole) {
|
|
132
|
+
throw new common_1.ConflictException({
|
|
133
|
+
message: `Cannot use name '${data.name || role.name}' as it conflicts with a system role`,
|
|
134
|
+
code: 'SYSTEM_ROLE_CONFLICT'
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
const existingRole = await this.getRoleByName(data.name || role.name, data.guard || role.guard, role.tenantId);
|
|
138
|
+
if (existingRole && existingRole.id !== role.id) {
|
|
139
|
+
throw new common_1.ConflictException({
|
|
140
|
+
message: `Role with name '${data.name || role.name}' already exists in guard '${data.guard || role.guard}'${role.tenantId ? ` for tenant '${role.tenantId}'` : ''}`,
|
|
141
|
+
code: 'ROLE_ALREADY_EXISTS'
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
Object.assign(role, data);
|
|
146
|
+
return this.roleRepository.save(role);
|
|
147
|
+
}
|
|
148
|
+
async updateRolePermissions(id, permissionIds) {
|
|
149
|
+
const role = await this.getRoleById(id);
|
|
150
|
+
if (!role) {
|
|
151
|
+
throw new common_1.NotFoundException({
|
|
152
|
+
message: `Role with ID ${id} not found`,
|
|
153
|
+
code: 'ROLE_NOT_FOUND'
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (role.isSystem) {
|
|
157
|
+
throw new common_1.BadRequestException({
|
|
158
|
+
message: 'Cannot update system role',
|
|
159
|
+
code: 'SYSTEM_ROLE_UPDATE_ERROR',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
await role.syncPermissions(permissionIds);
|
|
163
|
+
return this.roleRepository.save(role);
|
|
164
|
+
}
|
|
165
|
+
async deleteRole(id) {
|
|
166
|
+
const role = await this.getRoleById(id);
|
|
167
|
+
if (!role) {
|
|
168
|
+
throw new common_1.NotFoundException({
|
|
169
|
+
message: `Role with ID ${id} not found`,
|
|
170
|
+
code: 'ROLE_NOT_FOUND'
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (role.isSystem) {
|
|
174
|
+
throw new common_1.BadRequestException({
|
|
175
|
+
message: 'Cannot delete system role',
|
|
176
|
+
code: 'SYSTEM_ROLE_DELETE_ERROR',
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
await this.roleRepository.remove(role);
|
|
180
|
+
}
|
|
181
|
+
async deleteSystemRole(id) {
|
|
182
|
+
const role = await this.getRoleById(id);
|
|
183
|
+
if (role?.isSystem) {
|
|
184
|
+
await this.roleRepository.remove(role);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
exports.RoleService = RoleService;
|
|
189
|
+
exports.RoleService = RoleService = tslib_1.__decorate([
|
|
190
|
+
(0, common_1.Injectable)(),
|
|
191
|
+
tslib_1.__param(0, (0, typeorm_1.InjectRepository)(role_entity_1.Role)),
|
|
192
|
+
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository])
|
|
193
|
+
], RoleService);
|
|
194
|
+
//# sourceMappingURL=role.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role.service.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/services/role.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FindManyOptions, FindOneOptions, Repository } from 'typeorm';
|
|
2
|
+
import { Tenant } from '../entities/tenant.entity';
|
|
3
|
+
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
4
|
+
export declare class TenantService {
|
|
5
|
+
private tenantRepository;
|
|
6
|
+
private eventEmitter;
|
|
7
|
+
constructor(tenantRepository: Repository<Tenant>, eventEmitter: EventEmitter2);
|
|
8
|
+
createTenant(data: Partial<Tenant>): Promise<Tenant>;
|
|
9
|
+
getTenantById(id: string, options?: FindOneOptions<Tenant>): Promise<Tenant>;
|
|
10
|
+
getTenantByDomain(domain: string, options?: FindOneOptions<Tenant>): Promise<Tenant>;
|
|
11
|
+
getAllTenants(options?: FindManyOptions<Tenant>): Promise<Tenant[]>;
|
|
12
|
+
updateTenant(id: string, data: Partial<Tenant>): Promise<Tenant>;
|
|
13
|
+
deleteTenant(id: string): Promise<void>;
|
|
14
|
+
updateTenantStatus(id: string, isActive: boolean): Promise<Tenant>;
|
|
15
|
+
updateTenantMetadata(id: string, metadata: Record<string, any>): Promise<Tenant>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TenantService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
7
|
+
const typeorm_2 = require("typeorm");
|
|
8
|
+
const tenant_entity_1 = require("../entities/tenant.entity");
|
|
9
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
10
|
+
const events_1 = require("../events");
|
|
11
|
+
const events_2 = require("../events");
|
|
12
|
+
let TenantService = class TenantService {
|
|
13
|
+
constructor(tenantRepository, eventEmitter) {
|
|
14
|
+
this.tenantRepository = tenantRepository;
|
|
15
|
+
this.eventEmitter = eventEmitter;
|
|
16
|
+
}
|
|
17
|
+
async createTenant(data) {
|
|
18
|
+
const { domain } = data;
|
|
19
|
+
const existingTenant = await this.tenantRepository.findOne({
|
|
20
|
+
where: { domain }
|
|
21
|
+
});
|
|
22
|
+
if (existingTenant) {
|
|
23
|
+
throw new common_1.ConflictException({
|
|
24
|
+
message: `Tenant with domain '${domain}' already exists`,
|
|
25
|
+
code: 'TENANT_ALREADY_EXISTS'
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const tenant = this.tenantRepository.create(data);
|
|
29
|
+
await this.tenantRepository.save(tenant);
|
|
30
|
+
await this.eventEmitter.emitAsync(events_1.NestAuthEvents.TENANT_CREATED, new events_1.TenantCreatedEvent({
|
|
31
|
+
tenant
|
|
32
|
+
}));
|
|
33
|
+
return tenant;
|
|
34
|
+
}
|
|
35
|
+
async getTenantById(id, options) {
|
|
36
|
+
if (!id) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const tenant = await this.tenantRepository.findOne({
|
|
40
|
+
...(options ? options : {}),
|
|
41
|
+
where: { id }
|
|
42
|
+
});
|
|
43
|
+
if (!tenant) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return tenant;
|
|
47
|
+
}
|
|
48
|
+
async getTenantByDomain(domain, options) {
|
|
49
|
+
if (!domain) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const tenant = await this.tenantRepository.findOne({
|
|
53
|
+
...(options ? options : {}),
|
|
54
|
+
where: { domain }
|
|
55
|
+
});
|
|
56
|
+
return tenant;
|
|
57
|
+
}
|
|
58
|
+
async getAllTenants(options) {
|
|
59
|
+
return this.tenantRepository.find(options);
|
|
60
|
+
}
|
|
61
|
+
async updateTenant(id, data) {
|
|
62
|
+
const tenant = await this.getTenantById(id);
|
|
63
|
+
if (!tenant) {
|
|
64
|
+
throw new common_1.NotFoundException({
|
|
65
|
+
message: `Tenant with ID ${id} not found`,
|
|
66
|
+
code: 'TENANT_NOT_FOUND'
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (data.domain && data.domain !== tenant.domain) {
|
|
70
|
+
const existingTenant = await this.getTenantByDomain(data.domain);
|
|
71
|
+
if (existingTenant && existingTenant.id !== tenant.id) {
|
|
72
|
+
throw new common_1.ConflictException({
|
|
73
|
+
message: `Tenant with domain '${data.domain}' already exists`,
|
|
74
|
+
code: 'TENANT_ALREADY_EXISTS'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
Object.assign(tenant, data);
|
|
79
|
+
const updatedTenant = await this.tenantRepository.save(tenant);
|
|
80
|
+
await this.eventEmitter.emitAsync(events_1.NestAuthEvents.TENANT_UPDATED, new events_2.TenantUpdatedEvent({
|
|
81
|
+
tenant: updatedTenant,
|
|
82
|
+
updatedFields: Object.keys(data)
|
|
83
|
+
}));
|
|
84
|
+
return updatedTenant;
|
|
85
|
+
}
|
|
86
|
+
async deleteTenant(id) {
|
|
87
|
+
const tenant = await this.getTenantById(id);
|
|
88
|
+
if (!tenant) {
|
|
89
|
+
throw new common_1.NotFoundException({
|
|
90
|
+
message: `Tenant with ID ${id} not found`,
|
|
91
|
+
code: 'TENANT_NOT_FOUND'
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
await this.eventEmitter.emitAsync(events_1.NestAuthEvents.TENANT_DELETED, new events_2.TenantDeletedEvent({
|
|
95
|
+
tenant
|
|
96
|
+
}));
|
|
97
|
+
await this.tenantRepository.remove(tenant);
|
|
98
|
+
}
|
|
99
|
+
async updateTenantStatus(id, isActive) {
|
|
100
|
+
const tenant = await this.getTenantById(id);
|
|
101
|
+
if (!tenant) {
|
|
102
|
+
throw new common_1.NotFoundException({
|
|
103
|
+
message: `Tenant with ID ${id} not found`,
|
|
104
|
+
code: 'TENANT_NOT_FOUND'
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
tenant.isActive = isActive;
|
|
108
|
+
const updatedTenant = await this.tenantRepository.save(tenant);
|
|
109
|
+
return updatedTenant;
|
|
110
|
+
}
|
|
111
|
+
async updateTenantMetadata(id, metadata) {
|
|
112
|
+
const tenant = await this.getTenantById(id);
|
|
113
|
+
if (!tenant) {
|
|
114
|
+
throw new common_1.NotFoundException({
|
|
115
|
+
message: `Tenant with ID ${id} not found`,
|
|
116
|
+
code: 'TENANT_NOT_FOUND'
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
tenant.metadata = {
|
|
120
|
+
...tenant.metadata,
|
|
121
|
+
...metadata
|
|
122
|
+
};
|
|
123
|
+
const updatedTenant = await this.tenantRepository.save(tenant);
|
|
124
|
+
return updatedTenant;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
exports.TenantService = TenantService;
|
|
128
|
+
exports.TenantService = TenantService = tslib_1.__decorate([
|
|
129
|
+
(0, common_1.Injectable)(),
|
|
130
|
+
tslib_1.__param(0, (0, typeorm_1.InjectRepository)(tenant_entity_1.Tenant)),
|
|
131
|
+
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
132
|
+
event_emitter_1.EventEmitter2])
|
|
133
|
+
], TenantService);
|
|
134
|
+
//# sourceMappingURL=tenant.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.service.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/services/tenant.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FindManyOptions, FindOneOptions, Repository } from 'typeorm';
|
|
2
|
+
import { User } from '../entities/user.entity';
|
|
3
|
+
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
4
|
+
export declare class UserService {
|
|
5
|
+
private userRepository;
|
|
6
|
+
private eventEmitter;
|
|
7
|
+
constructor(userRepository: Repository<User>, eventEmitter: EventEmitter2);
|
|
8
|
+
createUser(data: Partial<User>): Promise<User>;
|
|
9
|
+
getUserById(id: string, options?: FindOneOptions<User>): Promise<User>;
|
|
10
|
+
getUserByEmail(email: string, tenantId?: string, options?: FindOneOptions<User>): Promise<User>;
|
|
11
|
+
getUserByPhone(phone: string, tenantId?: string, options?: FindOneOptions<User>): Promise<User>;
|
|
12
|
+
getAllUsers(options?: FindManyOptions<User>): Promise<User[]>;
|
|
13
|
+
getUsersByTenant(tenantId: string, options?: FindManyOptions<User>): Promise<User[]>;
|
|
14
|
+
updateUser(id: string, data: Partial<User>): Promise<User>;
|
|
15
|
+
deleteUser(id: string): Promise<void>;
|
|
16
|
+
verifyUser(id: string, verificationType?: 'email' | 'phone' | 'none'): Promise<User>;
|
|
17
|
+
unverifyUser(id: string, verificationType?: 'email' | 'phone' | 'none'): Promise<User>;
|
|
18
|
+
updateUserStatus(id: string, isActive: boolean): Promise<User>;
|
|
19
|
+
updateUserMetadata(id: string, metadata: Record<string, any>): Promise<User>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
7
|
+
const typeorm_2 = require("typeorm");
|
|
8
|
+
const user_entity_1 = require("../entities/user.entity");
|
|
9
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
10
|
+
const events_1 = require("../events");
|
|
11
|
+
const events_2 = require("../events");
|
|
12
|
+
const user_created_event_1 = require("../events/user-created.event");
|
|
13
|
+
let UserService = class UserService {
|
|
14
|
+
constructor(userRepository, eventEmitter) {
|
|
15
|
+
this.userRepository = userRepository;
|
|
16
|
+
this.eventEmitter = eventEmitter;
|
|
17
|
+
}
|
|
18
|
+
async createUser(data) {
|
|
19
|
+
const { email, phone, tenantId } = data;
|
|
20
|
+
if (!tenantId) {
|
|
21
|
+
throw new common_1.BadRequestException('Tenant ID is required');
|
|
22
|
+
}
|
|
23
|
+
if (!email && !phone) {
|
|
24
|
+
throw new common_1.BadRequestException('Either email or phone must be provided');
|
|
25
|
+
}
|
|
26
|
+
const existingUser = await this.userRepository.findOne({
|
|
27
|
+
where: [
|
|
28
|
+
{ email, tenantId: tenantId || (0, typeorm_2.IsNull)() },
|
|
29
|
+
{ phone, tenantId: tenantId || (0, typeorm_2.IsNull)() }
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
if (existingUser) {
|
|
33
|
+
throw new common_1.ConflictException({
|
|
34
|
+
message: `User with email '${email}' or phone '${phone}' already exists in tenant '${tenantId}'`,
|
|
35
|
+
code: 'USER_ALREADY_EXISTS'
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const user = this.userRepository.create(data);
|
|
39
|
+
await this.userRepository.save(user);
|
|
40
|
+
await this.eventEmitter.emitAsync(events_1.NestAuthEvents.USER_CREATED, new user_created_event_1.UserCreatedEvent({
|
|
41
|
+
user
|
|
42
|
+
}));
|
|
43
|
+
return user;
|
|
44
|
+
}
|
|
45
|
+
async getUserById(id, options) {
|
|
46
|
+
if (!id) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const user = await this.userRepository.findOne({
|
|
50
|
+
...(options ? options : {}),
|
|
51
|
+
where: { id }
|
|
52
|
+
});
|
|
53
|
+
if (!user) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return user;
|
|
57
|
+
}
|
|
58
|
+
async getUserByEmail(email, tenantId, options) {
|
|
59
|
+
if (!email) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return this.userRepository.findOne({
|
|
63
|
+
...(options ? options : {}),
|
|
64
|
+
where: {
|
|
65
|
+
email,
|
|
66
|
+
tenantId: tenantId || (0, typeorm_2.IsNull)()
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async getUserByPhone(phone, tenantId, options) {
|
|
71
|
+
if (!phone) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return this.userRepository.findOne({
|
|
75
|
+
...(options ? options : {}),
|
|
76
|
+
where: {
|
|
77
|
+
phone,
|
|
78
|
+
tenantId: tenantId || (0, typeorm_2.IsNull)()
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async getAllUsers(options) {
|
|
83
|
+
return this.userRepository.find(options);
|
|
84
|
+
}
|
|
85
|
+
async getUsersByTenant(tenantId, options) {
|
|
86
|
+
if (!tenantId) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
return this.userRepository.find({
|
|
90
|
+
...(options ? options : {}),
|
|
91
|
+
where: {
|
|
92
|
+
tenantId,
|
|
93
|
+
...(options?.where ? options.where : {})
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async updateUser(id, data) {
|
|
98
|
+
const user = await this.getUserById(id);
|
|
99
|
+
if (!user) {
|
|
100
|
+
throw new common_1.NotFoundException({
|
|
101
|
+
message: `User with ID ${id} not found`,
|
|
102
|
+
code: 'USER_NOT_FOUND'
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (data.email || data.phone) {
|
|
106
|
+
const existingUser = await this.userRepository.findOne({
|
|
107
|
+
where: [
|
|
108
|
+
{ email: data.email || user.email, tenantId: user.tenantId },
|
|
109
|
+
{ phone: data.phone || user.phone, tenantId: user.tenantId }
|
|
110
|
+
]
|
|
111
|
+
});
|
|
112
|
+
if (existingUser && existingUser.id !== user.id) {
|
|
113
|
+
throw new common_1.ConflictException({
|
|
114
|
+
message: `User with email '${data.email || user.email}' or phone '${data.phone || user.phone}' already exists in tenant '${user.tenantId}'`,
|
|
115
|
+
code: 'USER_ALREADY_EXISTS'
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
delete data.tenantId;
|
|
120
|
+
Object.assign(user, data);
|
|
121
|
+
const updatedUser = await this.userRepository.save(user);
|
|
122
|
+
await this.eventEmitter.emitAsync(events_1.NestAuthEvents.USER_UPDATED, new events_2.UserUpdatedEvent({
|
|
123
|
+
user: updatedUser,
|
|
124
|
+
tenantId: updatedUser.tenantId,
|
|
125
|
+
updatedFields: Object.keys(data)
|
|
126
|
+
}));
|
|
127
|
+
return updatedUser;
|
|
128
|
+
}
|
|
129
|
+
async deleteUser(id) {
|
|
130
|
+
const user = await this.getUserById(id);
|
|
131
|
+
if (!user) {
|
|
132
|
+
throw new common_1.NotFoundException({
|
|
133
|
+
message: `User with ID ${id} not found`,
|
|
134
|
+
code: 'USER_NOT_FOUND'
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
await this.eventEmitter.emitAsync(events_1.NestAuthEvents.USER_DELETED, new events_2.UserDeletedEvent({
|
|
138
|
+
user,
|
|
139
|
+
tenantId: user.tenantId
|
|
140
|
+
}));
|
|
141
|
+
await this.userRepository.remove(user);
|
|
142
|
+
}
|
|
143
|
+
async verifyUser(id, verificationType) {
|
|
144
|
+
const user = await this.getUserById(id);
|
|
145
|
+
if (!user) {
|
|
146
|
+
throw new common_1.NotFoundException({
|
|
147
|
+
message: `User with ID ${id} not found`,
|
|
148
|
+
code: 'USER_NOT_FOUND'
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (verificationType === 'email') {
|
|
152
|
+
user.emailVerifiedAt = new Date();
|
|
153
|
+
}
|
|
154
|
+
else if (verificationType === 'phone') {
|
|
155
|
+
user.phoneVerifiedAt = new Date();
|
|
156
|
+
}
|
|
157
|
+
user.isVerified = true;
|
|
158
|
+
return this.userRepository.save(user);
|
|
159
|
+
}
|
|
160
|
+
async unverifyUser(id, verificationType) {
|
|
161
|
+
const user = await this.getUserById(id);
|
|
162
|
+
if (!user) {
|
|
163
|
+
throw new common_1.NotFoundException({
|
|
164
|
+
message: `User with ID ${id} not found`,
|
|
165
|
+
code: 'USER_NOT_FOUND'
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (verificationType === 'email') {
|
|
169
|
+
user.emailVerifiedAt = null;
|
|
170
|
+
}
|
|
171
|
+
else if (verificationType === 'phone') {
|
|
172
|
+
user.phoneVerifiedAt = null;
|
|
173
|
+
}
|
|
174
|
+
user.isVerified = false;
|
|
175
|
+
user.isVerified = Boolean(user.emailVerifiedAt || user.phoneVerifiedAt);
|
|
176
|
+
return this.userRepository.save(user);
|
|
177
|
+
}
|
|
178
|
+
async updateUserStatus(id, isActive) {
|
|
179
|
+
const user = await this.getUserById(id);
|
|
180
|
+
if (!user) {
|
|
181
|
+
throw new common_1.NotFoundException({
|
|
182
|
+
message: `User with ID ${id} not found`,
|
|
183
|
+
code: 'USER_NOT_FOUND'
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
user.isActive = isActive;
|
|
187
|
+
return this.userRepository.save(user);
|
|
188
|
+
}
|
|
189
|
+
async updateUserMetadata(id, metadata) {
|
|
190
|
+
const user = await this.getUserById(id);
|
|
191
|
+
if (!user) {
|
|
192
|
+
throw new common_1.NotFoundException({
|
|
193
|
+
message: `User with ID ${id} not found`,
|
|
194
|
+
code: 'USER_NOT_FOUND'
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
user.metadata = {
|
|
198
|
+
...user.metadata,
|
|
199
|
+
...metadata
|
|
200
|
+
};
|
|
201
|
+
return this.userRepository.save(user);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
exports.UserService = UserService;
|
|
205
|
+
exports.UserService = UserService = tslib_1.__decorate([
|
|
206
|
+
(0, common_1.Injectable)(),
|
|
207
|
+
tslib_1.__param(0, (0, typeorm_1.InjectRepository)(user_entity_1.User)),
|
|
208
|
+
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
209
|
+
event_emitter_1.EventEmitter2])
|
|
210
|
+
], UserService);
|
|
211
|
+
//# sourceMappingURL=user.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../../../../../packages/nest-auth/src/lib/services/user.service.ts"],"names":[],"mappings":"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"}
|