diff --git a/packages/common/src/IAPIDef.ts b/packages/common/src/IAPIDef.ts index c542922..23120d4 100644 --- a/packages/common/src/IAPIDef.ts +++ b/packages/common/src/IAPIDef.ts @@ -56,6 +56,20 @@ export interface IAPIDef { } response: ITeam | undefined } + put: { + params: { + id: number + } + body: { + name: string + } + response: ITeam + } + delete: { + params: { + id: number + } + } } '/my/teams': { diff --git a/packages/server/src/team/ITeamService.ts b/packages/server/src/team/ITeamService.ts index 5936fba..737991c 100644 --- a/packages/server/src/team/ITeamService.ts +++ b/packages/server/src/team/ITeamService.ts @@ -5,6 +5,10 @@ import {IUserTeamParams} from './IUserTeamParams' export interface ITeamService { create(params: {name: string, userId: number}): Promise + remove(params: {id: number, userId: number}): Promise + + update(params: {id: number, name: string, userId: number}): Promise + addUser(params: IUserTeamParams): Promise removeUser(params: IUserTeamParams): Promise diff --git a/packages/server/src/team/TeamRoutes.test.ts b/packages/server/src/team/TeamRoutes.test.ts index 162f1d4..42cec00 100644 --- a/packages/server/src/team/TeamRoutes.test.ts +++ b/packages/server/src/team/TeamRoutes.test.ts @@ -36,6 +36,35 @@ describe('team', () => { }) }) + describe('PUT /teams/:id', () => { + it('updates a team name', async () => { + const team = await createTeam(t, 'test') + const response = await t + .put('/teams/:id', { + params: { + id: team.id, + }, + }) + .send({ + name: team.name + '2', + }) + expect(response.body.name).toEqual(team.name + '2') + }) + }) + + describe('DELETE /teams/:id', () => { + it('removes a team by id', async () => { + const team = await createTeam(t, 'test') + await t + .delete('/teams/:id', { + params: { + id: team.id, + }, + }) + .expect(200) + }) + }) + describe('GET /my/teams', () => { it('retrieves all teams belonging to current user', async () => { const team = await createTeam(t, 'test') diff --git a/packages/server/src/team/TeamRoutes.ts b/packages/server/src/team/TeamRoutes.ts index d3b5e7c..c0b0860 100644 --- a/packages/server/src/team/TeamRoutes.ts +++ b/packages/server/src/team/TeamRoutes.ts @@ -33,6 +33,23 @@ export class TeamRoutes extends BaseRoute { }) }) + t.put('/teams/:id', async req => { + const id = Number(req.params.id) + return this.teamService.update({ + id, + name: req.body.name, + userId: req.user!.id, + }) + }) + + t.delete('/teams/:id', async req => { + const id = Number(req.params.id) + return this.teamService.remove({ + id, + userId: req.user!.id, + }) + }) + } } diff --git a/packages/server/src/team/TeamService.ts b/packages/server/src/team/TeamService.ts index e291b5b..cdcc248 100644 --- a/packages/server/src/team/TeamService.ts +++ b/packages/server/src/team/TeamService.ts @@ -3,8 +3,24 @@ import {ITeamService} from './ITeamService' import {IUserTeamParams} from './IUserTeamParams' import {Team} from '../entities/Team' import {UserTeam} from '../entities/UserTeam' +import createError from 'http-errors' export class TeamService extends BaseService implements ITeamService { + + protected async canModify({id, userId}: {id: number, userId: number}) { + const count = await this.getRepository(UserTeam) + .count({ + where: { + teamId: id, + userId, + }, + }) + + if (count === 0) { + throw createError(403, 'Forbidden') + } + } + // TODO check team limit per user async create({name, userId}: {name: string, userId: number}) { const team = await this.getRepository(Team).save({ @@ -22,6 +38,30 @@ export class TeamService extends BaseService implements ITeamService { return team } + async remove({id, userId}: {id: number, userId: number}) { + // TODO check for role + this.canModify({id, userId}) + + await this.getRepository(UserTeam) + .delete({userId}) + + await this.getRepository(Team) + .delete({id}) + } + + async update({id, name, userId}: {id: number, name: string, userId: number}) { + this.canModify({id, userId}) + + await this.getRepository(Team) + .update({ + id, + }, { + name, + }) + + return (await this.findOne(id))! + } + async addUser(params: IUserTeamParams) { const {userId, teamId, roleId} = params return this.getRepository(UserTeam) diff --git a/packages/server/src/test-utils/RequestTester.ts b/packages/server/src/test-utils/RequestTester.ts index c3b1be9..82328e0 100644 --- a/packages/server/src/test-utils/RequestTester.ts +++ b/packages/server/src/test-utils/RequestTester.ts @@ -87,4 +87,18 @@ export class RequestTester { ) { return this.request('post', path, options) } + + put

( + path: P, + options?: IRequestOptions, + ) { + return this.request('put', path, options) + } + + delete

( + path: P, + options?: IRequestOptions, + ) { + return this.request('delete', path, options) + } }