BaseRevisionsController.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { HttpStatusCode } from '@standardnotes/responses'
  2. import { Role } from '@standardnotes/security'
  3. import { BaseHttpController, results } from 'inversify-express-utils'
  4. import { Request, Response } from 'express'
  5. import { ControllerContainerInterface, MapperInterface } from '@standardnotes/domain-core'
  6. import { Revision } from '../../../Domain/Revision/Revision'
  7. import { RevisionMetadata } from '../../../Domain/Revision/RevisionMetadata'
  8. import { DeleteRevision } from '../../../Domain/UseCase/DeleteRevision/DeleteRevision'
  9. import { GetRevision } from '../../../Domain/UseCase/GetRevision/GetRevision'
  10. import { GetRevisionsMetada } from '../../../Domain/UseCase/GetRevisionsMetada/GetRevisionsMetada'
  11. import { RevisionHttpRepresentation } from '../../../Mapping/Http/RevisionHttpRepresentation'
  12. import { RevisionMetadataHttpRepresentation } from '../../../Mapping/Http/RevisionMetadataHttpRepresentation'
  13. import { TriggerTransitionFromPrimaryToSecondaryDatabaseForUser } from '../../../Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser'
  14. export class BaseRevisionsController extends BaseHttpController {
  15. constructor(
  16. protected getRevisionsMetadata: GetRevisionsMetada,
  17. protected doGetRevision: GetRevision,
  18. protected doDeleteRevision: DeleteRevision,
  19. protected revisionHttpMapper: MapperInterface<Revision, RevisionHttpRepresentation>,
  20. protected revisionMetadataHttpMapper: MapperInterface<RevisionMetadata, RevisionMetadataHttpRepresentation>,
  21. protected triggerTransitionFromPrimaryToSecondaryDatabaseForUser: TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
  22. private controllerContainer?: ControllerContainerInterface,
  23. ) {
  24. super()
  25. if (this.controllerContainer !== undefined) {
  26. this.controllerContainer.register('revisions.revisions.getRevisions', this.getRevisions.bind(this))
  27. this.controllerContainer.register('revisions.revisions.getRevision', this.getRevision.bind(this))
  28. this.controllerContainer.register('revisions.revisions.deleteRevision', this.deleteRevision.bind(this))
  29. this.controllerContainer.register('revisions.revisions.transition', this.transition.bind(this))
  30. }
  31. }
  32. async getRevisions(request: Request, response: Response): Promise<results.JsonResult> {
  33. const revisionMetadataOrError = await this.getRevisionsMetadata.execute({
  34. itemUuid: request.params.itemUuid,
  35. userUuid: response.locals.user.uuid,
  36. roleNames: response.locals.roles.map((role: Role) => role.name),
  37. sharedVaultUuids: response.locals.belongsToSharedVaults.map(
  38. (association: { shared_vault_uuid: string; permission: string }) => association.shared_vault_uuid,
  39. ),
  40. })
  41. if (revisionMetadataOrError.isFailed()) {
  42. return this.json(
  43. {
  44. error: {
  45. message: 'Could not retrieve revisions.',
  46. },
  47. },
  48. HttpStatusCode.BadRequest,
  49. )
  50. }
  51. const revisions = revisionMetadataOrError.getValue()
  52. return this.json({
  53. revisions: revisions.map((revision) => this.revisionMetadataHttpMapper.toProjection(revision)),
  54. })
  55. }
  56. async getRevision(request: Request, response: Response): Promise<results.JsonResult> {
  57. const revisionOrError = await this.doGetRevision.execute({
  58. revisionUuid: request.params.uuid,
  59. userUuid: response.locals.user.uuid,
  60. roleNames: response.locals.roles.map((role: Role) => role.name),
  61. })
  62. if (revisionOrError.isFailed()) {
  63. return this.json(
  64. {
  65. error: {
  66. message: 'Could not retrieve revision.',
  67. },
  68. },
  69. HttpStatusCode.BadRequest,
  70. )
  71. }
  72. return this.json({
  73. revision: this.revisionHttpMapper.toProjection(revisionOrError.getValue()),
  74. })
  75. }
  76. async deleteRevision(request: Request, response: Response): Promise<results.JsonResult> {
  77. const revisionOrError = await this.doDeleteRevision.execute({
  78. revisionUuid: request.params.uuid,
  79. userUuid: response.locals.user.uuid,
  80. roleNames: response.locals.roles.map((role: Role) => role.name),
  81. })
  82. if (revisionOrError.isFailed()) {
  83. return this.json(
  84. {
  85. error: {
  86. message: 'Could not delete revision.',
  87. },
  88. },
  89. HttpStatusCode.BadRequest,
  90. )
  91. }
  92. return this.json({
  93. message: revisionOrError.getValue(),
  94. })
  95. }
  96. async transition(_request: Request, response: Response): Promise<results.JsonResult> {
  97. const result = await this.triggerTransitionFromPrimaryToSecondaryDatabaseForUser.execute({
  98. userUuid: response.locals.user.uuid,
  99. })
  100. if (result.isFailed()) {
  101. return this.json(
  102. {
  103. error: { message: result.getError() },
  104. },
  105. 400,
  106. )
  107. }
  108. response.setHeader('x-invalidate-cache', response.locals.user.uuid)
  109. return this.json({ success: true })
  110. }
  111. }