@forklaunch/implementation-iam-base 0.1.12 → 0.1.13

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 +183 -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 +200 -0
  21. package/lib/schemas/organization.schema.d.ts.map +1 -0
  22. package/lib/schemas/organization.schema.js +4 -0
  23. package/lib/schemas/permission.schema.d.ts +50 -0
  24. package/lib/schemas/permission.schema.d.ts.map +1 -0
  25. package/lib/schemas/permission.schema.js +4 -0
  26. package/lib/schemas/role.schema.d.ts +74 -0
  27. package/lib/schemas/role.schema.d.ts.map +1 -0
  28. package/lib/schemas/role.schema.js +4 -0
  29. package/lib/schemas/typebox/organization.schema.d.ts +112 -0
  30. package/lib/schemas/typebox/organization.schema.d.ts.map +1 -0
  31. package/lib/schemas/typebox/organization.schema.js +34 -0
  32. package/lib/schemas/typebox/permission.schema.d.ts +47 -0
  33. package/lib/schemas/typebox/permission.schema.d.ts.map +1 -0
  34. package/lib/schemas/typebox/permission.schema.js +25 -0
  35. package/lib/schemas/typebox/role.schema.d.ts +59 -0
  36. package/lib/schemas/typebox/role.schema.d.ts.map +1 -0
  37. package/lib/schemas/typebox/role.schema.js +26 -0
  38. package/lib/schemas/typebox/user.schema.d.ts +103 -0
  39. package/lib/schemas/typebox/user.schema.d.ts.map +1 -0
  40. package/lib/schemas/typebox/user.schema.js +41 -0
  41. package/lib/schemas/user.schema.d.ts +144 -0
  42. package/lib/schemas/user.schema.d.ts.map +1 -0
  43. package/lib/schemas/user.schema.js +4 -0
  44. package/lib/schemas/zod/organization.schema.d.ts +284 -0
  45. package/lib/schemas/zod/organization.schema.d.ts.map +1 -0
  46. package/lib/schemas/zod/organization.schema.js +34 -0
  47. package/lib/schemas/zod/permission.schema.d.ts +47 -0
  48. package/lib/schemas/zod/permission.schema.d.ts.map +1 -0
  49. package/lib/schemas/zod/permission.schema.js +25 -0
  50. package/lib/schemas/zod/role.schema.d.ts +83 -0
  51. package/lib/schemas/zod/role.schema.d.ts.map +1 -0
  52. package/lib/schemas/zod/role.schema.js +26 -0
  53. package/lib/schemas/zod/user.schema.d.ts +179 -0
  54. package/lib/schemas/zod/user.schema.d.ts.map +1 -0
  55. package/lib/schemas/zod/user.schema.js +41 -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 +45 -0
  60. package/lib/services/organization.service.d.ts.map +1 -0
  61. package/lib/services/organization.service.js +35 -0
  62. package/lib/services/permission.service.d.ts +62 -0
  63. package/lib/services/permission.service.d.ts.map +1 -0
  64. package/lib/services/permission.service.js +159 -0
  65. package/lib/services/role.service.d.ts +49 -0
  66. package/lib/services/role.service.d.ts.map +1 -0
  67. package/lib/services/role.service.js +57 -0
  68. package/lib/services/user.service.d.ts +54 -0
  69. package/lib/services/user.service.d.ts.map +1 -0
  70. package/lib/services/user.service.js +85 -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 +2 -2
