@forklaunch/implementation-iam-base 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/lib/schemas/index.d.mts +474 -0
  2. package/lib/schemas/index.d.ts +474 -5
  3. package/lib/schemas/index.js +339 -4
  4. package/lib/schemas/index.mjs +369 -0
  5. package/lib/services/index.d.mts +203 -0
  6. package/lib/services/index.d.ts +203 -5
  7. package/lib/services/index.js +666 -4
  8. package/lib/services/index.mjs +652 -0
  9. package/package.json +6 -5
  10. package/lib/__test__/schemaEquality.test.d.ts +0 -2
  11. package/lib/__test__/schemaEquality.test.d.ts.map +0 -1
  12. package/lib/__test__/schemaEquality.test.js +0 -283
  13. package/lib/jest.config.d.ts +0 -4
  14. package/lib/jest.config.d.ts.map +0 -1
  15. package/lib/jest.config.js +0 -19
  16. package/lib/schemas/index.d.ts.map +0 -1
  17. package/lib/schemas/organization.schema.d.ts +0 -423
  18. package/lib/schemas/organization.schema.d.ts.map +0 -1
  19. package/lib/schemas/organization.schema.js +0 -7
  20. package/lib/schemas/permission.schema.d.ts +0 -104
  21. package/lib/schemas/permission.schema.d.ts.map +0 -1
  22. package/lib/schemas/permission.schema.js +0 -7
  23. package/lib/schemas/role.schema.d.ts +0 -163
  24. package/lib/schemas/role.schema.d.ts.map +0 -1
  25. package/lib/schemas/role.schema.js +0 -7
  26. package/lib/schemas/typebox/organization.schema.d.ts +0 -382
  27. package/lib/schemas/typebox/organization.schema.d.ts.map +0 -1
  28. package/lib/schemas/typebox/organization.schema.js +0 -44
  29. package/lib/schemas/typebox/permission.schema.d.ts +0 -123
  30. package/lib/schemas/typebox/permission.schema.d.ts.map +0 -1
  31. package/lib/schemas/typebox/permission.schema.js +0 -32
  32. package/lib/schemas/typebox/role.schema.d.ts +0 -183
  33. package/lib/schemas/typebox/role.schema.d.ts.map +0 -1
  34. package/lib/schemas/typebox/role.schema.js +0 -33
  35. package/lib/schemas/typebox/user.schema.d.ts +0 -315
  36. package/lib/schemas/typebox/user.schema.d.ts.map +0 -1
  37. package/lib/schemas/typebox/user.schema.js +0 -49
  38. package/lib/schemas/user.schema.d.ts +0 -298
  39. package/lib/schemas/user.schema.d.ts.map +0 -1
  40. package/lib/schemas/user.schema.js +0 -7
  41. package/lib/schemas/zod/organization.schema.d.ts +0 -418
  42. package/lib/schemas/zod/organization.schema.d.ts.map +0 -1
  43. package/lib/schemas/zod/organization.schema.js +0 -44
  44. package/lib/schemas/zod/permission.schema.d.ts +0 -71
  45. package/lib/schemas/zod/permission.schema.d.ts.map +0 -1
  46. package/lib/schemas/zod/permission.schema.js +0 -32
  47. package/lib/schemas/zod/role.schema.d.ts +0 -129
  48. package/lib/schemas/zod/role.schema.d.ts.map +0 -1
  49. package/lib/schemas/zod/role.schema.js +0 -33
  50. package/lib/schemas/zod/user.schema.d.ts +0 -249
  51. package/lib/schemas/zod/user.schema.d.ts.map +0 -1
  52. package/lib/schemas/zod/user.schema.js +0 -49
  53. package/lib/services/index.d.ts.map +0 -1
  54. package/lib/services/organization.service.d.ts +0 -123
  55. package/lib/services/organization.service.d.ts.map +0 -1
  56. package/lib/services/organization.service.js +0 -88
  57. package/lib/services/permission.service.d.ts +0 -149
  58. package/lib/services/permission.service.d.ts.map +0 -1
  59. package/lib/services/permission.service.js +0 -264
  60. package/lib/services/role.service.d.ts +0 -123
  61. package/lib/services/role.service.d.ts.map +0 -1
  62. package/lib/services/role.service.js +0 -139
  63. package/lib/services/user.service.d.ts +0 -134
  64. package/lib/services/user.service.d.ts.map +0 -1
  65. package/lib/services/user.service.js +0 -185
  66. package/lib/tsconfig.tsbuildinfo +0 -1
  67. package/lib/vitest.config.d.ts +0 -3
  68. package/lib/vitest.config.d.ts.map +0 -1
  69. package/lib/vitest.config.js +0 -7
