diff options
Diffstat (limited to 'server/providers/services/users.service.ts')
-rw-r--r-- | server/providers/services/users.service.ts | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/server/providers/services/users.service.ts b/server/providers/services/users.service.ts index c3ee086..2bb752a 100644 --- a/server/providers/services/users.service.ts +++ b/server/providers/services/users.service.ts @@ -3,12 +3,19 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import * as bcrypt from 'bcrypt'; import { User } from '../../entities/user.entity'; +import { Role, RoleKey } from 'server/entities/role.entity'; +import { UserRole } from 'server/entities/user_role.entity'; +import { intersection, isEmpty } from 'lodash'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private usersRespository: Repository<User>, + @InjectRepository(UserRole) + private userRolesRepository: Repository<UserRole>, + @InjectRepository(Role) + private rolesRepository: Repository<Role>, ) {} findAll(relations: string[] = []) { @@ -33,4 +40,35 @@ export class UsersService { const verified: boolean = await bcrypt.compare(password, user.passwordHash); return { verified, user: verified ? user : null }; } + + addUserToRoleInContext(userId: number, contextId: string, ...roleKeys: RoleKey[]) { + return Promise.all( + roleKeys.map(async (key) => { + const role = await this.rolesRepository.findOne({ key }); + const userRole = new UserRole(); + userRole.userId = userId; + userRole.contextId = contextId; + userRole.role = role; + await this.userRolesRepository.save(userRole); + }), + ); + } + + addUserToRootRole(userId: number, ...roleKeys: RoleKey[]) { + return this.addUserToRoleInContext(userId, 'root', ...roleKeys); + } + + // if multiple roles are passed then will return true if user has any of the listed roles. + async hasRoleInContext(userId: number, contextId: string, ...roleKeys: RoleKey[]) { + const userRoles = await this.userRolesRepository.find({ + where: { userId, contextId }, + relations: ['role'], + }); + const usersRoleKeys = userRoles.map((userRole) => userRole.role.key); + return !isEmpty(intersection(roleKeys, usersRoleKeys)); + } + + async hasRootRole(userId: number, ...roleKeys: RoleKey[]) { + return this.hasRoleInContext(userId, 'root', ...roleKeys); + } } |