@forklaunch/implementation-iam-base 0.3.0 → 0.3.2
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/lib/eject/domain/schemas/organization.schema.ts +3 -3
- package/lib/eject/domain/schemas/permission.schema.ts +3 -3
- package/lib/eject/domain/schemas/role.schema.ts +3 -3
- package/lib/eject/domain/schemas/user.schema.ts +3 -3
- package/lib/eject/services/organization.service.ts +41 -77
- package/lib/eject/services/permission.service.ts +80 -104
- package/lib/eject/services/role.service.ts +51 -81
- package/lib/eject/services/user.service.ts +51 -74
- package/lib/eject/types/iamDto.types.ts +43 -0
- package/lib/eject/types/iamEntities.types.ts +49 -0
- package/lib/schemas/index.d.mts +61 -61
- package/lib/schemas/index.d.ts +61 -61
- package/lib/schemas/index.js +32 -32
- package/lib/schemas/index.mjs +28 -28
- package/lib/services/index.d.mts +110 -134
- package/lib/services/index.d.ts +110 -134
- package/lib/services/index.js +46 -54
- package/lib/services/index.mjs +50 -58
- package/package.json +15 -12
|
@@ -11,50 +11,26 @@ import {
|
|
|
11
11
|
OpenTelemetryCollector,
|
|
12
12
|
TelemetryOptions
|
|
13
13
|
} from '@forklaunch/core/http';
|
|
14
|
+
import { UpdateUserDto } from '@forklaunch/interfaces-iam/types';
|
|
14
15
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} from '@forklaunch/
|
|
20
|
-
import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
|
|
21
|
-
import {
|
|
22
|
-
CreateUserDto,
|
|
23
|
-
UpdateUserDto,
|
|
24
|
-
UserDto
|
|
25
|
-
} from '@forklaunch/interfaces-iam/types';
|
|
16
|
+
InternalMapper,
|
|
17
|
+
RequestMapperConstructor,
|
|
18
|
+
ResponseMapperConstructor,
|
|
19
|
+
transformIntoInternalMapper
|
|
20
|
+
} from '@forklaunch/internal';
|
|
26
21
|
import { AnySchemaValidator } from '@forklaunch/validator';
|
|
27
22
|
import { EntityManager } from '@mikro-orm/core';
|
|
23
|
+
import { UserDtos } from '../types/iamDto.types';
|
|
24
|
+
import { UserEntities } from '../types/iamEntities.types';
|
|
28
25
|
|
|
29
26
|
export class BaseUserService<
|
|
30
27
|
SchemaValidator extends AnySchemaValidator,
|
|
31
28
|
OrganizationStatus,
|
|
32
|
-
|
|
33
|
-
Dto extends
|
|
34
|
-
UserDtoMapper: UserDto;
|
|
35
|
-
CreateUserDtoMapper: CreateUserDto;
|
|
36
|
-
UpdateUserDtoMapper: UpdateUserDto;
|
|
37
|
-
} = {
|
|
38
|
-
UserDtoMapper: UserDto;
|
|
39
|
-
CreateUserDtoMapper: CreateUserDto;
|
|
40
|
-
UpdateUserDtoMapper: UpdateUserDto;
|
|
41
|
-
},
|
|
42
|
-
Entities extends {
|
|
43
|
-
UserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
44
|
-
CreateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
45
|
-
UpdateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
46
|
-
} = {
|
|
47
|
-
UserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
48
|
-
CreateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
49
|
-
UpdateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
50
|
-
}
|
|
29
|
+
Entities extends UserEntities,
|
|
30
|
+
Dto extends UserDtos = UserDtos
|
|
51
31
|
> implements UserService
|
|
52
32
|
{
|
|
53
|
-
|
|
54
|
-
InstanceTypeRecord<typeof this.mappers>,
|
|
55
|
-
Entities,
|
|
56
|
-
Dto
|
|
57
|
-
>;
|
|
33
|
+
protected _mappers: InternalMapper<InstanceTypeRecord<typeof this.mappers>>;
|
|
58
34
|
private evaluatedTelemetryOptions: {
|
|
59
35
|
logging?: boolean;
|
|
60
36
|
metrics?: boolean;
|
|
@@ -66,30 +42,38 @@ export class BaseUserService<
|
|
|
66
42
|
protected passwordEncryptionPublicKeyPath: string,
|
|
67
43
|
protected roleServiceFactory: () => RoleService,
|
|
68
44
|
protected organizationServiceFactory: () => OrganizationService<OrganizationStatus>,
|
|
69
|
-
protected openTelemetryCollector: OpenTelemetryCollector<
|
|
45
|
+
protected openTelemetryCollector: OpenTelemetryCollector<MetricsDefinition>,
|
|
70
46
|
protected schemaValidator: SchemaValidator,
|
|
71
47
|
protected mappers: {
|
|
72
|
-
|
|
48
|
+
UserMapper: ResponseMapperConstructor<
|
|
73
49
|
SchemaValidator,
|
|
74
|
-
Dto['
|
|
75
|
-
Entities['
|
|
50
|
+
Dto['UserMapper'],
|
|
51
|
+
Entities['UserMapper']
|
|
76
52
|
>;
|
|
77
|
-
|
|
53
|
+
CreateUserMapper: RequestMapperConstructor<
|
|
78
54
|
SchemaValidator,
|
|
79
|
-
Dto['
|
|
80
|
-
Entities['
|
|
55
|
+
Dto['CreateUserMapper'],
|
|
56
|
+
Entities['CreateUserMapper'],
|
|
57
|
+
(
|
|
58
|
+
dto: Dto['CreateUserMapper'],
|
|
59
|
+
em: EntityManager
|
|
60
|
+
) => Promise<Entities['CreateUserMapper']>
|
|
81
61
|
>;
|
|
82
|
-
|
|
62
|
+
UpdateUserMapper: RequestMapperConstructor<
|
|
83
63
|
SchemaValidator,
|
|
84
|
-
Dto['
|
|
85
|
-
Entities['
|
|
64
|
+
Dto['UpdateUserMapper'],
|
|
65
|
+
Entities['UpdateUserMapper'],
|
|
66
|
+
(
|
|
67
|
+
dto: Dto['UpdateUserMapper'],
|
|
68
|
+
em: EntityManager
|
|
69
|
+
) => Promise<Entities['UpdateUserMapper']>
|
|
86
70
|
>;
|
|
87
71
|
},
|
|
88
72
|
readonly options?: {
|
|
89
73
|
telemetry?: TelemetryOptions;
|
|
90
74
|
}
|
|
91
75
|
) {
|
|
92
|
-
this
|
|
76
|
+
this._mappers = transformIntoInternalMapper(mappers, schemaValidator);
|
|
93
77
|
this.evaluatedTelemetryOptions = options?.telemetry
|
|
94
78
|
? evaluateTelemetryOptions(options.telemetry).enabled
|
|
95
79
|
: {
|
|
@@ -100,14 +84,14 @@ export class BaseUserService<
|
|
|
100
84
|
}
|
|
101
85
|
|
|
102
86
|
async createUser(
|
|
103
|
-
userDto: Dto['
|
|
87
|
+
userDto: Dto['CreateUserMapper'],
|
|
104
88
|
em?: EntityManager
|
|
105
|
-
): Promise<Dto['
|
|
89
|
+
): Promise<Dto['UserMapper']> {
|
|
106
90
|
if (this.evaluatedTelemetryOptions.logging) {
|
|
107
91
|
this.openTelemetryCollector.info('Creating user', userDto);
|
|
108
92
|
}
|
|
109
93
|
|
|
110
|
-
const user = await this
|
|
94
|
+
const user = await this._mappers.CreateUserMapper.deserializeDtoToEntity(
|
|
111
95
|
userDto,
|
|
112
96
|
em ?? this.em
|
|
113
97
|
);
|
|
@@ -118,20 +102,20 @@ export class BaseUserService<
|
|
|
118
102
|
await this.em.persistAndFlush(user);
|
|
119
103
|
}
|
|
120
104
|
|
|
121
|
-
return this
|
|
105
|
+
return this._mappers.UserMapper.serializeEntityToDto(user);
|
|
122
106
|
}
|
|
123
107
|
|
|
124
108
|
async createBatchUsers(
|
|
125
|
-
userDtos: Dto['
|
|
109
|
+
userDtos: Dto['CreateUserMapper'][],
|
|
126
110
|
em?: EntityManager
|
|
127
|
-
): Promise<Dto['
|
|
111
|
+
): Promise<Dto['UserMapper'][]> {
|
|
128
112
|
if (this.evaluatedTelemetryOptions.logging) {
|
|
129
113
|
this.openTelemetryCollector.info('Creating batch users', userDtos);
|
|
130
114
|
}
|
|
131
115
|
|
|
132
116
|
const users = await Promise.all(
|
|
133
117
|
userDtos.map(async (createUserDto) =>
|
|
134
|
-
this
|
|
118
|
+
this._mappers.CreateUserMapper.deserializeDtoToEntity(
|
|
135
119
|
createUserDto,
|
|
136
120
|
em ?? this.em
|
|
137
121
|
)
|
|
@@ -145,16 +129,11 @@ export class BaseUserService<
|
|
|
145
129
|
}
|
|
146
130
|
|
|
147
131
|
return Promise.all(
|
|
148
|
-
users.map((user) =>
|
|
149
|
-
this.#mappers.UserDtoMapper.serializeEntityToDto(user)
|
|
150
|
-
)
|
|
132
|
+
users.map((user) => this._mappers.UserMapper.serializeEntityToDto(user))
|
|
151
133
|
);
|
|
152
134
|
}
|
|
153
135
|
|
|
154
|
-
async getUser(
|
|
155
|
-
idDto: IdDto,
|
|
156
|
-
em?: EntityManager
|
|
157
|
-
): Promise<Dto['UserDtoMapper']> {
|
|
136
|
+
async getUser(idDto: IdDto, em?: EntityManager): Promise<Dto['UserMapper']> {
|
|
158
137
|
if (this.evaluatedTelemetryOptions.logging) {
|
|
159
138
|
this.openTelemetryCollector.info('Getting user', idDto);
|
|
160
139
|
}
|
|
@@ -163,15 +142,15 @@ export class BaseUserService<
|
|
|
163
142
|
populate: ['id', '*']
|
|
164
143
|
});
|
|
165
144
|
|
|
166
|
-
return this
|
|
167
|
-
user as Entities['
|
|
145
|
+
return this._mappers.UserMapper.serializeEntityToDto(
|
|
146
|
+
user as Entities['UserMapper']
|
|
168
147
|
);
|
|
169
148
|
}
|
|
170
149
|
|
|
171
150
|
async getBatchUsers(
|
|
172
151
|
idsDto: IdsDto,
|
|
173
152
|
em?: EntityManager
|
|
174
|
-
): Promise<Dto['
|
|
153
|
+
): Promise<Dto['UserMapper'][]> {
|
|
175
154
|
if (this.evaluatedTelemetryOptions.logging) {
|
|
176
155
|
this.openTelemetryCollector.info('Getting batch users', idsDto);
|
|
177
156
|
}
|
|
@@ -182,22 +161,22 @@ export class BaseUserService<
|
|
|
182
161
|
populate: ['id', '*']
|
|
183
162
|
})
|
|
184
163
|
).map((user) =>
|
|
185
|
-
this
|
|
186
|
-
user as Entities['
|
|
164
|
+
this._mappers.UserMapper.serializeEntityToDto(
|
|
165
|
+
user as Entities['UserMapper']
|
|
187
166
|
)
|
|
188
167
|
)
|
|
189
168
|
);
|
|
190
169
|
}
|
|
191
170
|
|
|
192
171
|
async updateUser(
|
|
193
|
-
userDto: Dto['
|
|
172
|
+
userDto: Dto['UpdateUserMapper'],
|
|
194
173
|
em?: EntityManager
|
|
195
|
-
): Promise<Dto['
|
|
174
|
+
): Promise<Dto['UserMapper']> {
|
|
196
175
|
if (this.evaluatedTelemetryOptions.logging) {
|
|
197
176
|
this.openTelemetryCollector.info('Updating user', userDto);
|
|
198
177
|
}
|
|
199
178
|
|
|
200
|
-
const user = await this
|
|
179
|
+
const user = await this._mappers.UpdateUserMapper.deserializeDtoToEntity(
|
|
201
180
|
userDto,
|
|
202
181
|
em ?? this.em
|
|
203
182
|
);
|
|
@@ -208,20 +187,20 @@ export class BaseUserService<
|
|
|
208
187
|
await this.em.persistAndFlush(user);
|
|
209
188
|
}
|
|
210
189
|
|
|
211
|
-
return this
|
|
190
|
+
return this._mappers.UserMapper.serializeEntityToDto(user);
|
|
212
191
|
}
|
|
213
192
|
|
|
214
193
|
async updateBatchUsers(
|
|
215
194
|
userDtos: UpdateUserDto[],
|
|
216
195
|
em?: EntityManager
|
|
217
|
-
): Promise<Dto['
|
|
196
|
+
): Promise<Dto['UserMapper'][]> {
|
|
218
197
|
if (this.evaluatedTelemetryOptions.logging) {
|
|
219
198
|
this.openTelemetryCollector.info('Updating batch users', userDtos);
|
|
220
199
|
}
|
|
221
200
|
|
|
222
201
|
const users = await Promise.all(
|
|
223
202
|
userDtos.map(async (updateUserDto) =>
|
|
224
|
-
this
|
|
203
|
+
this._mappers.UpdateUserMapper.deserializeDtoToEntity(
|
|
225
204
|
updateUserDto,
|
|
226
205
|
em ?? this.em
|
|
227
206
|
)
|
|
@@ -235,9 +214,7 @@ export class BaseUserService<
|
|
|
235
214
|
}
|
|
236
215
|
|
|
237
216
|
return Promise.all(
|
|
238
|
-
users.map((user) =>
|
|
239
|
-
this.#mappers.UserDtoMapper.serializeEntityToDto(user)
|
|
240
|
-
)
|
|
217
|
+
users.map((user) => this._mappers.UserMapper.serializeEntityToDto(user))
|
|
241
218
|
);
|
|
242
219
|
}
|
|
243
220
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreateOrganizationDto,
|
|
3
|
+
CreatePermissionDto,
|
|
4
|
+
CreateRoleDto,
|
|
5
|
+
CreateUserDto,
|
|
6
|
+
OrganizationDto,
|
|
7
|
+
PermissionDto,
|
|
8
|
+
RoleDto,
|
|
9
|
+
UpdateOrganizationDto,
|
|
10
|
+
UpdatePermissionDto,
|
|
11
|
+
UpdateRoleDto,
|
|
12
|
+
UpdateUserDto,
|
|
13
|
+
UserDto
|
|
14
|
+
} from '@forklaunch/interfaces-iam/types';
|
|
15
|
+
|
|
16
|
+
// organization
|
|
17
|
+
export type OrganizationDtos<OrganizationStatus> = {
|
|
18
|
+
OrganizationMapper: OrganizationDto<OrganizationStatus>;
|
|
19
|
+
CreateOrganizationMapper: CreateOrganizationDto;
|
|
20
|
+
UpdateOrganizationMapper: UpdateOrganizationDto;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// permission
|
|
24
|
+
export type PermissionDtos = {
|
|
25
|
+
PermissionMapper: PermissionDto;
|
|
26
|
+
CreatePermissionMapper: CreatePermissionDto;
|
|
27
|
+
UpdatePermissionMapper: UpdatePermissionDto;
|
|
28
|
+
RoleEntityMapper: UpdateRoleDto;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// role
|
|
32
|
+
export type RoleDtos = {
|
|
33
|
+
RoleMapper: RoleDto;
|
|
34
|
+
CreateRoleMapper: CreateRoleDto;
|
|
35
|
+
UpdateRoleMapper: UpdateRoleDto;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// user
|
|
39
|
+
export type UserDtos = {
|
|
40
|
+
UserMapper: UserDto;
|
|
41
|
+
CreateUserMapper: CreateUserDto;
|
|
42
|
+
UpdateUserMapper: UpdateUserDto;
|
|
43
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
|
|
2
|
+
import {
|
|
3
|
+
OrganizationDto,
|
|
4
|
+
PermissionDto,
|
|
5
|
+
RoleDto,
|
|
6
|
+
UpdateRoleDto,
|
|
7
|
+
UserDto
|
|
8
|
+
} from '@forklaunch/interfaces-iam/types';
|
|
9
|
+
|
|
10
|
+
// organization
|
|
11
|
+
export type OrganizationEntities<OrganizationStatus> = {
|
|
12
|
+
OrganizationMapper: MapNestedDtoArraysToCollections<
|
|
13
|
+
OrganizationDto<OrganizationStatus>,
|
|
14
|
+
'users'
|
|
15
|
+
>;
|
|
16
|
+
CreateOrganizationMapper: MapNestedDtoArraysToCollections<
|
|
17
|
+
OrganizationDto<OrganizationStatus>,
|
|
18
|
+
'users'
|
|
19
|
+
>;
|
|
20
|
+
UpdateOrganizationMapper: MapNestedDtoArraysToCollections<
|
|
21
|
+
OrganizationDto<OrganizationStatus>,
|
|
22
|
+
'users'
|
|
23
|
+
>;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// permission
|
|
27
|
+
export type PermissionEntities = {
|
|
28
|
+
PermissionMapper: PermissionDto;
|
|
29
|
+
CreatePermissionMapper: PermissionDto;
|
|
30
|
+
UpdatePermissionMapper: PermissionDto;
|
|
31
|
+
RoleEntityMapper: MapNestedDtoArraysToCollections<
|
|
32
|
+
UpdateRoleDto,
|
|
33
|
+
'permissions'
|
|
34
|
+
>;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// role
|
|
38
|
+
export type RoleEntities = {
|
|
39
|
+
RoleMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
|
|
40
|
+
CreateRoleMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
|
|
41
|
+
UpdateRoleMapper: MapNestedDtoArraysToCollections<RoleDto, 'permissions'>;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// user
|
|
45
|
+
export type UserEntities = {
|
|
46
|
+
UserMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
47
|
+
CreateUserMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
48
|
+
UpdateUserMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
|
|
49
|
+
};
|