diff --git a/packages/common/src/IAPIDef.ts b/packages/common/src/IAPIDef.ts index 23120d4..78148ce 100644 --- a/packages/common/src/IAPIDef.ts +++ b/packages/common/src/IAPIDef.ts @@ -94,6 +94,23 @@ export interface IAPIDef { } response: ISite | undefined } + put: { + params: { + teamId: number + id: number + } + body: { + name?: string + domain?: string + } + response: ISite + } + delete: { + params: { + teamId: number + id: number + } + } } '/teams/:teamId/sites': { diff --git a/packages/server/src/site/ISiteService.ts b/packages/server/src/site/ISiteService.ts index a61801a..0aa191b 100644 --- a/packages/server/src/site/ISiteService.ts +++ b/packages/server/src/site/ISiteService.ts @@ -1,9 +1,14 @@ import {ISite} from '@rondo/common' import {ISiteCreateParams} from './ISiteCreateParams' +import {ISiteUpdateParams} from './ISiteUpdateParams' export interface ISiteService { create(params: ISiteCreateParams): Promise + update(params: ISiteUpdateParams): Promise + + remove(params: {id: number, teamId: number}): Promise + findOne(id: number, teamId: number): Promise findByUser(userId: number): Promise diff --git a/packages/server/src/site/ISiteUpdateParams.ts b/packages/server/src/site/ISiteUpdateParams.ts new file mode 100644 index 0000000..bbb476a --- /dev/null +++ b/packages/server/src/site/ISiteUpdateParams.ts @@ -0,0 +1,6 @@ +export interface ISiteUpdateParams { + id: number + name?: string + domain?: string + teamId: number +} diff --git a/packages/server/src/site/SiteRoutes.test.ts b/packages/server/src/site/SiteRoutes.test.ts index 406d583..88e0340 100644 --- a/packages/server/src/site/SiteRoutes.test.ts +++ b/packages/server/src/site/SiteRoutes.test.ts @@ -81,4 +81,35 @@ describe('team', () => { }) }) + describe('PUT /teams/:teamId/sites/:id', () => { + it('updates site belonging to a team', async () => { + const site = await createSite(t, 'test.example.com') + const response = await t.put('/teams/:teamId/sites/:id', { + params: { + id: site.id, + teamId: site.teamId, + }, + }) + .send({ + name: site.name, + domain: 'test2.example.com', + }) + .expect(200) + expect(response.body.domain).toEqual('test2.example.com') + }) + }) + + describe('DELETE /teams/:teamId/sites/:id', () => { + it('deletes a site', async () => { + const site = await createSite(t, 'test.example.com') + await t.delete('/teams/:teamId/sites/:id', { + params: { + id: site.id, + teamId: site.teamId, + }, + }) + .expect(200) + }) + }) + }) diff --git a/packages/server/src/site/SiteRoutes.ts b/packages/server/src/site/SiteRoutes.ts index 7de6075..0d9212f 100644 --- a/packages/server/src/site/SiteRoutes.ts +++ b/packages/server/src/site/SiteRoutes.ts @@ -53,6 +53,39 @@ export class SiteRoutes extends BaseRoute { }) }) + t.put('/teams/:teamId/sites/:id', async req => { + const {name, domain} = req.body + const id = Number(req.params.id) + const teamId = Number(req.params.teamId) + + await this.permissions.belongsToTeam({ + teamId, + userId: req.user!.id, + }) + + return this.siteService.update({ + id, + teamId, + name, + domain, + }) + }) + + t.delete('/teams/:teamId/sites/:id', async req => { + const id = Number(req.params.id) + const teamId = Number(req.params.teamId) + + await this.permissions.belongsToTeam({ + teamId, + userId: req.user!.id, + }) + + return this.siteService.remove({ + id, + teamId, + }) + }) + } } diff --git a/packages/server/src/site/SiteService.ts b/packages/server/src/site/SiteService.ts index b98a5b2..bda0df1 100644 --- a/packages/server/src/site/SiteService.ts +++ b/packages/server/src/site/SiteService.ts @@ -1,5 +1,6 @@ import {BaseService} from '../services/BaseService' import {ISiteCreateParams} from './ISiteCreateParams' +import {ISiteUpdateParams} from './ISiteUpdateParams' import {ISiteService} from './ISiteService' import {Site} from '../entities/Site' @@ -11,6 +12,29 @@ export class SiteService extends BaseService implements ISiteService { return this.getRepository(Site).save(params) } + async update({teamId, id, name, domain}: ISiteUpdateParams) { + // TODO validate params.domain + + await this.getRepository(Site) + .update({ + id, + teamId, + }, { + name, + domain, + }) + + return (await this.findOne(id, teamId))! + } + + async remove({id, teamId}: {id: number, teamId: number}) { + await this.getRepository(Site) + .delete({ + id, + teamId, + }) + } + async findOne(id: number, teamId: number) { return this.getRepository(Site).findOne({ where: {