@forklaunch/implementation-iam-base 0.1.12 → 0.1.14

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 (75) hide show
  1. package/lib/__test__/schemaEquality.test.d.ts +2 -0
  2. package/lib/__test__/schemaEquality.test.d.ts.map +1 -0
  3. package/lib/__test__/schemaEquality.test.js +283 -0
  4. package/lib/eject/domain/schemas/index.ts +4 -0
  5. package/lib/eject/domain/schemas/organization.schema.ts +53 -0
  6. package/lib/eject/domain/schemas/permission.schema.ts +36 -0
  7. package/lib/eject/domain/schemas/role.schema.ts +37 -0
  8. package/lib/eject/domain/schemas/user.schema.ts +53 -0
  9. package/lib/eject/services/index.ts +4 -0
  10. package/lib/eject/services/organization.service.ts +143 -0
  11. package/lib/eject/services/permission.service.ts +345 -0
  12. package/lib/eject/services/role.service.ts +179 -0
  13. package/lib/eject/services/user.service.ts +224 -0
  14. package/lib/jest.config.d.ts +4 -0
  15. package/lib/jest.config.d.ts.map +1 -0
  16. package/lib/jest.config.js +19 -0
  17. package/lib/schemas/index.d.ts +5 -0
  18. package/lib/schemas/index.d.ts.map +1 -0
  19. package/lib/schemas/index.js +4 -0
  20. package/lib/schemas/organization.schema.d.ts +411 -0
  21. package/lib/schemas/organization.schema.d.ts.map +1 -0
  22. package/lib/schemas/organization.schema.js +7 -0
  23. package/lib/schemas/permission.schema.d.ts +104 -0
  24. package/lib/schemas/permission.schema.d.ts.map +1 -0
  25. package/lib/schemas/permission.schema.js +7 -0
  26. package/lib/schemas/role.schema.d.ts +163 -0
  27. package/lib/schemas/role.schema.d.ts.map +1 -0
  28. package/lib/schemas/role.schema.js +7 -0
  29. package/lib/schemas/typebox/organization.schema.d.ts +414 -0
  30. package/lib/schemas/typebox/organization.schema.d.ts.map +1 -0
  31. package/lib/schemas/typebox/organization.schema.js +44 -0
  32. package/lib/schemas/typebox/permission.schema.d.ts +131 -0
  33. package/lib/schemas/typebox/permission.schema.d.ts.map +1 -0
  34. package/lib/schemas/typebox/permission.schema.js +32 -0
  35. package/lib/schemas/typebox/role.schema.d.ts +199 -0
  36. package/lib/schemas/typebox/role.schema.d.ts.map +1 -0
  37. package/lib/schemas/typebox/role.schema.js +33 -0
  38. package/lib/schemas/typebox/user.schema.d.ts +339 -0
  39. package/lib/schemas/typebox/user.schema.d.ts.map +1 -0
  40. package/lib/schemas/typebox/user.schema.js +49 -0
  41. package/lib/schemas/user.schema.d.ts +290 -0
  42. package/lib/schemas/user.schema.d.ts.map +1 -0
  43. package/lib/schemas/user.schema.js +7 -0
  44. package/lib/schemas/zod/organization.schema.d.ts +374 -0
  45. package/lib/schemas/zod/organization.schema.d.ts.map +1 -0
  46. package/lib/schemas/zod/organization.schema.js +44 -0
  47. package/lib/schemas/zod/permission.schema.d.ts +63 -0
  48. package/lib/schemas/zod/permission.schema.d.ts.map +1 -0
  49. package/lib/schemas/zod/permission.schema.js +32 -0
  50. package/lib/schemas/zod/role.schema.d.ts +113 -0
  51. package/lib/schemas/zod/role.schema.d.ts.map +1 -0
  52. package/lib/schemas/zod/role.schema.js +33 -0
  53. package/lib/schemas/zod/user.schema.d.ts +225 -0
  54. package/lib/schemas/zod/user.schema.d.ts.map +1 -0
  55. package/lib/schemas/zod/user.schema.js +49 -0
  56. package/lib/services/index.d.ts +5 -0
  57. package/lib/services/index.d.ts.map +1 -0
  58. package/lib/services/index.js +4 -0
  59. package/lib/services/organization.service.d.ts +118 -0
  60. package/lib/services/organization.service.d.ts.map +1 -0
  61. package/lib/services/organization.service.js +50 -0
  62. package/lib/services/permission.service.d.ts +138 -0
  63. package/lib/services/permission.service.d.ts.map +1 -0
  64. package/lib/services/permission.service.js +203 -0
  65. package/lib/services/role.service.d.ts +118 -0
  66. package/lib/services/role.service.d.ts.map +1 -0
  67. package/lib/services/role.service.js +73 -0
  68. package/lib/services/user.service.d.ts +138 -0
  69. package/lib/services/user.service.d.ts.map +1 -0
  70. package/lib/services/user.service.js +126 -0
  71. package/lib/tsconfig.tsbuildinfo +1 -0
  72. package/lib/vitest.config.d.ts +3 -0
  73. package/lib/vitest.config.d.ts.map +1 -0
  74. package/lib/vitest.config.js +7 -0
  75. package/package.json +8 -8
