BaseSharedVaultsController.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { Request, Response } from 'express'
  2. import { BaseHttpController, results } from 'inversify-express-utils'
  3. import { HttpStatusCode } from '@standardnotes/responses'
  4. import { ControllerContainerInterface, MapperInterface } from '@standardnotes/domain-core'
  5. import { Role } from '@standardnotes/security'
  6. import { GetSharedVaults } from '../../../Domain/UseCase/SharedVaults/GetSharedVaults/GetSharedVaults'
  7. import { SharedVault } from '../../../Domain/SharedVault/SharedVault'
  8. import { SharedVaultHttpRepresentation } from '../../../Mapping/Http/SharedVaultHttpRepresentation'
  9. import { CreateSharedVault } from '../../../Domain/UseCase/SharedVaults/CreateSharedVault/CreateSharedVault'
  10. import { SharedVaultUser } from '../../../Domain/SharedVault/User/SharedVaultUser'
  11. import { SharedVaultUserHttpRepresentation } from '../../../Mapping/Http/SharedVaultUserHttpRepresentation'
  12. import { DeleteSharedVault } from '../../../Domain/UseCase/SharedVaults/DeleteSharedVault/DeleteSharedVault'
  13. import { CreateSharedVaultFileValetToken } from '../../../Domain/UseCase/SharedVaults/CreateSharedVaultFileValetToken/CreateSharedVaultFileValetToken'
  14. export class BaseSharedVaultsController extends BaseHttpController {
  15. constructor(
  16. protected getSharedVaultsUseCase: GetSharedVaults,
  17. protected createSharedVaultUseCase: CreateSharedVault,
  18. protected deleteSharedVaultUseCase: DeleteSharedVault,
  19. protected createSharedVaultFileValetTokenUseCase: CreateSharedVaultFileValetToken,
  20. protected sharedVaultHttpMapper: MapperInterface<SharedVault, SharedVaultHttpRepresentation>,
  21. protected sharedVaultUserHttpMapper: MapperInterface<SharedVaultUser, SharedVaultUserHttpRepresentation>,
  22. private controllerContainer?: ControllerContainerInterface,
  23. ) {
  24. super()
  25. if (this.controllerContainer !== undefined) {
  26. this.controllerContainer.register('sync.shared-vaults.get-vaults', this.getSharedVaults.bind(this))
  27. this.controllerContainer.register('sync.shared-vaults.create-vault', this.createSharedVault.bind(this))
  28. this.controllerContainer.register('sync.shared-vaults.delete-vault', this.deleteSharedVault.bind(this))
  29. this.controllerContainer.register(
  30. 'sync.shared-vaults.create-file-valet-token',
  31. this.createValetTokenForSharedVaultFile.bind(this),
  32. )
  33. }
  34. }
  35. async getSharedVaults(_request: Request, response: Response): Promise<results.JsonResult> {
  36. const result = await this.getSharedVaultsUseCase.execute({
  37. userUuid: response.locals.user.uuid,
  38. })
  39. if (result.isFailed()) {
  40. return this.json(
  41. {
  42. error: {
  43. message: result.getError(),
  44. },
  45. },
  46. HttpStatusCode.BadRequest,
  47. )
  48. }
  49. return this.json({
  50. sharedVaults: result.getValue().map((sharedVault) => this.sharedVaultHttpMapper.toProjection(sharedVault)),
  51. })
  52. }
  53. async createSharedVault(_request: Request, response: Response): Promise<results.JsonResult> {
  54. const result = await this.createSharedVaultUseCase.execute({
  55. userUuid: response.locals.user.uuid,
  56. userRoleNames: response.locals.roles.map((role: Role) => role.name),
  57. })
  58. if (result.isFailed()) {
  59. return this.json(
  60. {
  61. error: {
  62. message: result.getError(),
  63. },
  64. },
  65. HttpStatusCode.BadRequest,
  66. )
  67. }
  68. return this.json({
  69. sharedVault: this.sharedVaultHttpMapper.toProjection(result.getValue().sharedVault),
  70. sharedVaultUser: this.sharedVaultUserHttpMapper.toProjection(result.getValue().sharedVaultUser),
  71. })
  72. }
  73. async deleteSharedVault(request: Request, response: Response): Promise<results.JsonResult> {
  74. const result = await this.deleteSharedVaultUseCase.execute({
  75. sharedVaultUuid: request.params.sharedVaultUuid,
  76. originatorUuid: response.locals.user.uuid,
  77. })
  78. if (result.isFailed()) {
  79. return this.json(
  80. {
  81. error: {
  82. message: result.getError(),
  83. },
  84. },
  85. HttpStatusCode.BadRequest,
  86. )
  87. }
  88. return this.json({ success: true })
  89. }
  90. async createValetTokenForSharedVaultFile(request: Request, response: Response): Promise<results.JsonResult> {
  91. const result = await this.createSharedVaultFileValetTokenUseCase.execute({
  92. userUuid: response.locals.user.uuid,
  93. sharedVaultUuid: request.params.sharedVaultUuid,
  94. fileUuid: request.body.file_uuid,
  95. remoteIdentifier: request.body.remote_identifier,
  96. operation: request.body.operation,
  97. unencryptedFileSize: request.body.unencrypted_file_size,
  98. moveOperationType: request.body.move_operation_type,
  99. sharedVaultToSharedVaultMoveTargetUuid: request.body.shared_vault_to_shared_vault_move_target_uuid,
  100. })
  101. if (result.isFailed()) {
  102. return this.json(
  103. {
  104. error: {
  105. message: result.getError(),
  106. },
  107. },
  108. HttpStatusCode.BadRequest,
  109. )
  110. }
  111. return this.json({
  112. valetToken: result.getValue(),
  113. })
  114. }
  115. }