diff --git a/packages/common/src/IAPIDef.ts b/packages/common/src/IAPIDef.ts index fe904f3..1866e80 100644 --- a/packages/common/src/IAPIDef.ts +++ b/packages/common/src/IAPIDef.ts @@ -1,7 +1,6 @@ import {ICredentials} from './ICredentials' import {INewUser} from './INewUser' import {ITeam} from './ITeam' -import {IUserTeam} from './IUserTeam' import {IUser} from './IUser' import {IUserInTeam} from './IUserInTeam' @@ -86,18 +85,30 @@ export interface IAPIDef { teamId: number userId: number } + // body: { + // roleId: number + // } + response: IUserInTeam } delete: { params: { teamId: number userId: number } + // body: { + // roleId: number + // } + response: { + teamId: number + userId: number + // roleId: number + } } } '/my/teams': { get: { - response: IUserTeam[] + response: ITeam[] } } diff --git a/packages/server/src/team/ITeamService.ts b/packages/server/src/team/ITeamService.ts index a6fb6c6..4c70c16 100644 --- a/packages/server/src/team/ITeamService.ts +++ b/packages/server/src/team/ITeamService.ts @@ -1,5 +1,4 @@ import {Team} from '../entities/Team' -import {UserTeam} from '../entities/UserTeam' import {IUserTeamParams} from './IUserTeamParams' import {IUserInTeam} from '@rondo/common' @@ -10,13 +9,13 @@ export interface ITeamService { update(params: {id: number, name: string, userId: number}): Promise - addUser(params: IUserTeamParams): Promise + addUser(params: IUserTeamParams): Promise removeUser(params: IUserTeamParams): Promise findOne(id: number): Promise - find(userId: number): Promise + find(userId: number): Promise findUsers(teamId: number): Promise diff --git a/packages/server/src/team/TeamRoutes.test.ts b/packages/server/src/team/TeamRoutes.test.ts index 568cbd0..dcfb43b 100644 --- a/packages/server/src/team/TeamRoutes.test.ts +++ b/packages/server/src/team/TeamRoutes.test.ts @@ -73,7 +73,7 @@ describe('team', () => { const response = await t .get('/my/teams') .expect(200) - expect(response.body.map(ut => ({teamId: ut.teamId}))) + expect(response.body.map(myTeam => ({teamId: myTeam.id}))) .toContainEqual({ teamId: team.id, }) diff --git a/packages/server/src/team/TeamRoutes.ts b/packages/server/src/team/TeamRoutes.ts index 2b8c662..5b79659 100644 --- a/packages/server/src/team/TeamRoutes.ts +++ b/packages/server/src/team/TeamRoutes.ts @@ -84,7 +84,7 @@ export class TeamRoutes extends BaseRoute { userId: req.user!.id, }) - await this.teamService.addUser({ + return this.teamService.addUser({ userId, teamId, roleId: 1, // TODO customize roles @@ -105,6 +105,8 @@ export class TeamRoutes extends BaseRoute { userId, roleId: 1, // TODO customzie roles }) + + return {teamId, userId} }) } diff --git a/packages/server/src/team/TeamService.ts b/packages/server/src/team/TeamService.ts index 6e3beea..490ecdf 100644 --- a/packages/server/src/team/TeamService.ts +++ b/packages/server/src/team/TeamService.ts @@ -1,5 +1,6 @@ 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' @@ -44,8 +45,18 @@ export class TeamService extends BaseService implements ITeamService { async addUser(params: IUserTeamParams) { const {userId, teamId, roleId} = params - return this.getRepository(UserTeam) + 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) { @@ -55,23 +66,13 @@ export class TeamService extends BaseService implements ITeamService { } async findUsers(teamId: number) { - const userTeams = await this.getRepository(UserTeam) - .createQueryBuilder('ut') - .select('ut') - .innerJoinAndSelect('ut.user', 'user') - .innerJoinAndSelect('ut.role', 'role') + const userTeams = await this.createFindUserInTeamQuery() .where('ut.teamId = :teamId', { teamId, }) .getMany() - return userTeams.map(ut => ({ - teamId, - userId: ut.userId, - displayName: `${ut.user.firstName} ${ut.user.lastName}`, - roleId: ut.role!.id, - roleName: ut.role!.name, - })) + return userTeams.map(this.mapUserInTeam) } async findOne(id: number) { @@ -79,11 +80,30 @@ export class TeamService extends BaseService implements ITeamService { } async find(userId: number) { - // TODO find all teams via UserTeam instead of userId - return this.getRepository(UserTeam).find({ - relations: ['team'], - where: {userId}, - }) + 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, + } } }