@@ -1,4 +1,666 @@
1
- export * from './organization.service';
2
- export * from './permission.service';
3
- export * from './role.service';
4
- export * from './user.service';
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // services/index.ts
21
+ var services_exports = {};
22
+ __export(services_exports, {
23
+ BaseOrganizationService: () => BaseOrganizationService,
24
+ BasePermissionService: () => BasePermissionService,
25
+ BaseRoleService: () => BaseRoleService,
26
+ BaseUserService: () => BaseUserService
27
+ });
28
+ module.exports = __toCommonJS(services_exports);
29
+
30
+ // services/organization.service.ts
31
+ var import_http = require("@forklaunch/core/http");
32
+ var import_mappers = require("@forklaunch/core/mappers");
33
+ var BaseOrganizationService = class {
34
+ constructor(em, openTelemetryCollector, schemaValidator, mappers, options) {
35
+ this.em = em;
36
+ this.openTelemetryCollector = openTelemetryCollector;
37
+ this.schemaValidator = schemaValidator;
38
+ this.mappers = mappers;
39
+ this.#mappers = (0, import_mappers.transformIntoInternalDtoMapper)(mappers, schemaValidator);
40
+ this.evaluatedTelemetryOptions = options?.telemetry ? (0, import_http.evaluateTelemetryOptions)(options.telemetry).enabled : {
41
+ logging: false,
42
+ metrics: false,
43
+ tracing: false
44
+ };
45
+ }
46
+ #mappers;
47
+ evaluatedTelemetryOptions;
48
+ async createOrganization(organizationDto, em) {
49
+ if (this.evaluatedTelemetryOptions.logging) {
50
+ this.openTelemetryCollector.info(
51
+ "Creating organization",
52
+ organizationDto
53
+ );
54
+ }
55
+ const organization = await this.#mappers.CreateOrganizationDtoMapper.deserializeDtoToEntity(
56
+ organizationDto,
57
+ em ?? this.em
58
+ );
59
+ if (em) {
60
+ await em.persist(organization);
61
+ } else {
62
+ await this.em.persistAndFlush(organization);
63
+ }
64
+ return this.#mappers.OrganizationDtoMapper.serializeEntityToDto(
65
+ organization
66
+ );
67
+ }
68
+ async getOrganization(idDto, em) {
69
+ if (this.evaluatedTelemetryOptions.logging) {
70
+ this.openTelemetryCollector.info("Getting organization", idDto);
71
+ }
72
+ const organization = await (em ?? this.em).findOneOrFail(
73
+ "Organization",
74
+ idDto
75
+ );
76
+ return this.#mappers.OrganizationDtoMapper.serializeEntityToDto(
77
+ organization
78
+ );
79
+ }
80
+ async updateOrganization(organizationDto, em) {
81
+ if (this.evaluatedTelemetryOptions.logging) {
82
+ this.openTelemetryCollector.info(
83
+ "Updating organization",
84
+ organizationDto
85
+ );
86
+ }
87
+ const updatedOrganization = await this.#mappers.UpdateOrganizationDtoMapper.deserializeDtoToEntity(
88
+ organizationDto,
89
+ em ?? this.em
90
+ );
91
+ if (em) {
92
+ await em.persist(updatedOrganization);
93
+ } else {
94
+ await this.em.persistAndFlush(updatedOrganization);
95
+ }
96
+ return this.#mappers.OrganizationDtoMapper.serializeEntityToDto(
97
+ updatedOrganization
98
+ );
99
+ }
100
+ async deleteOrganization(idDto, em) {
101
+ if (this.evaluatedTelemetryOptions.logging) {
102
+ this.openTelemetryCollector.info("Deleting organization", idDto);
103
+ }
104
+ if (em) {
105
+ await em.nativeDelete("Organization", idDto);
106
+ } else {
107
+ await this.em.nativeDelete("Organization", idDto);
108
+ }
109
+ }
110
+ };
111
+
112
+ // services/permission.service.ts
113
+ var import_http2 = require("@forklaunch/core/http");
114
+ var import_mappers2 = require("@forklaunch/core/mappers");
115
+ var BasePermissionService = class {
116
+ constructor(em, roleServiceFactory, openTelemetryCollector, schemaValidator, mappers, options) {
117
+ this.em = em;
118
+ this.roleServiceFactory = roleServiceFactory;
119
+ this.openTelemetryCollector = openTelemetryCollector;
120
+ this.schemaValidator = schemaValidator;
121
+ this.mappers = mappers;
122
+ this.#mappers = (0, import_mappers2.transformIntoInternalDtoMapper)(mappers, schemaValidator);
123
+ this.evaluatedTelemetryOptions = options?.telemetry ? (0, import_http2.evaluateTelemetryOptions)(options.telemetry).enabled : {
124
+ logging: false,
125
+ metrics: false,
126
+ tracing: false
127
+ };
128
+ }
129
+ #mappers;
130
+ evaluatedTelemetryOptions;
131
+ // start: global helper functions
132
+ async updateRolesWithPermissions(roles, permissions) {
133
+ return Promise.all(
134
+ roles.map(async (role) => {
135
+ permissions.forEach((permission) => role.permissions.add(permission));
136
+ return role;
137
+ })
138
+ );
139
+ }
140
+ async removePermissionsFromRoles(roles, permissions) {
141
+ return Promise.all(
142
+ roles.map(async (role) => {
143
+ permissions.forEach(
144
+ (permission) => role.permissions.remove(permission)
145
+ );
146
+ return role;
147
+ })
148
+ );
149
+ }
150
+ async getBatchRoles(roleIds, em) {
151
+ return roleIds ? await Promise.all(
152
+ (await this.roleServiceFactory().getBatchRoles(roleIds, em)).map(
153
+ async (role) => {
154
+ return (em ?? this.em).merge(
155
+ await this.#mappers.RoleEntityMapper.deserializeDtoToEntity(
156
+ role,
157
+ em ?? this.em
158
+ )
159
+ );
160
+ }
161
+ )
162
+ ) : [];
163
+ }
164
+ // end: global helper functions
165
+ // start: createPermission helper functions
166
+ async createPermissionDto({
167
+ permission,
168
+ addToRoles
169
+ }) {
170
+ let roles = [];
171
+ if (addToRoles) {
172
+ roles = await this.updateRolesWithPermissions(addToRoles, [permission]);
173
+ }
174
+ return { permission, roles };
175
+ }
176
+ async extractCreatePermissionDtoToEntityData(permissionDto, em) {
177
+ return {
178
+ permission: (em ?? this.em).merge(
179
+ await this.#mappers.CreatePermissionDtoMapper.deserializeDtoToEntity(
180
+ permissionDto,
181
+ em ?? this.em
182
+ )
183
+ ),
184
+ addToRoles: permissionDto.addToRolesIds ? await this.getBatchRoles({ ids: permissionDto.addToRolesIds }, em) : []
185
+ };
186
+ }
187
+ // end: createPermission helper functions
188
+ async createPermission(createPermissionDto, em) {
189
+ if (this.evaluatedTelemetryOptions.logging) {
190
+ this.openTelemetryCollector.info(
191
+ "Creating permission",
192
+ createPermissionDto
193
+ );
194
+ }
195
+ const { permission, roles } = await this.createPermissionDto(
196
+ await this.extractCreatePermissionDtoToEntityData(createPermissionDto, em)
197
+ );
198
+ if (em) {
199
+ await em.persist([permission, ...roles]);
200
+ } else {
201
+ await this.em.persistAndFlush([permission, ...roles]);
202
+ }
203
+ return this.#mappers.PermissionDtoMapper.serializeEntityToDto(permission);
204
+ }
205
+ async createBatchPermissions(permissionDtos, em) {
206
+ if (this.evaluatedTelemetryOptions.logging) {
207
+ this.openTelemetryCollector.info(
208
+ "Creating batch permissions",
209
+ permissionDtos
210
+ );
211
+ }
212
+ const rolesCache = {};
213
+ const permissions = [];
214
+ permissionDtos.map(async (createPermissionDto) => {
215
+ const { permission, roles } = await this.createPermissionDto(
216
+ await this.extractCreatePermissionDtoToEntityData(
217
+ createPermissionDto,
218
+ em
219
+ )
220
+ );
221
+ roles.forEach((role) => {
222
+ if (rolesCache[role.id] && role.permissions !== rolesCache[role.id].permissions) {
223
+ role.permissions.getItems().forEach((permission2) => {
224
+ if (!rolesCache[role.id].permissions.contains(permission2)) {
225
+ rolesCache[role.id].permissions.add(permission2);
226
+ }
227
+ });
228
+ } else {
229
+ rolesCache[role.id] = role;
230
+ }
231
+ });
232
+ permissions.push(permission);
233
+ });
234
+ const entities = [...permissions, ...Object.values(rolesCache)];
235
+ if (em) {
236
+ await em.persist(entities);
237
+ } else {
238
+ await this.em.persistAndFlush(entities);
239
+ }
240
+ return Promise.all(
241
+ permissions.map(
242
+ async (permission) => this.#mappers.PermissionDtoMapper.serializeEntityToDto(permission)
243
+ )
244
+ );
245
+ }
246
+ async getPermission(idDto, em) {
247
+ if (this.evaluatedTelemetryOptions.logging) {
248
+ this.openTelemetryCollector.info("Getting permission", idDto);
249
+ }
250
+ const permission = await (em ?? this.em).findOneOrFail("Permission", idDto);
251
+ return this.#mappers.PermissionDtoMapper.serializeEntityToDto(
252
+ permission
253
+ );
254
+ }
255
+ async getBatchPermissions(idsDto, em) {
256
+ if (this.evaluatedTelemetryOptions.logging) {
257
+ this.openTelemetryCollector.info("Getting batch permissions", idsDto);
258
+ }
259
+ return Promise.all(
260
+ (await (em ?? this.em).find("Permission", idsDto)).map(
261
+ (permission) => this.#mappers.PermissionDtoMapper.serializeEntityToDto(
262
+ permission
263
+ )
264
+ )
265
+ );
266
+ }
267
+ // start: updatePermission helper functions
268
+ updatePermissionDto = async (permissionDto, em) => {
269
+ const permission = await this.#mappers.UpdatePermissionDtoMapper.deserializeDtoToEntity(
270
+ permissionDto,
271
+ em ?? this.em
272
+ );
273
+ const addToRoles = permissionDto.addToRolesIds ? await this.getBatchRoles({ ids: permissionDto.addToRolesIds }, em) : [];
274
+ const removeFromRoles = permissionDto.removeFromRolesIds ? await this.getBatchRoles({ ids: permissionDto.removeFromRolesIds }, em) : [];
275
+ let roles = [];
276
+ roles = roles.concat(
277
+ await this.updateRolesWithPermissions(addToRoles, [permission])
278
+ );
279
+ roles = roles.concat(
280
+ await this.removePermissionsFromRoles(removeFromRoles, [permission])
281
+ );
282
+ return {
283
+ permission,
284
+ roles
285
+ };
286
+ };
287
+ // end: updatePermission helper functions
288
+ async updatePermission(permissionDto, em) {
289
+ if (this.evaluatedTelemetryOptions.logging) {
290
+ this.openTelemetryCollector.info("Updating permission", permissionDto);
291
+ }
292
+ const { permission, roles } = await this.updatePermissionDto(permissionDto);
293
+ const entities = await (em ?? this.em).upsertMany([permission, ...roles]);
294
+ if (em) {
295
+ await em.persist(entities);
296
+ } else {
297
+ await this.em.persistAndFlush(entities);
298
+ }
299
+ return this.#mappers.PermissionDtoMapper.serializeEntityToDto(permission);
300
+ }
301
+ async updateBatchPermissions(permissionDtos, em) {
302
+ if (this.evaluatedTelemetryOptions.logging) {
303
+ this.openTelemetryCollector.info(
304
+ "Updating batch permissions",
305
+ permissionDtos
306
+ );
307
+ }
308
+ const rolesCache = {};
309
+ const permissions = [];
310
+ await (em ?? this.em).transactional(async (em2) => {
311
+ permissionDtos.map(async (updatePermissionDto) => {
312
+ const { permission, roles } = await this.updatePermissionDto(updatePermissionDto);
313
+ roles.forEach((role) => {
314
+ if (rolesCache[role.id] && role.permissions !== rolesCache[role.id].permissions) {
315
+ role.permissions.getItems().forEach((permission2) => {
316
+ if (!rolesCache[role.id].permissions.contains(permission2)) {
317
+ rolesCache[role.id].permissions.add(permission2);
318
+ }
319
+ });
320
+ } else {
321
+ rolesCache[role.id] = role;
322
+ }
323
+ });
324
+ permissions.push(permission);
325
+ });
326
+ const entities = [...permissions, ...Object.values(rolesCache)];
327
+ if (em2) {
328
+ await em2.persist(entities);
329
+ } else {
330
+ await this.em.persistAndFlush(entities);
331
+ }
332
+ });
333
+ return Promise.all(
334
+ permissions.map(
335
+ (permission) => this.#mappers.PermissionDtoMapper.serializeEntityToDto(permission)
336
+ )
337
+ );
338
+ }
339
+ async deletePermission(idDto, em) {
340
+ if (this.evaluatedTelemetryOptions.logging) {
341
+ this.openTelemetryCollector.info("Deleting permission", idDto);
342
+ }
343
+ await (em ?? this.em).nativeDelete("Permission", idDto);
344
+ }
345
+ async deleteBatchPermissions(idsDto, em) {
346
+ if (this.evaluatedTelemetryOptions.logging) {
347
+ this.openTelemetryCollector.info("Deleting batch permissions", idsDto);
348
+ }
349
+ await (em ?? this.em).nativeDelete("Permission", {
350
+ id: { $in: idsDto.ids }
351
+ });
352
+ }
353
+ };
354
+
355
+ // services/role.service.ts
356
+ var import_http3 = require("@forklaunch/core/http");
357
+ var import_mappers3 = require("@forklaunch/core/mappers");
358
+ var BaseRoleService = class {
359
+ constructor(em, openTelemetryCollector, schemaValidator, mappers, options) {
360
+ this.em = em;
361
+ this.openTelemetryCollector = openTelemetryCollector;
362
+ this.schemaValidator = schemaValidator;
363
+ this.mappers = mappers;
364
+ this.#mappers = (0, import_mappers3.transformIntoInternalDtoMapper)(mappers, schemaValidator);
365
+ this.evaluatedTelemetryOptions = options?.telemetry ? (0, import_http3.evaluateTelemetryOptions)(options.telemetry).enabled : {
366
+ logging: false,
367
+ metrics: false,
368
+ tracing: false
369
+ };
370
+ }
371
+ #mappers;
372
+ evaluatedTelemetryOptions;
373
+ async createRole(roleDto, em) {
374
+ if (this.evaluatedTelemetryOptions.logging) {
375
+ this.openTelemetryCollector.info("Creating role", roleDto);
376
+ }
377
+ const role = await this.#mappers.CreateRoleDtoMapper.deserializeDtoToEntity(
378
+ roleDto,
379
+ em ?? this.em
380
+ );
381
+ if (em) {
382
+ await em.persist(role);
383
+ } else {
384
+ await this.em.persistAndFlush(role);
385
+ }
386
+ return this.#mappers.RoleDtoMapper.serializeEntityToDto(role);
387
+ }
388
+ async createBatchRoles(roleDtos, em) {
389
+ if (this.evaluatedTelemetryOptions.logging) {
390
+ this.openTelemetryCollector.info("Creating batch roles", roleDtos);
391
+ }
392
+ const roles = await Promise.all(
393
+ roleDtos.map(
394
+ async (roleDto) => this.#mappers.CreateRoleDtoMapper.deserializeDtoToEntity(
395
+ roleDto,
396
+ em ?? this.em
397
+ )
398
+ )
399
+ );
400
+ if (em) {
401
+ await em.persist(roles);
402
+ } else {
403
+ await this.em.persistAndFlush(roles);
404
+ }
405
+ return Promise.all(
406
+ roles.map(
407
+ (role) => this.#mappers.RoleDtoMapper.serializeEntityToDto(role)
408
+ )
409
+ );
410
+ }
411
+ async getRole({ id }, em) {
412
+ if (this.evaluatedTelemetryOptions.logging) {
413
+ this.openTelemetryCollector.info("Getting role", { id });
414
+ }
415
+ const role = await (em ?? this.em).findOneOrFail("Role", id, {
416
+ populate: ["id", "*"]
417
+ });
418
+ return this.#mappers.RoleDtoMapper.serializeEntityToDto(
419
+ role
420
+ );
421
+ }
422
+ async getBatchRoles({ ids }, em) {
423
+ if (this.evaluatedTelemetryOptions.logging) {
424
+ this.openTelemetryCollector.info("Getting batch roles", { ids });
425
+ }
426
+ return Promise.all(
427
+ (await (em ?? this.em).find(
428
+ "Role",
429
+ {
430
+ id: { $in: ids }
431
+ },
432
+ {
433
+ populate: ["id", "*"]
434
+ }
435
+ )).map(
436
+ (role) => this.#mappers.RoleDtoMapper.serializeEntityToDto(
437
+ role
438
+ )
439
+ )
440
+ );
441
+ }
442
+ async updateRole(roleDto, em) {
443
+ if (this.evaluatedTelemetryOptions.logging) {
444
+ this.openTelemetryCollector.info("Updating role", roleDto);
445
+ }
446
+ const role = await this.#mappers.UpdateRoleDtoMapper.deserializeDtoToEntity(
447
+ roleDto,
448
+ em ?? this.em
449
+ );
450
+ if (em) {
451
+ await em.persist(role);
452
+ } else {
453
+ await this.em.persistAndFlush(role);
454
+ }
455
+ return this.#mappers.RoleDtoMapper.serializeEntityToDto(role);
456
+ }
457
+ async updateBatchRoles(roleDtos, em) {
458
+ if (this.evaluatedTelemetryOptions.logging) {
459
+ this.openTelemetryCollector.info("Updating batch roles", roleDtos);
460
+ }
461
+ const roles = await Promise.all(
462
+ roleDtos.map(
463
+ async (roleDto) => this.#mappers.UpdateRoleDtoMapper.deserializeDtoToEntity(
464
+ roleDto,
465
+ em ?? this.em
466
+ )
467
+ )
468
+ );
469
+ if (em) {
470
+ await em.persist(roles);
471
+ } else {
472
+ await this.em.persistAndFlush(roles);
473
+ }
474
+ return Promise.all(
475
+ roles.map(
476
+ (role) => this.#mappers.RoleDtoMapper.serializeEntityToDto(
477
+ role
478
+ )
479
+ )
480
+ );
481
+ }
482
+ async deleteRole(idDto, em) {
483
+ if (this.evaluatedTelemetryOptions.logging) {
484
+ this.openTelemetryCollector.info("Deleting role", idDto);
485
+ }
486
+ await (em ?? this.em).nativeDelete("Role", idDto);
487
+ }
488
+ async deleteBatchRoles(idsDto, em) {
489
+ if (this.evaluatedTelemetryOptions.logging) {
490
+ this.openTelemetryCollector.info("Deleting batch roles", idsDto);
491
+ }
492
+ await (em ?? this.em).nativeDelete("Role", { id: { $in: idsDto.ids } });
493
+ }
494
+ };
495
+
496
+ // services/user.service.ts
497
+ var import_http4 = require("@forklaunch/core/http");
498
+ var import_mappers4 = require("@forklaunch/core/mappers");
499
+ var BaseUserService = class {
500
+ constructor(em, passwordEncryptionPublicKeyPath, roleServiceFactory, organizationServiceFactory, openTelemetryCollector, schemaValidator, mappers, options) {
501
+ this.em = em;
502
+ this.passwordEncryptionPublicKeyPath = passwordEncryptionPublicKeyPath;
503
+ this.roleServiceFactory = roleServiceFactory;
504
+ this.organizationServiceFactory = organizationServiceFactory;
505
+ this.openTelemetryCollector = openTelemetryCollector;
506
+ this.schemaValidator = schemaValidator;
507
+ this.mappers = mappers;
508
+ this.options = options;
509
+ this.#mappers = (0, import_mappers4.transformIntoInternalDtoMapper)(mappers, schemaValidator);
510
+ this.evaluatedTelemetryOptions = options?.telemetry ? (0, import_http4.evaluateTelemetryOptions)(options.telemetry).enabled : {
511
+ logging: false,
512
+ metrics: false,
513
+ tracing: false
514
+ };
515
+ }
516
+ #mappers;
517
+ evaluatedTelemetryOptions;
518
+ async createUser(userDto, em) {
519
+ if (this.evaluatedTelemetryOptions.logging) {
520
+ this.openTelemetryCollector.info("Creating user", userDto);
521
+ }
522
+ const user = await this.#mappers.CreateUserDtoMapper.deserializeDtoToEntity(
523
+ userDto,
524
+ em ?? this.em
525
+ );
526
+ if (em) {
527
+ await em.persist(user);
528
+ } else {
529
+ await this.em.persistAndFlush(user);
530
+ }
531
+ return this.#mappers.UserDtoMapper.serializeEntityToDto(user);
532
+ }
533
+ async createBatchUsers(userDtos, em) {
534
+ if (this.evaluatedTelemetryOptions.logging) {
535
+ this.openTelemetryCollector.info("Creating batch users", userDtos);
536
+ }
537
+ const users = await Promise.all(
538
+ userDtos.map(
539
+ async (createUserDto) => this.#mappers.CreateUserDtoMapper.deserializeDtoToEntity(
540
+ createUserDto,
541
+ em ?? this.em
542
+ )
543
+ )
544
+ );
545
+ if (em) {
546
+ await em.persist(users);
547
+ } else {
548
+ await this.em.persistAndFlush(users);
549
+ }
550
+ return Promise.all(
551
+ users.map(
552
+ (user) => this.#mappers.UserDtoMapper.serializeEntityToDto(user)
553
+ )
554
+ );
555
+ }
556
+ async getUser(idDto, em) {
557
+ if (this.evaluatedTelemetryOptions.logging) {
558
+ this.openTelemetryCollector.info("Getting user", idDto);
559
+ }
560
+ const user = await (em ?? this.em).findOneOrFail("User", idDto, {
561
+ populate: ["id", "*"]
562
+ });
563
+ return this.#mappers.UserDtoMapper.serializeEntityToDto(
564
+ user
565
+ );
566
+ }
567
+ async getBatchUsers(idsDto, em) {
568
+ if (this.evaluatedTelemetryOptions.logging) {
569
+ this.openTelemetryCollector.info("Getting batch users", idsDto);
570
+ }
571
+ return Promise.all(
572
+ (await (em ?? this.em).find("User", idsDto, {
573
+ populate: ["id", "*"]
574
+ })).map(
575
+ (user) => this.#mappers.UserDtoMapper.serializeEntityToDto(
576
+ user
577
+ )
578
+ )
579
+ );
580
+ }
581
+ async updateUser(userDto, em) {
582
+ if (this.evaluatedTelemetryOptions.logging) {
583
+ this.openTelemetryCollector.info("Updating user", userDto);
584
+ }
585
+ const user = await this.#mappers.UpdateUserDtoMapper.deserializeDtoToEntity(
586
+ userDto,
587
+ em ?? this.em
588
+ );
589
+ if (em) {
590
+ await em.persist(user);
591
+ } else {
592
+ await this.em.persistAndFlush(user);
593
+ }
594
+ return this.#mappers.UserDtoMapper.serializeEntityToDto(user);
595
+ }
596
+ async updateBatchUsers(userDtos, em) {
597
+ if (this.evaluatedTelemetryOptions.logging) {
598
+ this.openTelemetryCollector.info("Updating batch users", userDtos);
599
+ }
600
+ const users = await Promise.all(
601
+ userDtos.map(
602
+ async (updateUserDto) => this.#mappers.UpdateUserDtoMapper.deserializeDtoToEntity(
603
+ updateUserDto,
604
+ em ?? this.em
605
+ )
606
+ )
607
+ );
608
+ if (em) {
609
+ await em.persist(users);
610
+ } else {
611
+ await this.em.persistAndFlush(users);
612
+ }
613
+ return Promise.all(
614
+ users.map(
615
+ (user) => this.#mappers.UserDtoMapper.serializeEntityToDto(user)
616
+ )
617
+ );
618
+ }
619
+ async deleteUser(idDto, em) {
620
+ if (this.evaluatedTelemetryOptions.logging) {
621
+ this.openTelemetryCollector.info("Deleting user", idDto);
622
+ }
623
+ await (em ?? this.em).nativeDelete("User", idDto);
624
+ }
625
+ async deleteBatchUsers(idsDto, em) {
626
+ if (this.evaluatedTelemetryOptions.logging) {
627
+ this.openTelemetryCollector.info("Deleting batch users", idsDto);
628
+ }
629
+ await (em ?? this.em).nativeDelete("User", idsDto);
630
+ }
631
+ async verifyHasRole(idDto, roleId) {
632
+ if (this.evaluatedTelemetryOptions.logging) {
633
+ this.openTelemetryCollector.info("Verifying user has role", {
634
+ idDto,
635
+ roleId
636
+ });
637
+ }
638
+ const user = await this.getUser(idDto);
639
+ if (user.roles.filter((role) => {
640
+ return roleId == role.id;
641
+ }).length === 0) {
642
+ throw new Error(`User ${idDto.id} does not have role ${roleId}`);
643
+ }
644
+ }
645
+ async verifyHasPermission(idDto, permissionId) {
646
+ if (this.evaluatedTelemetryOptions.logging) {
647
+ this.openTelemetryCollector.info("Verifying user has permission", {
648
+ idDto,
649
+ permissionId
650
+ });
651
+ }
652
+ const user = await this.getUser(idDto);
653
+ if (user.roles.map((role) => role.permissions.map((permission) => permission.id)).flat().filter((id) => id == permissionId).length === 0) {
654
+ throw new Error(
655
+ `User ${idDto.id} does not have permission ${permissionId}`
656
+ );
657
+ }
658
+ }
659
+ };
660
+ // Annotate the CommonJS export names for ESM import in node:
661
+ 0 && (module.exports = {
662
+ BaseOrganizationService,
663
+ BasePermissionService,
664
+ BaseRoleService,
665
+ BaseUserService
666
+ });