Add put & delete team route
This commit is contained in:
parent
4cc03fe611
commit
14e90f9559
@ -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': {
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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,
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user