@forklaunch/implementation-iam-base 0.1.11 → 0.1.12
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 +5 -5
- package/lib/__test__/schemaEquality.test.d.ts +0 -2
- package/lib/__test__/schemaEquality.test.d.ts.map +0 -1
- package/lib/__test__/schemaEquality.test.js +0 -283
- package/lib/eject/domain/schemas/index.ts +0 -4
- package/lib/eject/domain/schemas/organization.schema.ts +0 -53
- package/lib/eject/domain/schemas/permission.schema.ts +0 -36
- package/lib/eject/domain/schemas/role.schema.ts +0 -37
- package/lib/eject/domain/schemas/user.schema.ts +0 -53
- package/lib/eject/services/index.ts +0 -4
- package/lib/eject/services/organization.service.ts +0 -143
- package/lib/eject/services/permission.service.ts +0 -345
- package/lib/eject/services/role.service.ts +0 -179
- package/lib/eject/services/user.service.ts +0 -224
- package/lib/jest.config.d.ts +0 -4
- package/lib/jest.config.d.ts.map +0 -1
- package/lib/jest.config.js +0 -19
- package/lib/schemas/index.d.ts +0 -5
- package/lib/schemas/index.d.ts.map +0 -1
- package/lib/schemas/index.js +0 -4
- package/lib/schemas/organization.schema.d.ts +0 -411
- package/lib/schemas/organization.schema.d.ts.map +0 -1
- package/lib/schemas/organization.schema.js +0 -7
- package/lib/schemas/permission.schema.d.ts +0 -104
- package/lib/schemas/permission.schema.d.ts.map +0 -1
- package/lib/schemas/permission.schema.js +0 -7
- package/lib/schemas/role.schema.d.ts +0 -163
- package/lib/schemas/role.schema.d.ts.map +0 -1
- package/lib/schemas/role.schema.js +0 -7
- package/lib/schemas/typebox/organization.schema.d.ts +0 -414
- package/lib/schemas/typebox/organization.schema.d.ts.map +0 -1
- package/lib/schemas/typebox/organization.schema.js +0 -44
- package/lib/schemas/typebox/permission.schema.d.ts +0 -131
- package/lib/schemas/typebox/permission.schema.d.ts.map +0 -1
- package/lib/schemas/typebox/permission.schema.js +0 -32
- package/lib/schemas/typebox/role.schema.d.ts +0 -199
- package/lib/schemas/typebox/role.schema.d.ts.map +0 -1
- package/lib/schemas/typebox/role.schema.js +0 -33
- package/lib/schemas/typebox/user.schema.d.ts +0 -339
- package/lib/schemas/typebox/user.schema.d.ts.map +0 -1
- package/lib/schemas/typebox/user.schema.js +0 -49
- package/lib/schemas/user.schema.d.ts +0 -290
- package/lib/schemas/user.schema.d.ts.map +0 -1
- package/lib/schemas/user.schema.js +0 -7
- package/lib/schemas/zod/organization.schema.d.ts +0 -374
- package/lib/schemas/zod/organization.schema.d.ts.map +0 -1
- package/lib/schemas/zod/organization.schema.js +0 -44
- package/lib/schemas/zod/permission.schema.d.ts +0 -63
- package/lib/schemas/zod/permission.schema.d.ts.map +0 -1
- package/lib/schemas/zod/permission.schema.js +0 -32
- package/lib/schemas/zod/role.schema.d.ts +0 -113
- package/lib/schemas/zod/role.schema.d.ts.map +0 -1
- package/lib/schemas/zod/role.schema.js +0 -33
- package/lib/schemas/zod/user.schema.d.ts +0 -225
- package/lib/schemas/zod/user.schema.d.ts.map +0 -1
- package/lib/schemas/zod/user.schema.js +0 -49
- package/lib/services/index.d.ts +0 -5
- package/lib/services/index.d.ts.map +0 -1
- package/lib/services/index.js +0 -4
- package/lib/services/organization.service.d.ts +0 -118
- package/lib/services/organization.service.d.ts.map +0 -1
- package/lib/services/organization.service.js +0 -50
- package/lib/services/permission.service.d.ts +0 -138
- package/lib/services/permission.service.d.ts.map +0 -1
- package/lib/services/permission.service.js +0 -203
- package/lib/services/role.service.d.ts +0 -118
- package/lib/services/role.service.d.ts.map +0 -1
- package/lib/services/role.service.js +0 -73
- package/lib/services/user.service.d.ts +0 -138
- package/lib/services/user.service.d.ts.map +0 -1
- package/lib/services/user.service.js +0 -126
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/lib/vitest.config.d.ts +0 -3
- package/lib/vitest.config.d.ts.map +0 -1
- package/lib/vitest.config.js +0 -7
|
@@ -1,345 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PermissionService,
|
|
3
|
-
RoleService
|
|
4
|
-
} from '@forklaunch/interfaces-iam/interfaces';
|
|
5
|
-
|
|
6
|
-
import { IdDto, IdsDto, InstanceTypeRecord } from '@forklaunch/common';
|
|
7
|
-
import {
|
|
8
|
-
InternalDtoMapper,
|
|
9
|
-
RequestDtoMapperConstructor,
|
|
10
|
-
ResponseDtoMapperConstructor,
|
|
11
|
-
transformIntoInternalDtoMapper
|
|
12
|
-
} from '@forklaunch/core/mappers';
|
|
13
|
-
import {
|
|
14
|
-
MetricsDefinition,
|
|
15
|
-
OpenTelemetryCollector
|
|
16
|
-
} from '@forklaunch/core/http';
|
|
17
|
-
import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
|
|
18
|
-
import {
|
|
19
|
-
CreatePermissionDto,
|
|
20
|
-
PermissionDto,
|
|
21
|
-
RoleDto,
|
|
22
|
-
UpdatePermissionDto
|
|
23
|
-
} from '@forklaunch/interfaces-iam/types';
|
|
24
|
-
import { AnySchemaValidator } from '@forklaunch/validator';
|
|
25
|
-
import { EntityManager } from '@mikro-orm/core';
|
|
26
|
-
|
|
27
|
-
export class BasePermissionService<
|
|
28
|
-
SchemaValidator extends AnySchemaValidator,
|
|
29
|
-
Metrics extends MetricsDefinition = MetricsDefinition,
|
|
30
|
-
Dto extends {
|
|
31
|
-
PermissionDtoMapper: PermissionDto;
|
|
32
|
-
CreatePermissionDtoMapper: CreatePermissionDto;
|
|
33
|
-
UpdatePermissionDtoMapper: UpdatePermissionDto;
|
|
34
|
-
RoleDtoMapper: RoleDto;
|
|
35
|
-
} = {
|
|
36
|
-
PermissionDtoMapper: PermissionDto;
|
|
37
|
-
CreatePermissionDtoMapper: CreatePermissionDto;
|
|
38
|
-
UpdatePermissionDtoMapper: UpdatePermissionDto;
|
|
39
|
-
RoleDtoMapper: RoleDto;
|
|
40
|
-
},
|
|
41
|
-
Entities extends {
|
|
42
|
-
PermissionDtoMapper: PermissionDto;
|
|
43
|
-
CreatePermissionDtoMapper: PermissionDto;
|
|
44
|
-
UpdatePermissionDtoMapper: PermissionDto;
|
|
45
|
-
RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
|
|
46
|
-
} = {
|
|
47
|
-
PermissionDtoMapper: PermissionDto;
|
|
48
|
-
CreatePermissionDtoMapper: PermissionDto;
|
|
49
|
-
UpdatePermissionDtoMapper: PermissionDto;
|
|
50
|
-
RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
|
|
51
|
-
}
|
|
52
|
-
> implements PermissionService
|
|
53
|
-
{
|
|
54
|
-
#mapperss: InternalDtoMapper<
|
|
55
|
-
InstanceTypeRecord<typeof this.mapperss>,
|
|
56
|
-
Entities,
|
|
57
|
-
Dto
|
|
58
|
-
>;
|
|
59
|
-
|
|
60
|
-
constructor(
|
|
61
|
-
public em: EntityManager,
|
|
62
|
-
protected roleServiceFactory: () => RoleService,
|
|
63
|
-
protected openTelemetryCollector: OpenTelemetryCollector<Metrics>,
|
|
64
|
-
protected schemaValidator: SchemaValidator,
|
|
65
|
-
protected mapperss: {
|
|
66
|
-
PermissionDtoMapper: ResponseDtoMapperConstructor<
|
|
67
|
-
SchemaValidator,
|
|
68
|
-
Dto['PermissionDtoMapper'],
|
|
69
|
-
Entities['PermissionDtoMapper']
|
|
70
|
-
>;
|
|
71
|
-
CreatePermissionDtoMapper: RequestDtoMapperConstructor<
|
|
72
|
-
SchemaValidator,
|
|
73
|
-
Dto['CreatePermissionDtoMapper'],
|
|
74
|
-
Entities['CreatePermissionDtoMapper']
|
|
75
|
-
>;
|
|
76
|
-
UpdatePermissionDtoMapper: RequestDtoMapperConstructor<
|
|
77
|
-
SchemaValidator,
|
|
78
|
-
Dto['UpdatePermissionDtoMapper'],
|
|
79
|
-
Entities['UpdatePermissionDtoMapper']
|
|
80
|
-
>;
|
|
81
|
-
RoleDtoMapper: RequestDtoMapperConstructor<
|
|
82
|
-
SchemaValidator,
|
|
83
|
-
Dto['RoleDtoMapper'],
|
|
84
|
-
Entities['RoleDtoMapper']
|
|
85
|
-
>;
|
|
86
|
-
}
|
|
87
|
-
) {
|
|
88
|
-
this.#mapperss = transformIntoInternalDtoMapper(mapperss, schemaValidator);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// start: global helper functions
|
|
92
|
-
private async updateRolesWithPermissions(
|
|
93
|
-
roles: Entities['RoleDtoMapper'][],
|
|
94
|
-
permissions: Entities['PermissionDtoMapper'][]
|
|
95
|
-
): Promise<Entities['RoleDtoMapper'][]> {
|
|
96
|
-
return await Promise.all(
|
|
97
|
-
roles.map(async (role) => {
|
|
98
|
-
permissions.forEach((permission) => role.permissions.add(permission));
|
|
99
|
-
return role;
|
|
100
|
-
})
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
private async removePermissionsFromRoles(
|
|
105
|
-
roles: Entities['RoleDtoMapper'][],
|
|
106
|
-
permissions: Entities['PermissionDtoMapper'][]
|
|
107
|
-
): Promise<Entities['RoleDtoMapper'][]> {
|
|
108
|
-
return await Promise.all(
|
|
109
|
-
roles.map(async (role) => {
|
|
110
|
-
permissions.forEach((permission) =>
|
|
111
|
-
role.permissions.remove(permission)
|
|
112
|
-
);
|
|
113
|
-
return role;
|
|
114
|
-
})
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
private async getBatchRoles(
|
|
119
|
-
roleIds?: IdsDto,
|
|
120
|
-
em?: EntityManager
|
|
121
|
-
): Promise<Entities['RoleDtoMapper'][]> {
|
|
122
|
-
return roleIds
|
|
123
|
-
? (await this.roleServiceFactory().getBatchRoles(roleIds, em)).map(
|
|
124
|
-
(role) => {
|
|
125
|
-
return (em ?? this.em).merge(
|
|
126
|
-
this.#mapperss.RoleDtoMapper.deserializeDtoToEntity(role)
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
)
|
|
130
|
-
: [];
|
|
131
|
-
}
|
|
132
|
-
// end: global helper functions
|
|
133
|
-
|
|
134
|
-
// start: createPermission helper functions
|
|
135
|
-
private async createPermissionDto({
|
|
136
|
-
permission,
|
|
137
|
-
addToRoles
|
|
138
|
-
}: {
|
|
139
|
-
permission: Entities['PermissionDtoMapper'];
|
|
140
|
-
addToRoles: Entities['RoleDtoMapper'][];
|
|
141
|
-
}): Promise<{
|
|
142
|
-
permission: Entities['PermissionDtoMapper'];
|
|
143
|
-
roles: Entities['RoleDtoMapper'][];
|
|
144
|
-
}> {
|
|
145
|
-
let roles: Entities['RoleDtoMapper'][] = [];
|
|
146
|
-
if (addToRoles) {
|
|
147
|
-
roles = await this.updateRolesWithPermissions(addToRoles, [permission]);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return { permission, roles };
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
private async extractCreatePermissionDtoToEntityData(
|
|
154
|
-
permissionDto: Dto['CreatePermissionDtoMapper'],
|
|
155
|
-
em?: EntityManager
|
|
156
|
-
): Promise<{
|
|
157
|
-
permission: Entities['PermissionDtoMapper'];
|
|
158
|
-
addToRoles: Entities['RoleDtoMapper'][];
|
|
159
|
-
}> {
|
|
160
|
-
return {
|
|
161
|
-
permission: (em ?? this.em).merge(
|
|
162
|
-
this.#mapperss.CreatePermissionDtoMapper.deserializeDtoToEntity(
|
|
163
|
-
permissionDto
|
|
164
|
-
)
|
|
165
|
-
),
|
|
166
|
-
addToRoles: permissionDto.addToRolesIds
|
|
167
|
-
? await this.getBatchRoles({ ids: permissionDto.addToRolesIds }, em)
|
|
168
|
-
: []
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
// end: createPermission helper functions
|
|
172
|
-
|
|
173
|
-
async createPermission(
|
|
174
|
-
createPermissionDto: Dto['CreatePermissionDtoMapper'],
|
|
175
|
-
em?: EntityManager
|
|
176
|
-
): Promise<Dto['PermissionDtoMapper']> {
|
|
177
|
-
const { permission, roles } = await this.createPermissionDto(
|
|
178
|
-
await this.extractCreatePermissionDtoToEntityData(createPermissionDto, em)
|
|
179
|
-
);
|
|
180
|
-
await (em ?? this.em).transactional(async (innerEm) => {
|
|
181
|
-
await innerEm.persist([permission, ...roles]);
|
|
182
|
-
});
|
|
183
|
-
return this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
async createBatchPermissions(
|
|
187
|
-
permissionDtos: Dto['CreatePermissionDtoMapper'][],
|
|
188
|
-
em?: EntityManager
|
|
189
|
-
): Promise<Dto['PermissionDtoMapper'][]> {
|
|
190
|
-
const rolesCache: Record<string, Entities['RoleDtoMapper']> = {};
|
|
191
|
-
const permissions: Entities['PermissionDtoMapper'][] = [];
|
|
192
|
-
await (em ?? this.em).transactional(async (em) => {
|
|
193
|
-
permissionDtos.map(async (createPermissionDto) => {
|
|
194
|
-
const { permission, roles } = await this.createPermissionDto(
|
|
195
|
-
await this.extractCreatePermissionDtoToEntityData(
|
|
196
|
-
createPermissionDto,
|
|
197
|
-
em
|
|
198
|
-
)
|
|
199
|
-
);
|
|
200
|
-
roles.forEach((role) => {
|
|
201
|
-
if (
|
|
202
|
-
rolesCache[role.id] &&
|
|
203
|
-
role.permissions !== rolesCache[role.id].permissions
|
|
204
|
-
) {
|
|
205
|
-
role.permissions.getItems().forEach((permission) => {
|
|
206
|
-
if (!rolesCache[role.id].permissions.contains(permission)) {
|
|
207
|
-
rolesCache[role.id].permissions.add(permission);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
} else {
|
|
211
|
-
rolesCache[role.id] = role;
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
permissions.push(permission);
|
|
215
|
-
});
|
|
216
|
-
await (em ?? this.em).persist([
|
|
217
|
-
...permissions,
|
|
218
|
-
...Object.values(rolesCache)
|
|
219
|
-
]);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
return permissions.map((permission) =>
|
|
223
|
-
this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission)
|
|
224
|
-
);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
async getPermission(
|
|
228
|
-
idDto: IdDto,
|
|
229
|
-
em?: EntityManager
|
|
230
|
-
): Promise<Dto['PermissionDtoMapper']> {
|
|
231
|
-
const permission = await (em ?? this.em).findOneOrFail('Permission', idDto);
|
|
232
|
-
return this.#mapperss.PermissionDtoMapper.serializeEntityToDto(
|
|
233
|
-
permission as Entities['PermissionDtoMapper']
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
async getBatchPermissions(
|
|
238
|
-
idsDto: IdsDto,
|
|
239
|
-
em?: EntityManager
|
|
240
|
-
): Promise<Dto['PermissionDtoMapper'][]> {
|
|
241
|
-
return (await (em ?? this.em).find('Permission', idsDto)).map(
|
|
242
|
-
(permission) =>
|
|
243
|
-
this.#mapperss.PermissionDtoMapper.serializeEntityToDto(
|
|
244
|
-
permission as Entities['PermissionDtoMapper']
|
|
245
|
-
)
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// start: updatePermission helper functions
|
|
250
|
-
private updatePermissionDto = async (
|
|
251
|
-
permissionDto: Dto['UpdatePermissionDtoMapper'],
|
|
252
|
-
em?: EntityManager
|
|
253
|
-
): Promise<{
|
|
254
|
-
permission: Entities['PermissionDtoMapper'];
|
|
255
|
-
roles: Entities['RoleDtoMapper'][];
|
|
256
|
-
}> => {
|
|
257
|
-
const permission =
|
|
258
|
-
this.#mapperss.UpdatePermissionDtoMapper.deserializeDtoToEntity(
|
|
259
|
-
permissionDto
|
|
260
|
-
);
|
|
261
|
-
const addToRoles = permissionDto.addToRolesIds
|
|
262
|
-
? await this.getBatchRoles({ ids: permissionDto.addToRolesIds }, em)
|
|
263
|
-
: [];
|
|
264
|
-
const removeFromRoles = permissionDto.removeFromRolesIds
|
|
265
|
-
? await this.getBatchRoles({ ids: permissionDto.removeFromRolesIds }, em)
|
|
266
|
-
: [];
|
|
267
|
-
|
|
268
|
-
let roles: Entities['RoleDtoMapper'][] = [];
|
|
269
|
-
|
|
270
|
-
roles = roles.concat(
|
|
271
|
-
await this.updateRolesWithPermissions(addToRoles, [permission])
|
|
272
|
-
);
|
|
273
|
-
roles = roles.concat(
|
|
274
|
-
await this.removePermissionsFromRoles(removeFromRoles, [permission])
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
return {
|
|
278
|
-
permission,
|
|
279
|
-
roles
|
|
280
|
-
};
|
|
281
|
-
};
|
|
282
|
-
// end: updatePermission helper functions
|
|
283
|
-
|
|
284
|
-
async updatePermission(
|
|
285
|
-
permissionDto: Dto['UpdatePermissionDtoMapper'],
|
|
286
|
-
em?: EntityManager
|
|
287
|
-
): Promise<Dto['PermissionDtoMapper']> {
|
|
288
|
-
const { permission, roles } = await this.updatePermissionDto(permissionDto);
|
|
289
|
-
await (em ?? this.em).upsertMany([permission, ...roles]);
|
|
290
|
-
if (!em) {
|
|
291
|
-
this.em.flush();
|
|
292
|
-
}
|
|
293
|
-
return this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
async updateBatchPermissions(
|
|
297
|
-
permissionDtos: Dto['UpdatePermissionDtoMapper'][],
|
|
298
|
-
em?: EntityManager
|
|
299
|
-
): Promise<Dto['PermissionDtoMapper'][]> {
|
|
300
|
-
const rolesCache: Record<string, Entities['RoleDtoMapper']> = {};
|
|
301
|
-
const permissions: Entities['PermissionDtoMapper'][] = [];
|
|
302
|
-
await (em ?? this.em).transactional(async (em) => {
|
|
303
|
-
permissionDtos.map(async (updatePermissionDto) => {
|
|
304
|
-
const { permission, roles } =
|
|
305
|
-
await this.updatePermissionDto(updatePermissionDto);
|
|
306
|
-
roles.forEach((role) => {
|
|
307
|
-
if (
|
|
308
|
-
rolesCache[role.id] &&
|
|
309
|
-
role.permissions !== rolesCache[role.id].permissions
|
|
310
|
-
) {
|
|
311
|
-
role.permissions.getItems().forEach((permission) => {
|
|
312
|
-
if (!rolesCache[role.id].permissions.contains(permission)) {
|
|
313
|
-
rolesCache[role.id].permissions.add(permission);
|
|
314
|
-
}
|
|
315
|
-
});
|
|
316
|
-
} else {
|
|
317
|
-
rolesCache[role.id] = role;
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
permissions.push(permission);
|
|
321
|
-
});
|
|
322
|
-
await (em ?? this.em).persist([
|
|
323
|
-
...permissions,
|
|
324
|
-
...Object.values(rolesCache)
|
|
325
|
-
]);
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
return permissions.map((permission) =>
|
|
329
|
-
this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission)
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
async deletePermission(idDto: IdDto, em?: EntityManager): Promise<void> {
|
|
334
|
-
await (em ?? this.em).nativeDelete('Permission', idDto);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
async deleteBatchPermissions(
|
|
338
|
-
idsDto: IdsDto,
|
|
339
|
-
em?: EntityManager
|
|
340
|
-
): Promise<void> {
|
|
341
|
-
await (em ?? this.em).nativeDelete('Permission', {
|
|
342
|
-
id: { $in: idsDto.ids }
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
}
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
MetricsDefinition,
|
|
3
|
-
OpenTelemetryCollector
|
|
4
|
-
} from '@forklaunch/core/http';
|
|
5
|
-
import { RoleService } from '@forklaunch/interfaces-iam/interfaces';
|
|
6
|
-
import { EntityManager } from '@mikro-orm/core';
|
|
7
|
-
|
|
8
|
-
import { IdDto, IdsDto, InstanceTypeRecord } from '@forklaunch/common';
|
|
9
|
-
import {
|
|
10
|
-
InternalDtoMapper,
|
|
11
|
-
RequestDtoMapperConstructor,
|
|
12
|
-
ResponseDtoMapperConstructor,
|
|
13
|
-
transformIntoInternalDtoMapper
|
|
14
|
-
} from '@forklaunch/core/mappers';
|
|
15
|
-
import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
|
|
16
|
-
import {
|
|
17
|
-
CreateRoleDto,
|
|
18
|
-
RoleDto,
|
|
19
|
-
UpdateRoleDto
|
|
20
|
-
} from '@forklaunch/interfaces-iam/types';
|
|
21
|
-
import { AnySchemaValidator } from '@forklaunch/validator';
|
|
22
|
-
|
|
23
|
-
export class BaseRoleService<
|
|
24
|
-
SchemaValidator extends AnySchemaValidator,
|
|
25
|
-
Metrics extends MetricsDefinition = MetricsDefinition,
|
|
26
|
-
Dto extends {
|
|
27
|
-
RoleDtoMapper: RoleDto;
|
|
28
|
-
CreateRoleDtoMapper: CreateRoleDto;
|
|
29
|
-
UpdateRoleDtoMapper: UpdateRoleDto;
|
|
30
|
-
} = {
|
|
31
|
-
RoleDtoMapper: RoleDto;
|
|
32
|
-
CreateRoleDtoMapper: CreateRoleDto;
|
|
33
|
-
UpdateRoleDtoMapper: UpdateRoleDto;
|
|
34
|
-
},
|
|
35
|
-
Entities extends {
|
|
36
|
-
RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
|
|
37
|
-
CreateRoleDtoMapper: MapNestedDtoArraysToCollections<
|
|
38
|
-
RoleDto,
|
|
39
|
-
'permissions'
|
|
40
|
-
>;
|
|
41
|
-
UpdateRoleDtoMapper: MapNestedDtoArraysToCollections<
|
|
42
|
-
RoleDto,
|
|
43
|
-
'permissions'
|
|
44
|
-
>;
|
|
45
|
-
} = {
|
|
46
|
-
RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
|
|
47
|
-
CreateRoleDtoMapper: MapNestedDtoArraysToCollections<
|
|
48
|
-
RoleDto,
|
|
49
|
-
'permissions'
|
|
50
|
-
>;
|
|
51
|
-
UpdateRoleDtoMapper: MapNestedDtoArraysToCollections<
|
|
52
|
-
RoleDto,
|
|
53
|
-
'permissions'
|
|
54
|
-
>;
|
|
55
|
-
}
|
|
56
|
-
> implements RoleService
|
|
57
|
-
{
|
|
58
|
-
#mapperss: InternalDtoMapper<
|
|
59
|
-
InstanceTypeRecord<typeof this.mapperss>,
|
|
60
|
-
Entities,
|
|
61
|
-
Dto
|
|
62
|
-
>;
|
|
63
|
-
|
|
64
|
-
constructor(
|
|
65
|
-
public em: EntityManager,
|
|
66
|
-
protected openTelemetryCollector: OpenTelemetryCollector<Metrics>,
|
|
67
|
-
protected schemaValidator: SchemaValidator,
|
|
68
|
-
protected mapperss: {
|
|
69
|
-
RoleDtoMapper: ResponseDtoMapperConstructor<
|
|
70
|
-
SchemaValidator,
|
|
71
|
-
Dto['RoleDtoMapper'],
|
|
72
|
-
Entities['RoleDtoMapper']
|
|
73
|
-
>;
|
|
74
|
-
CreateRoleDtoMapper: RequestDtoMapperConstructor<
|
|
75
|
-
SchemaValidator,
|
|
76
|
-
Dto['CreateRoleDtoMapper'],
|
|
77
|
-
Entities['CreateRoleDtoMapper']
|
|
78
|
-
>;
|
|
79
|
-
UpdateRoleDtoMapper: RequestDtoMapperConstructor<
|
|
80
|
-
SchemaValidator,
|
|
81
|
-
Dto['UpdateRoleDtoMapper'],
|
|
82
|
-
Entities['UpdateRoleDtoMapper']
|
|
83
|
-
>;
|
|
84
|
-
}
|
|
85
|
-
) {
|
|
86
|
-
this.#mapperss = transformIntoInternalDtoMapper(mapperss, schemaValidator);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async createRole(
|
|
90
|
-
roleDto: Dto['CreateRoleDtoMapper'],
|
|
91
|
-
em?: EntityManager
|
|
92
|
-
): Promise<Dto['RoleDtoMapper']> {
|
|
93
|
-
// TODO: Think about removing static method here, since we need specific args
|
|
94
|
-
const role =
|
|
95
|
-
this.#mapperss.CreateRoleDtoMapper.deserializeDtoToEntity(roleDto);
|
|
96
|
-
await (em ?? this.em).transactional((em) => em.persist(role));
|
|
97
|
-
return this.#mapperss.RoleDtoMapper.serializeEntityToDto(
|
|
98
|
-
role as Entities['RoleDtoMapper']
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async createBatchRoles(
|
|
103
|
-
roleDtos: Dto['CreateRoleDtoMapper'][],
|
|
104
|
-
em?: EntityManager
|
|
105
|
-
): Promise<Dto['RoleDtoMapper'][]> {
|
|
106
|
-
const roles = await Promise.all(
|
|
107
|
-
roleDtos.map(async (roleDto) =>
|
|
108
|
-
this.#mapperss.CreateRoleDtoMapper.deserializeDtoToEntity(roleDto)
|
|
109
|
-
)
|
|
110
|
-
);
|
|
111
|
-
await (em ?? this.em).transactional((em) => em.persist(roles));
|
|
112
|
-
return roles.map((role) =>
|
|
113
|
-
this.#mapperss.RoleDtoMapper.serializeEntityToDto(
|
|
114
|
-
role as Entities['RoleDtoMapper']
|
|
115
|
-
)
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async getRole(idDto: IdDto, em?: EntityManager): Promise<RoleDto> {
|
|
120
|
-
const role = await (em ?? this.em).findOneOrFail('Role', idDto, {
|
|
121
|
-
populate: ['id', '*']
|
|
122
|
-
});
|
|
123
|
-
return this.#mapperss.RoleDtoMapper.serializeEntityToDto(
|
|
124
|
-
role as Entities['RoleDtoMapper']
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
async getBatchRoles(idsDto: IdsDto, em?: EntityManager): Promise<RoleDto[]> {
|
|
129
|
-
return (
|
|
130
|
-
await (em ?? this.em).find('Role', idsDto, {
|
|
131
|
-
populate: ['id', '*']
|
|
132
|
-
})
|
|
133
|
-
).map((role) =>
|
|
134
|
-
this.#mapperss.RoleDtoMapper.serializeEntityToDto(
|
|
135
|
-
role as Entities['RoleDtoMapper']
|
|
136
|
-
)
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async updateRole(
|
|
141
|
-
roleDto: Dto['UpdateRoleDtoMapper'],
|
|
142
|
-
em?: EntityManager
|
|
143
|
-
): Promise<Dto['RoleDtoMapper']> {
|
|
144
|
-
let role = this.#mapperss.UpdateRoleDtoMapper.deserializeDtoToEntity(
|
|
145
|
-
roleDto
|
|
146
|
-
) as Entities['RoleDtoMapper'];
|
|
147
|
-
await (em ?? this.em).transactional(async (em) => {
|
|
148
|
-
role = (await em.upsert('Role', role)) as Entities['RoleDtoMapper'];
|
|
149
|
-
});
|
|
150
|
-
return this.#mapperss.RoleDtoMapper.serializeEntityToDto(role);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
async updateBatchRoles(
|
|
154
|
-
roleDtos: Dto['UpdateRoleDtoMapper'][],
|
|
155
|
-
em?: EntityManager
|
|
156
|
-
): Promise<Dto['RoleDtoMapper'][]> {
|
|
157
|
-
let roles = await Promise.all(
|
|
158
|
-
roleDtos.map(async (roleDto) =>
|
|
159
|
-
this.#mapperss.UpdateRoleDtoMapper.deserializeDtoToEntity(roleDto)
|
|
160
|
-
)
|
|
161
|
-
);
|
|
162
|
-
await (em ?? this.em).transactional(async (em) => {
|
|
163
|
-
roles = await em.upsertMany('Role', roles);
|
|
164
|
-
});
|
|
165
|
-
return roles.map((role) =>
|
|
166
|
-
this.#mapperss.RoleDtoMapper.serializeEntityToDto(
|
|
167
|
-
role as Entities['RoleDtoMapper']
|
|
168
|
-
)
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
async deleteRole(idDto: IdDto, em?: EntityManager): Promise<void> {
|
|
173
|
-
await (em ?? this.em).nativeDelete('Role', idDto);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
async deleteBatchRoles(idsDto: IdsDto, em?: EntityManager): Promise<void> {
|
|
177
|
-
await (em ?? this.em).nativeDelete('Role', { id: { $in: idsDto.ids } });
|
|
178
|
-
}
|
|
179
|
-
}
|