@@ -0,0 +1,118 @@
1
+ import { IdDto } from '@forklaunch/common';
2
+ import {
3
+ RequestDtoMapperConstructor,
4
+ ResponseDtoMapperConstructor
5
+ } from '@forklaunch/core/mappers';
6
+ import {
7
+ MetricsDefinition,
8
+ OpenTelemetryCollector
9
+ } from '@forklaunch/core/http';
10
+ import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
11
+ import { OrganizationService } from '@forklaunch/interfaces-iam/interfaces';
12
+ import {
13
+ CreateOrganizationDto,
14
+ OrganizationDto,
15
+ UpdateOrganizationDto
16
+ } from '@forklaunch/interfaces-iam/types';
17
+ import { AnySchemaValidator } from '@forklaunch/validator';
18
+ import { EntityManager } from '@mikro-orm/core';
19
+ export declare class BaseOrganizationService<
20
+ SchemaValidator extends AnySchemaValidator,
21
+ OrganizationStatus,
22
+ Metrics extends MetricsDefinition = MetricsDefinition,
23
+ Dto extends {
24
+ OrganizationDtoMapper: OrganizationDto<OrganizationStatus>;
25
+ CreateOrganizationDtoMapper: CreateOrganizationDto;
26
+ UpdateOrganizationDtoMapper: UpdateOrganizationDto;
27
+ } = {
28
+ OrganizationDtoMapper: OrganizationDto<OrganizationStatus>;
29
+ CreateOrganizationDtoMapper: CreateOrganizationDto;
30
+ UpdateOrganizationDtoMapper: UpdateOrganizationDto;
31
+ },
32
+ Entities extends {
33
+ OrganizationDtoMapper: MapNestedDtoArraysToCollections<
34
+ OrganizationDto<OrganizationStatus>,
35
+ 'users'
36
+ >;
37
+ CreateOrganizationDtoMapper: MapNestedDtoArraysToCollections<
38
+ OrganizationDto<OrganizationStatus>,
39
+ 'users'
40
+ >;
41
+ UpdateOrganizationDtoMapper: MapNestedDtoArraysToCollections<
42
+ OrganizationDto<OrganizationStatus>,
43
+ 'users'
44
+ >;
45
+ } = {
46
+ OrganizationDtoMapper: MapNestedDtoArraysToCollections<
47
+ OrganizationDto<OrganizationStatus>,
48
+ 'users'
49
+ >;
50
+ CreateOrganizationDtoMapper: MapNestedDtoArraysToCollections<
51
+ OrganizationDto<OrganizationStatus>,
52
+ 'users'
53
+ >;
54
+ UpdateOrganizationDtoMapper: MapNestedDtoArraysToCollections<
55
+ OrganizationDto<OrganizationStatus>,
56
+ 'users'
57
+ >;
58
+ }
59
+ > implements OrganizationService<OrganizationStatus>
60
+ {
61
+ #private;
62
+ em: EntityManager;
63
+ protected openTelemetryCollector: OpenTelemetryCollector<Metrics>;
64
+ protected schemaValidator: SchemaValidator;
65
+ protected mapperss: {
66
+ OrganizationDtoMapper: ResponseDtoMapperConstructor<
67
+ SchemaValidator,
68
+ Dto['OrganizationDtoMapper'],
69
+ Entities['OrganizationDtoMapper']
70
+ >;
71
+ CreateOrganizationDtoMapper: RequestDtoMapperConstructor<
72
+ SchemaValidator,
73
+ Dto['CreateOrganizationDtoMapper'],
74
+ Entities['CreateOrganizationDtoMapper']
75
+ >;
76
+ UpdateOrganizationDtoMapper: RequestDtoMapperConstructor<
77
+ SchemaValidator,
78
+ Dto['UpdateOrganizationDtoMapper'],
79
+ Entities['UpdateOrganizationDtoMapper']
80
+ >;
81
+ };
82
+ constructor(
83
+ em: EntityManager,
84
+ openTelemetryCollector: OpenTelemetryCollector<Metrics>,
85
+ schemaValidator: SchemaValidator,
86
+ mapperss: {
87
+ OrganizationDtoMapper: ResponseDtoMapperConstructor<
88
+ SchemaValidator,
89
+ Dto['OrganizationDtoMapper'],
90
+ Entities['OrganizationDtoMapper']
91
+ >;
92
+ CreateOrganizationDtoMapper: RequestDtoMapperConstructor<
93
+ SchemaValidator,
94
+ Dto['CreateOrganizationDtoMapper'],
95
+ Entities['CreateOrganizationDtoMapper']
96
+ >;
97
+ UpdateOrganizationDtoMapper: RequestDtoMapperConstructor<
98
+ SchemaValidator,
99
+ Dto['UpdateOrganizationDtoMapper'],
100
+ Entities['UpdateOrganizationDtoMapper']
101
+ >;
102
+ }
103
+ );
104
+ createOrganization(
105
+ organizationDto: Dto['CreateOrganizationDtoMapper'],
106
+ em?: EntityManager
107
+ ): Promise<Dto['OrganizationDtoMapper']>;
108
+ getOrganization(
109
+ idDto: IdDto,
110
+ em?: EntityManager
111
+ ): Promise<Dto['OrganizationDtoMapper']>;
112
+ updateOrganization(
113
+ organizationDto: Dto['UpdateOrganizationDtoMapper'],
114
+ em?: EntityManager
115
+ ): Promise<Dto['OrganizationDtoMapper']>;
116
+ deleteOrganization(idDto: IdDto, em?: EntityManager): Promise<void>;
117
+ }
118
+ //# sourceMappingURL=organization.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization.service.d.ts","sourceRoot":"","sources":["../../services/organization.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/mappers';
2
+ export class BaseOrganizationService {
3
+ em;
4
+ openTelemetryCollector;
5
+ schemaValidator;
6
+ mapperss;
7
+ #mapperss;
8
+ constructor(em, openTelemetryCollector, schemaValidator, mapperss) {
9
+ this.em = em;
10
+ this.openTelemetryCollector = openTelemetryCollector;
11
+ this.schemaValidator = schemaValidator;
12
+ this.mapperss = mapperss;
13
+ this.#mapperss = transformIntoInternalDtoMapper(mapperss, schemaValidator);
14
+ }
15
+ async createOrganization(organizationDto, em) {
16
+ this.openTelemetryCollector.log('info', 'Creating organization');
17
+ const organization =
18
+ this.#mapperss.CreateOrganizationDtoMapper.deserializeDtoToEntity(
19
+ organizationDto
20
+ );
21
+ await (em ?? this.em).transactional(async (innerEm) => {
22
+ await innerEm.persist(organization);
23
+ });
24
+ return this.#mapperss.OrganizationDtoMapper.serializeEntityToDto(
25
+ organization
26
+ );
27
+ }
28
+ async getOrganization(idDto, em) {
29
+ const organization = await (em ?? this.em).findOneOrFail(
30
+ 'Organization',
31
+ idDto
32
+ );
33
+ return this.#mapperss.OrganizationDtoMapper.serializeEntityToDto(
34
+ organization
35
+ );
36
+ }
37
+ async updateOrganization(organizationDto, em) {
38
+ const updatedOrganization =
39
+ this.#mapperss.UpdateOrganizationDtoMapper.deserializeDtoToEntity(
40
+ organizationDto
41
+ );
42
+ await (em ?? this.em).upsert(updatedOrganization);
43
+ return this.#mapperss.OrganizationDtoMapper.serializeEntityToDto(
44
+ updatedOrganization
45
+ );
46
+ }
47
+ async deleteOrganization(idDto, em) {
48
+ await (em ?? this.em).nativeDelete('Organization', idDto);
49
+ }
50
+ }
@@ -0,0 +1,138 @@
1
+ import {
2
+ PermissionService,
3
+ RoleService
4
+ } from '@forklaunch/interfaces-iam/interfaces';
5
+ import { IdDto, IdsDto } from '@forklaunch/common';
6
+ import {
7
+ RequestDtoMapperConstructor,
8
+ ResponseDtoMapperConstructor
9
+ } from '@forklaunch/core/mappers';
10
+ import {
11
+ MetricsDefinition,
12
+ OpenTelemetryCollector
13
+ } from '@forklaunch/core/http';
14
+ import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
15
+ import {
16
+ CreatePermissionDto,
17
+ PermissionDto,
18
+ RoleDto,
19
+ UpdatePermissionDto
20
+ } from '@forklaunch/interfaces-iam/types';
21
+ import { AnySchemaValidator } from '@forklaunch/validator';
22
+ import { EntityManager } from '@mikro-orm/core';
23
+ export declare class BasePermissionService<
24
+ SchemaValidator extends AnySchemaValidator,
25
+ Metrics extends MetricsDefinition = MetricsDefinition,
26
+ Dto extends {
27
+ PermissionDtoMapper: PermissionDto;
28
+ CreatePermissionDtoMapper: CreatePermissionDto;
29
+ UpdatePermissionDtoMapper: UpdatePermissionDto;
30
+ RoleDtoMapper: RoleDto;
31
+ } = {
32
+ PermissionDtoMapper: PermissionDto;
33
+ CreatePermissionDtoMapper: CreatePermissionDto;
34
+ UpdatePermissionDtoMapper: UpdatePermissionDto;
35
+ RoleDtoMapper: RoleDto;
36
+ },
37
+ Entities extends {
38
+ PermissionDtoMapper: PermissionDto;
39
+ CreatePermissionDtoMapper: PermissionDto;
40
+ UpdatePermissionDtoMapper: PermissionDto;
41
+ RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
42
+ } = {
43
+ PermissionDtoMapper: PermissionDto;
44
+ CreatePermissionDtoMapper: PermissionDto;
45
+ UpdatePermissionDtoMapper: PermissionDto;
46
+ RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
47
+ }
48
+ > implements PermissionService
49
+ {
50
+ #private;
51
+ em: EntityManager;
52
+ protected roleServiceFactory: () => RoleService;
53
+ protected openTelemetryCollector: OpenTelemetryCollector<Metrics>;
54
+ protected schemaValidator: SchemaValidator;
55
+ protected mapperss: {
56
+ PermissionDtoMapper: ResponseDtoMapperConstructor<
57
+ SchemaValidator,
58
+ Dto['PermissionDtoMapper'],
59
+ Entities['PermissionDtoMapper']
60
+ >;
61
+ CreatePermissionDtoMapper: RequestDtoMapperConstructor<
62
+ SchemaValidator,
63
+ Dto['CreatePermissionDtoMapper'],
64
+ Entities['CreatePermissionDtoMapper']
65
+ >;
66
+ UpdatePermissionDtoMapper: RequestDtoMapperConstructor<
67
+ SchemaValidator,
68
+ Dto['UpdatePermissionDtoMapper'],
69
+ Entities['UpdatePermissionDtoMapper']
70
+ >;
71
+ RoleDtoMapper: RequestDtoMapperConstructor<
72
+ SchemaValidator,
73
+ Dto['RoleDtoMapper'],
74
+ Entities['RoleDtoMapper']
75
+ >;
76
+ };
77
+ constructor(
78
+ em: EntityManager,
79
+ roleServiceFactory: () => RoleService,
80
+ openTelemetryCollector: OpenTelemetryCollector<Metrics>,
81
+ schemaValidator: SchemaValidator,
82
+ mapperss: {
83
+ PermissionDtoMapper: ResponseDtoMapperConstructor<
84
+ SchemaValidator,
85
+ Dto['PermissionDtoMapper'],
86
+ Entities['PermissionDtoMapper']
87
+ >;
88
+ CreatePermissionDtoMapper: RequestDtoMapperConstructor<
89
+ SchemaValidator,
90
+ Dto['CreatePermissionDtoMapper'],
91
+ Entities['CreatePermissionDtoMapper']
92
+ >;
93
+ UpdatePermissionDtoMapper: RequestDtoMapperConstructor<
94
+ SchemaValidator,
95
+ Dto['UpdatePermissionDtoMapper'],
96
+ Entities['UpdatePermissionDtoMapper']
97
+ >;
98
+ RoleDtoMapper: RequestDtoMapperConstructor<
99
+ SchemaValidator,
100
+ Dto['RoleDtoMapper'],
101
+ Entities['RoleDtoMapper']
102
+ >;
103
+ }
104
+ );
105
+ private updateRolesWithPermissions;
106
+ private removePermissionsFromRoles;
107
+ private getBatchRoles;
108
+ private createPermissionDto;
109
+ private extractCreatePermissionDtoToEntityData;
110
+ createPermission(
111
+ createPermissionDto: Dto['CreatePermissionDtoMapper'],
112
+ em?: EntityManager
113
+ ): Promise<Dto['PermissionDtoMapper']>;
114
+ createBatchPermissions(
115
+ permissionDtos: Dto['CreatePermissionDtoMapper'][],
116
+ em?: EntityManager
117
+ ): Promise<Dto['PermissionDtoMapper'][]>;
118
+ getPermission(
119
+ idDto: IdDto,
120
+ em?: EntityManager
121
+ ): Promise<Dto['PermissionDtoMapper']>;
122
+ getBatchPermissions(
123
+ idsDto: IdsDto,
124
+ em?: EntityManager
125
+ ): Promise<Dto['PermissionDtoMapper'][]>;
126
+ private updatePermissionDto;
127
+ updatePermission(
128
+ permissionDto: Dto['UpdatePermissionDtoMapper'],
129
+ em?: EntityManager
130
+ ): Promise<Dto['PermissionDtoMapper']>;
131
+ updateBatchPermissions(
132
+ permissionDtos: Dto['UpdatePermissionDtoMapper'][],
133
+ em?: EntityManager
134
+ ): Promise<Dto['PermissionDtoMapper'][]>;
135
+ deletePermission(idDto: IdDto, em?: EntityManager): Promise<void>;
136
+ deleteBatchPermissions(idsDto: IdsDto, em?: EntityManager): Promise<void>;
137
+ }
138
+ //# sourceMappingURL=permission.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../services/permission.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/mappers';
2
+ export class BasePermissionService {
3
+ em;
4
+ roleServiceFactory;
5
+ openTelemetryCollector;
6
+ schemaValidator;
7
+ mapperss;
8
+ #mapperss;
9
+ constructor(
10
+ em,
11
+ roleServiceFactory,
12
+ openTelemetryCollector,
13
+ schemaValidator,
14
+ mapperss
15
+ ) {
16
+ this.em = em;
17
+ this.roleServiceFactory = roleServiceFactory;
18
+ this.openTelemetryCollector = openTelemetryCollector;
19
+ this.schemaValidator = schemaValidator;
20
+ this.mapperss = mapperss;
21
+ this.#mapperss = transformIntoInternalDtoMapper(mapperss, schemaValidator);
22
+ }
23
+ // start: global helper functions
24
+ async updateRolesWithPermissions(roles, permissions) {
25
+ return await Promise.all(
26
+ roles.map(async (role) => {
27
+ permissions.forEach((permission) => role.permissions.add(permission));
28
+ return role;
29
+ })
30
+ );
31
+ }
32
+ async removePermissionsFromRoles(roles, permissions) {
33
+ return await Promise.all(
34
+ roles.map(async (role) => {
35
+ permissions.forEach((permission) =>
36
+ role.permissions.remove(permission)
37
+ );
38
+ return role;
39
+ })
40
+ );
41
+ }
42
+ async getBatchRoles(roleIds, em) {
43
+ return roleIds
44
+ ? (await this.roleServiceFactory().getBatchRoles(roleIds, em)).map(
45
+ (role) => {
46
+ return (em ?? this.em).merge(
47
+ this.#mapperss.RoleDtoMapper.deserializeDtoToEntity(role)
48
+ );
49
+ }
50
+ )
51
+ : [];
52
+ }
53
+ // end: global helper functions
54
+ // start: createPermission helper functions
55
+ async createPermissionDto({ permission, addToRoles }) {
56
+ let roles = [];
57
+ if (addToRoles) {
58
+ roles = await this.updateRolesWithPermissions(addToRoles, [permission]);
59
+ }
60
+ return { permission, roles };
61
+ }
62
+ async extractCreatePermissionDtoToEntityData(permissionDto, em) {
63
+ return {
64
+ permission: (em ?? this.em).merge(
65
+ this.#mapperss.CreatePermissionDtoMapper.deserializeDtoToEntity(
66
+ permissionDto
67
+ )
68
+ ),
69
+ addToRoles: permissionDto.addToRolesIds
70
+ ? await this.getBatchRoles({ ids: permissionDto.addToRolesIds }, em)
71
+ : []
72
+ };
73
+ }
74
+ // end: createPermission helper functions
75
+ async createPermission(createPermissionDto, em) {
76
+ const { permission, roles } = await this.createPermissionDto(
77
+ await this.extractCreatePermissionDtoToEntityData(createPermissionDto, em)
78
+ );
79
+ await (em ?? this.em).transactional(async (innerEm) => {
80
+ await innerEm.persist([permission, ...roles]);
81
+ });
82
+ return this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission);
83
+ }
84
+ async createBatchPermissions(permissionDtos, em) {
85
+ const rolesCache = {};
86
+ const permissions = [];
87
+ await (em ?? this.em).transactional(async (em) => {
88
+ permissionDtos.map(async (createPermissionDto) => {
89
+ const { permission, roles } = await this.createPermissionDto(
90
+ await this.extractCreatePermissionDtoToEntityData(
91
+ createPermissionDto,
92
+ em
93
+ )
94
+ );
95
+ roles.forEach((role) => {
96
+ if (
97
+ rolesCache[role.id] &&
98
+ role.permissions !== rolesCache[role.id].permissions
99
+ ) {
100
+ role.permissions.getItems().forEach((permission) => {
101
+ if (!rolesCache[role.id].permissions.contains(permission)) {
102
+ rolesCache[role.id].permissions.add(permission);
103
+ }
104
+ });
105
+ } else {
106
+ rolesCache[role.id] = role;
107
+ }
108
+ });
109
+ permissions.push(permission);
110
+ });
111
+ await (em ?? this.em).persist([
112
+ ...permissions,
113
+ ...Object.values(rolesCache)
114
+ ]);
115
+ });
116
+ return permissions.map((permission) =>
117
+ this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission)
118
+ );
119
+ }
120
+ async getPermission(idDto, em) {
121
+ const permission = await (em ?? this.em).findOneOrFail('Permission', idDto);
122
+ return this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission);
123
+ }
124
+ async getBatchPermissions(idsDto, em) {
125
+ return (await (em ?? this.em).find('Permission', idsDto)).map(
126
+ (permission) =>
127
+ this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission)
128
+ );
129
+ }
130
+ // start: updatePermission helper functions
131
+ updatePermissionDto = async (permissionDto, em) => {
132
+ const permission =
133
+ this.#mapperss.UpdatePermissionDtoMapper.deserializeDtoToEntity(
134
+ permissionDto
135
+ );
136
+ const addToRoles = permissionDto.addToRolesIds
137
+ ? await this.getBatchRoles({ ids: permissionDto.addToRolesIds }, em)
138
+ : [];
139
+ const removeFromRoles = permissionDto.removeFromRolesIds
140
+ ? await this.getBatchRoles({ ids: permissionDto.removeFromRolesIds }, em)
141
+ : [];
142
+ let roles = [];
143
+ roles = roles.concat(
144
+ await this.updateRolesWithPermissions(addToRoles, [permission])
145
+ );
146
+ roles = roles.concat(
147
+ await this.removePermissionsFromRoles(removeFromRoles, [permission])
148
+ );
149
+ return {
150
+ permission,
151
+ roles
152
+ };
153
+ };
154
+ // end: updatePermission helper functions
155
+ async updatePermission(permissionDto, em) {
156
+ const { permission, roles } = await this.updatePermissionDto(permissionDto);
157
+ await (em ?? this.em).upsertMany([permission, ...roles]);
158
+ if (!em) {
159
+ this.em.flush();
160
+ }
161
+ return this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission);
162
+ }
163
+ async updateBatchPermissions(permissionDtos, em) {
164
+ const rolesCache = {};
165
+ const permissions = [];
166
+ await (em ?? this.em).transactional(async (em) => {
167
+ permissionDtos.map(async (updatePermissionDto) => {
168
+ const { permission, roles } =
169
+ await this.updatePermissionDto(updatePermissionDto);
170
+ roles.forEach((role) => {
171
+ if (
172
+ rolesCache[role.id] &&
173
+ role.permissions !== rolesCache[role.id].permissions
174
+ ) {
175
+ role.permissions.getItems().forEach((permission) => {
176
+ if (!rolesCache[role.id].permissions.contains(permission)) {
177
+ rolesCache[role.id].permissions.add(permission);
178
+ }
179
+ });
180
+ } else {
181
+ rolesCache[role.id] = role;
182
+ }
183
+ });
184
+ permissions.push(permission);
185
+ });
186
+ await (em ?? this.em).persist([
187
+ ...permissions,
188
+ ...Object.values(rolesCache)
189
+ ]);
190
+ });
191
+ return permissions.map((permission) =>
192
+ this.#mapperss.PermissionDtoMapper.serializeEntityToDto(permission)
193
+ );
194
+ }
195
+ async deletePermission(idDto, em) {
196
+ await (em ?? this.em).nativeDelete('Permission', idDto);
197
+ }
198
+ async deleteBatchPermissions(idsDto, em) {
199
+ await (em ?? this.em).nativeDelete('Permission', {
200
+ id: { $in: idsDto.ids }
201
+ });
202
+ }
203
+ }
@@ -0,0 +1,118 @@
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
+ import { IdDto, IdsDto } from '@forklaunch/common';
8
+ import {
9
+ RequestDtoMapperConstructor,
10
+ ResponseDtoMapperConstructor
11
+ } from '@forklaunch/core/mappers';
12
+ import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
13
+ import {
14
+ CreateRoleDto,
15
+ RoleDto,
16
+ UpdateRoleDto
17
+ } from '@forklaunch/interfaces-iam/types';
18
+ import { AnySchemaValidator } from '@forklaunch/validator';
19
+ export declare class BaseRoleService<
20
+ SchemaValidator extends AnySchemaValidator,
21
+ Metrics extends MetricsDefinition = MetricsDefinition,
22
+ Dto extends {
23
+ RoleDtoMapper: RoleDto;
24
+ CreateRoleDtoMapper: CreateRoleDto;
25
+ UpdateRoleDtoMapper: UpdateRoleDto;
26
+ } = {
27
+ RoleDtoMapper: RoleDto;
28
+ CreateRoleDtoMapper: CreateRoleDto;
29
+ UpdateRoleDtoMapper: UpdateRoleDto;
30
+ },
31
+ Entities extends {
32
+ RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
33
+ CreateRoleDtoMapper: MapNestedDtoArraysToCollections<
34
+ RoleDto,
35
+ 'permissions'
36
+ >;
37
+ UpdateRoleDtoMapper: MapNestedDtoArraysToCollections<
38
+ RoleDto,
39
+ 'permissions'
40
+ >;
41
+ } = {
42
+ RoleDtoMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
43
+ CreateRoleDtoMapper: MapNestedDtoArraysToCollections<
44
+ RoleDto,
45
+ 'permissions'
46
+ >;
47
+ UpdateRoleDtoMapper: MapNestedDtoArraysToCollections<
48
+ RoleDto,
49
+ 'permissions'
50
+ >;
51
+ }
52
+ > implements RoleService
53
+ {
54
+ #private;
55
+ em: EntityManager;
56
+ protected openTelemetryCollector: OpenTelemetryCollector<Metrics>;
57
+ protected schemaValidator: SchemaValidator;
58
+ protected mapperss: {
59
+ RoleDtoMapper: ResponseDtoMapperConstructor<
60
+ SchemaValidator,
61
+ Dto['RoleDtoMapper'],
62
+ Entities['RoleDtoMapper']
63
+ >;
64
+ CreateRoleDtoMapper: RequestDtoMapperConstructor<
65
+ SchemaValidator,
66
+ Dto['CreateRoleDtoMapper'],
67
+ Entities['CreateRoleDtoMapper']
68
+ >;
69
+ UpdateRoleDtoMapper: RequestDtoMapperConstructor<
70
+ SchemaValidator,
71
+ Dto['UpdateRoleDtoMapper'],
72
+ Entities['UpdateRoleDtoMapper']
73
+ >;
74
+ };
75
+ constructor(
76
+ em: EntityManager,
77
+ openTelemetryCollector: OpenTelemetryCollector<Metrics>,
78
+ schemaValidator: SchemaValidator,
79
+ mapperss: {
80
+ RoleDtoMapper: ResponseDtoMapperConstructor<
81
+ SchemaValidator,
82
+ Dto['RoleDtoMapper'],
83
+ Entities['RoleDtoMapper']
84
+ >;
85
+ CreateRoleDtoMapper: RequestDtoMapperConstructor<
86
+ SchemaValidator,
87
+ Dto['CreateRoleDtoMapper'],
88
+ Entities['CreateRoleDtoMapper']
89
+ >;
90
+ UpdateRoleDtoMapper: RequestDtoMapperConstructor<
91
+ SchemaValidator,
92
+ Dto['UpdateRoleDtoMapper'],
93
+ Entities['UpdateRoleDtoMapper']
94
+ >;
95
+ }
96
+ );
97
+ createRole(
98
+ roleDto: Dto['CreateRoleDtoMapper'],
99
+ em?: EntityManager
100
+ ): Promise<Dto['RoleDtoMapper']>;
101
+ createBatchRoles(
102
+ roleDtos: Dto['CreateRoleDtoMapper'][],
103
+ em?: EntityManager
104
+ ): Promise<Dto['RoleDtoMapper'][]>;
105
+ getRole(idDto: IdDto, em?: EntityManager): Promise<RoleDto>;
106
+ getBatchRoles(idsDto: IdsDto, em?: EntityManager): Promise<RoleDto[]>;
107
+ updateRole(
108
+ roleDto: Dto['UpdateRoleDtoMapper'],
109
+ em?: EntityManager
110
+ ): Promise<Dto['RoleDtoMapper']>;
111
+ updateBatchRoles(
112
+ roleDtos: Dto['UpdateRoleDtoMapper'][],
113
+ em?: EntityManager
114
+ ): Promise<Dto['RoleDtoMapper'][]>;
115
+ deleteRole(idDto: IdDto, em?: EntityManager): Promise<void>;
116
+ deleteBatchRoles(idsDto: IdsDto, em?: EntityManager): Promise<void>;
117
+ }
118
+ //# sourceMappingURL=role.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.service.d.ts","sourceRoot":"","sources":["../../services/role.service.ts"],"names":[],"mappings":"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"}