@@ -0,0 +1,57 @@
1
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/mappers';
2
+ export class BaseRoleService {
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 createRole(roleDto, em) {
16
+ // TODO: Think about removing static method here, since we need specific args
17
+ const role = this.#mapperss.CreateRoleDtoMapper.deserializeDtoToEntity(roleDto);
18
+ await (em ?? this.em).transactional((em) => em.persist(role));
19
+ return this.#mapperss.RoleDtoMapper.serializeEntityToDto(role);
20
+ }
21
+ async createBatchRoles(roleDtos, em) {
22
+ const roles = await Promise.all(roleDtos.map(async (roleDto) => this.#mapperss.CreateRoleDtoMapper.deserializeDtoToEntity(roleDto)));
23
+ await (em ?? this.em).transactional((em) => em.persist(roles));
24
+ return roles.map((role) => this.#mapperss.RoleDtoMapper.serializeEntityToDto(role));
25
+ }
26
+ async getRole(idDto, em) {
27
+ const role = await (em ?? this.em).findOneOrFail('Role', idDto, {
28
+ populate: ['id', '*']
29
+ });
30
+ return this.#mapperss.RoleDtoMapper.serializeEntityToDto(role);
31
+ }
32
+ async getBatchRoles(idsDto, em) {
33
+ return (await (em ?? this.em).find('Role', idsDto, {
34
+ populate: ['id', '*']
35
+ })).map((role) => this.#mapperss.RoleDtoMapper.serializeEntityToDto(role));
36
+ }
37
+ async updateRole(roleDto, em) {
38
+ let role = this.#mapperss.UpdateRoleDtoMapper.deserializeDtoToEntity(roleDto);
39
+ await (em ?? this.em).transactional(async (em) => {
40
+ role = (await em.upsert('Role', role));
41
+ });
42
+ return this.#mapperss.RoleDtoMapper.serializeEntityToDto(role);
43
+ }
44
+ async updateBatchRoles(roleDtos, em) {
45
+ let roles = await Promise.all(roleDtos.map(async (roleDto) => this.#mapperss.UpdateRoleDtoMapper.deserializeDtoToEntity(roleDto)));
46
+ await (em ?? this.em).transactional(async (em) => {
47
+ roles = await em.upsertMany('Role', roles);
48
+ });
49
+ return roles.map((role) => this.#mapperss.RoleDtoMapper.serializeEntityToDto(role));
50
+ }
51
+ async deleteRole(idDto, em) {
52
+ await (em ?? this.em).nativeDelete('Role', idDto);
53
+ }
54
+ async deleteBatchRoles(idsDto, em) {
55
+ await (em ?? this.em).nativeDelete('Role', { id: { $in: idsDto.ids } });
56
+ }
57
+ }
@@ -0,0 +1,54 @@
1
+ import { OrganizationService, RoleService, UserService } from '@forklaunch/interfaces-iam/interfaces';
2
+ import { IdDto, IdsDto } from '@forklaunch/common';
3
+ import { RequestDtoMapperConstructor, ResponseDtoMapperConstructor } from '@forklaunch/core/mappers';
4
+ import { MetricsDefinition, OpenTelemetryCollector } from '@forklaunch/core/http';
5
+ import { MapNestedDtoArraysToCollections } from '@forklaunch/core/services';
6
+ import { CreateUserDto, UpdateUserDto, UserDto } from '@forklaunch/interfaces-iam/types';
7
+ import { AnySchemaValidator } from '@forklaunch/validator';
8
+ import { EntityManager } from '@mikro-orm/core';
9
+ export declare class BaseUserService<SchemaValidator extends AnySchemaValidator, OrganizationStatus, Metrics extends MetricsDefinition = MetricsDefinition, Dto extends {
10
+ UserDtoMapper: UserDto;
11
+ CreateUserDtoMapper: CreateUserDto;
12
+ UpdateUserDtoMapper: UpdateUserDto;
13
+ } = {
14
+ UserDtoMapper: UserDto;
15
+ CreateUserDtoMapper: CreateUserDto;
16
+ UpdateUserDtoMapper: UpdateUserDto;
17
+ }, Entities extends {
18
+ UserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
19
+ CreateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
20
+ UpdateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
21
+ } = {
22
+ UserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
23
+ CreateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
24
+ UpdateUserDtoMapper: MapNestedDtoArraysToCollections<UserDto, 'roles'>;
25
+ }> implements UserService {
26
+ #private;
27
+ em: EntityManager;
28
+ protected passwordEncryptionPublicKeyPath: string;
29
+ protected roleServiceFactory: () => RoleService;
30
+ protected organizationServiceFactory: () => OrganizationService<OrganizationStatus>;
31
+ protected openTelemetryCollector: OpenTelemetryCollector<Metrics>;
32
+ protected schemaValidator: SchemaValidator;
33
+ protected mapperss: {
34
+ UserDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['UserDtoMapper'], Entities['UserDtoMapper']>;
35
+ CreateUserDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreateUserDtoMapper'], Entities['CreateUserDtoMapper'], (dto: never, passwordEncryptionPublicKeyPath: string) => Entities['UpdateUserDtoMapper']>;
36
+ UpdateUserDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdateUserDtoMapper'], Entities['UpdateUserDtoMapper'], (dto: never, passwordEncryptionPublicKeyPath: string) => Entities['UpdateUserDtoMapper']>;
37
+ };
38
+ constructor(em: EntityManager, passwordEncryptionPublicKeyPath: string, roleServiceFactory: () => RoleService, organizationServiceFactory: () => OrganizationService<OrganizationStatus>, openTelemetryCollector: OpenTelemetryCollector<Metrics>, schemaValidator: SchemaValidator, mapperss: {
39
+ UserDtoMapper: ResponseDtoMapperConstructor<SchemaValidator, Dto['UserDtoMapper'], Entities['UserDtoMapper']>;
40
+ CreateUserDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['CreateUserDtoMapper'], Entities['CreateUserDtoMapper'], (dto: never, passwordEncryptionPublicKeyPath: string) => Entities['UpdateUserDtoMapper']>;
41
+ UpdateUserDtoMapper: RequestDtoMapperConstructor<SchemaValidator, Dto['UpdateUserDtoMapper'], Entities['UpdateUserDtoMapper'], (dto: never, passwordEncryptionPublicKeyPath: string) => Entities['UpdateUserDtoMapper']>;
42
+ });
43
+ createUser(userDto: Dto['CreateUserDtoMapper'], em?: EntityManager): Promise<Dto['UserDtoMapper']>;
44
+ createBatchUsers(userDtos: Dto['CreateUserDtoMapper'][], em?: EntityManager): Promise<Dto['UserDtoMapper'][]>;
45
+ getUser(idDto: IdDto, em?: EntityManager): Promise<Dto['UserDtoMapper']>;
46
+ getBatchUsers(idsDto: IdsDto, em?: EntityManager): Promise<Dto['UserDtoMapper'][]>;
47
+ updateUser(userDto: Dto['UpdateUserDtoMapper'], em?: EntityManager): Promise<Dto['UserDtoMapper']>;
48
+ updateBatchUsers(userDtos: UpdateUserDto[], em?: EntityManager): Promise<Dto['UserDtoMapper'][]>;
49
+ deleteUser(idDto: IdDto, em?: EntityManager): Promise<void>;
50
+ deleteBatchUsers(idsDto: IdsDto, em?: EntityManager): Promise<void>;
51
+ verifyHasRole(idDto: IdDto, roleId: string): Promise<void>;
52
+ verifyHasPermission(idDto: IdDto, permissionId: string): Promise<void>;
53
+ }
54
+ //# sourceMappingURL=user.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../services/user.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { transformIntoInternalDtoMapper } from '@forklaunch/core/mappers';
2
+ export class BaseUserService {
3
+ em;
4
+ passwordEncryptionPublicKeyPath;
5
+ roleServiceFactory;
6
+ organizationServiceFactory;
7
+ openTelemetryCollector;
8
+ schemaValidator;
9
+ mapperss;
10
+ #mapperss;
11
+ constructor(em, passwordEncryptionPublicKeyPath, roleServiceFactory, organizationServiceFactory, openTelemetryCollector, schemaValidator, mapperss) {
12
+ this.em = em;
13
+ this.passwordEncryptionPublicKeyPath = passwordEncryptionPublicKeyPath;
14
+ this.roleServiceFactory = roleServiceFactory;
15
+ this.organizationServiceFactory = organizationServiceFactory;
16
+ this.openTelemetryCollector = openTelemetryCollector;
17
+ this.schemaValidator = schemaValidator;
18
+ this.mapperss = mapperss;
19
+ this.#mapperss = transformIntoInternalDtoMapper(mapperss, schemaValidator);
20
+ }
21
+ async createUser(userDto, em) {
22
+ const user = await this.#mapperss.CreateUserDtoMapper.deserializeDtoToEntity(userDto, this.passwordEncryptionPublicKeyPath);
23
+ ((await em) ?? this.em).transactional(async (em) => {
24
+ await em.persist(user);
25
+ });
26
+ return this.#mapperss.UserDtoMapper.serializeEntityToDto(user);
27
+ }
28
+ async createBatchUsers(userDtos, em) {
29
+ const users = await Promise.all(userDtos.map(async (createUserDto) => this.#mapperss.CreateUserDtoMapper.deserializeDtoToEntity(createUserDto, this.passwordEncryptionPublicKeyPath)));
30
+ await (em ?? this.em).transactional(async (em) => {
31
+ await em.persist(users);
32
+ });
33
+ return users.map((user) => this.#mapperss.UserDtoMapper.serializeEntityToDto(user));
34
+ }
35
+ async getUser(idDto, em) {
36
+ const user = await (em ?? this.em).findOneOrFail('User', idDto, {
37
+ populate: ['id', '*']
38
+ });
39
+ return this.#mapperss.UserDtoMapper.serializeEntityToDto(user);
40
+ }
41
+ async getBatchUsers(idsDto, em) {
42
+ return (await (em ?? this.em).find('User', idsDto, {
43
+ populate: ['id', '*']
44
+ })).map((user) => this.#mapperss.UserDtoMapper.serializeEntityToDto(user));
45
+ }
46
+ async updateUser(userDto, em) {
47
+ let user = this.#mapperss.UpdateUserDtoMapper.deserializeDtoToEntity(userDto, this.passwordEncryptionPublicKeyPath);
48
+ await (em ?? this.em).transactional(async (localEm) => {
49
+ user = await localEm.upsert(user);
50
+ });
51
+ return this.#mapperss.UserDtoMapper.serializeEntityToDto(user);
52
+ }
53
+ async updateBatchUsers(userDtos, em) {
54
+ let users = await Promise.all(userDtos.map(async (updateUserDto) => this.#mapperss.UpdateUserDtoMapper.deserializeDtoToEntity(updateUserDto, this.passwordEncryptionPublicKeyPath)));
55
+ await (em ?? this.em).transactional(async (localEm) => {
56
+ users = await localEm.upsertMany(users);
57
+ });
58
+ return users.map((user) => this.#mapperss.UserDtoMapper.serializeEntityToDto(user));
59
+ }
60
+ async deleteUser(idDto, em) {
61
+ const entityManager = em || this.em;
62
+ await entityManager.nativeDelete('User', idDto);
63
+ }
64
+ async deleteBatchUsers(idsDto, em) {
65
+ const entityManager = em || this.em;
66
+ await entityManager.nativeDelete('User', idsDto);
67
+ }
68
+ async verifyHasRole(idDto, roleId) {
69
+ const user = await this.getUser(idDto);
70
+ if (user.roles.filter((role) => {
71
+ return roleId == role.id;
72
+ }).length === 0) {
73
+ throw new Error(`User ${idDto.id} does not have role ${roleId}`);
74
+ }
75
+ }
76
+ async verifyHasPermission(idDto, permissionId) {
77
+ const user = await this.getUser(idDto);
78
+ if (user.roles
79
+ .map((role) => role.permissions.map((permission) => permission.id))
80
+ .flat()
81
+ .filter((id) => id == permissionId).length === 0) {
82
+ throw new Error(`User ${idDto.id} does not have permission ${permissionId}`);
83
+ }
84
+ }
85
+ }