120 lines
2.7 KiB
TypeScript

import {BaseService} from '../services/BaseService'
import {ITeamService} from './ITeamService'
import {IUserInTeam} from '@rondo/common'
import {IUserTeamParams} from './IUserTeamParams'
import {Team} from '../entities/Team'
import {UserTeam} from '../entities/UserTeam'
import {Validator, trim} from '../validator'
export class TeamService extends BaseService implements ITeamService {
// TODO check team limit per user
async create({name, userId}: {name: string, userId: number}) {
name = trim(name)
new Validator({name, userId})
.ensure('name')
.ensure('userId')
.throw()
const team = await this.getRepository(Team).save({
name,
userId,
})
await this.addUser({
teamId: team.id,
userId,
// ADMIN role
roleId: 1,
})
return team
}
async remove({id, userId}: {id: number, userId: number}) {
await this.getRepository(UserTeam)
.delete({teamId: id, userId})
await this.getRepository(Team)
.delete(id)
return {id}
}
async update({id, name, userId}: {id: number, name: string, userId: number}) {
await this.getRepository(Team)
.update({
id,
}, {
name,
})
return (await this.findOne(id))!
}
async addUser(params: IUserTeamParams) {
const {userId, teamId, roleId} = params
await this.getRepository(UserTeam)
.save({userId, teamId, roleId})
const userTeam = await this.createFindUserInTeamQuery()
.where({
userId,
teamId,
roleId,
})
.getOne()
return this.mapUserInTeam(userTeam!)
}
async removeUser({teamId, userId, roleId}: IUserTeamParams) {
// TODO check if this is the last admin team member
await this.getRepository(UserTeam)
.delete({userId, teamId, roleId})
}
async findUsers(teamId: number) {
const userTeams = await this.createFindUserInTeamQuery()
.where('ut.teamId = :teamId', {
teamId,
})
.getMany()
return userTeams.map(this.mapUserInTeam)
}
async findOne(id: number) {
return this.getRepository(Team).findOne(id)
}
async find(userId: number) {
return this.getRepository(Team)
.createQueryBuilder('team')
.select('team')
.innerJoin('team.userTeams', 'ut')
.where('ut.userId = :userId', {userId})
.getMany()
}
protected createFindUserInTeamQuery() {
return this.getRepository(UserTeam)
.createQueryBuilder('ut')
.select('ut')
.innerJoinAndSelect('ut.user', 'user')
.innerJoinAndSelect('ut.role', 'role')
}
protected mapUserInTeam(ut: UserTeam): IUserInTeam {
return {
teamId: ut.teamId,
userId: ut.userId,
displayName: `${ut.user.firstName} ${ut.user.lastName}`,
roleId: ut.role!.id,
roleName: ut.role!.name,
}
}
}