RevisionsController.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { Request, Response } from 'express'
  2. import { BaseHttpController, controller, httpDelete, httpGet, results } from 'inversify-express-utils'
  3. import { inject } from 'inversify'
  4. import TYPES from '../Bootstrap/Types'
  5. import { ProjectorInterface } from '../Projection/ProjectorInterface'
  6. import { Revision } from '../Domain/Revision/Revision'
  7. import { RevisionServiceInterface } from '../Domain/Revision/RevisionServiceInterface'
  8. import { ErrorTag } from '@standardnotes/common'
  9. import { RevisionProjection } from '../Projection/RevisionProjection'
  10. @controller('/items/:itemUuid/revisions', TYPES.AuthMiddleware)
  11. export class RevisionsController extends BaseHttpController {
  12. constructor(
  13. @inject(TYPES.RevisionService) private revisionService: RevisionServiceInterface,
  14. @inject(TYPES.RevisionProjector) private revisionProjector: ProjectorInterface<Revision, RevisionProjection>,
  15. ) {
  16. super()
  17. }
  18. @httpGet('/')
  19. public async getRevisions(req: Request, response: Response): Promise<results.JsonResult> {
  20. const revisions = await this.revisionService.getRevisions(response.locals.user.uuid, req.params.itemUuid)
  21. const revisionProjections = []
  22. for (const revision of revisions) {
  23. revisionProjections.push(await this.revisionProjector.projectSimple(revision))
  24. }
  25. return this.json(revisionProjections)
  26. }
  27. @httpGet('/:uuid')
  28. public async getRevision(request: Request, response: Response): Promise<results.JsonResult | results.NotFoundResult> {
  29. const revision = await this.revisionService.getRevision({
  30. userRoles: response.locals.roleNames,
  31. userUuid: response.locals.user.uuid,
  32. itemUuid: request.params.itemUuid,
  33. revisionUuid: request.params.uuid,
  34. })
  35. if (!revision) {
  36. return this.notFound()
  37. }
  38. const revisionProjection = await this.revisionProjector.projectFull(revision)
  39. return this.json(revisionProjection)
  40. }
  41. @httpDelete('/:uuid')
  42. public async deleteRevision(
  43. request: Request,
  44. response: Response,
  45. ): Promise<results.BadRequestResult | results.OkResult | results.JsonResult> {
  46. if (response.locals.readOnlyAccess) {
  47. return this.json(
  48. {
  49. error: {
  50. tag: ErrorTag.ReadOnlyAccess,
  51. message: 'Session has read-only access.',
  52. },
  53. },
  54. 401,
  55. )
  56. }
  57. const success = await this.revisionService.removeRevision({
  58. userUuid: response.locals.user.uuid,
  59. itemUuid: request.params.itemUuid,
  60. revisionUuid: request.params.uuid,
  61. })
  62. if (!success) {
  63. return this.badRequest()
  64. }
  65. return this.ok()
  66. }
  67. }