Add put & delete team route

This commit is contained in:
Jerko Steiner 2019-03-09 22:56:55 +05:00
parent 4cc03fe611
commit 14e90f9559
6 changed files with 118 additions and 0 deletions

View File

@ -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': {

View File

@ -5,6 +5,10 @@ import {IUserTeamParams} from './IUserTeamParams'
export interface ITeamService {
create(params: {name: string, userId: number}): Promise<Team>
remove(params: {id: number, userId: number}): Promise<void>
update(params: {id: number, name: string, userId: number}): Promise<Team>
addUser(params: IUserTeamParams): Promise<UserTeam>
removeUser(params: IUserTeamParams): Promise<void>

View File

@ -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')

View File

@ -33,6 +33,23 @@ export class TeamRoutes extends BaseRoute<IAPIDef> {
})
})
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,
})
})
}
}

View File

@ -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)

View File

@ -87,4 +87,18 @@ export class RequestTester<R extends IRoutes> {
) {
return this.request('post', path, options)
}
put<P extends keyof R & string>(
path: P,
options?: IRequestOptions<R, P, 'put'>,
) {
return this.request('put', path, options)
}
delete<P extends keyof R & string>(
path: P,
options?: IRequestOptions<R, P, 'delete'>,
) {
return this.request('delete', path, options)
}
}