120 lines
2.7 KiB
TypeScript
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,
|
|
}
|
|
}
|
|
|
|
}
|