CreateSharedVault.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { Result, RoleName, Timestamps, UseCaseInterface, Uuid, Validator } from '@standardnotes/domain-core'
  2. import { CreateSharedVaultResult } from './CreateSharedVaultResult'
  3. import { CreateSharedVaultDTO } from './CreateSharedVaultDTO'
  4. import { TimerInterface } from '@standardnotes/time'
  5. import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
  6. import { AddUserToSharedVault } from '../AddUserToSharedVault/AddUserToSharedVault'
  7. import { SharedVault } from '../../../SharedVault/SharedVault'
  8. export class CreateSharedVault implements UseCaseInterface<CreateSharedVaultResult> {
  9. private readonly FILE_UPLOAD_BYTES_LIMIT = 1_000_000
  10. constructor(
  11. private addUserToSharedVault: AddUserToSharedVault,
  12. private sharedVaultRepository: SharedVaultRepositoryInterface,
  13. private timer: TimerInterface,
  14. ) {}
  15. async execute(dto: CreateSharedVaultDTO): Promise<Result<CreateSharedVaultResult>> {
  16. const userUuidOrError = Uuid.create(dto.userUuid)
  17. if (userUuidOrError.isFailed()) {
  18. return Result.fail(userUuidOrError.getError())
  19. }
  20. const userUuid = userUuidOrError.getValue()
  21. const userRoleNamesValidationResult = Validator.isNotEmpty(dto.userRoleNames)
  22. if (userRoleNamesValidationResult.isFailed()) {
  23. return Result.fail(userRoleNamesValidationResult.getError())
  24. }
  25. const userSharedVaultLimit = this.getUserSharedVaultLimit(dto.userRoleNames)
  26. if (userSharedVaultLimit !== undefined) {
  27. const userSharedVaultCount = await this.sharedVaultRepository.countByUserUuid(userUuid)
  28. if (userSharedVaultCount >= userSharedVaultLimit) {
  29. return Result.fail('You have reached the limit of shared vaults for your account.')
  30. }
  31. }
  32. const timestamps = Timestamps.create(
  33. this.timer.getTimestampInMicroseconds(),
  34. this.timer.getTimestampInMicroseconds(),
  35. ).getValue()
  36. const sharedVaultOrError = SharedVault.create({
  37. fileUploadBytesLimit: this.FILE_UPLOAD_BYTES_LIMIT,
  38. fileUploadBytesUsed: 0,
  39. userUuid,
  40. timestamps,
  41. })
  42. if (sharedVaultOrError.isFailed()) {
  43. return Result.fail(sharedVaultOrError.getError())
  44. }
  45. const sharedVault = sharedVaultOrError.getValue()
  46. await this.sharedVaultRepository.save(sharedVault)
  47. const sharedVaultUserOrError = await this.addUserToSharedVault.execute({
  48. sharedVaultUuid: sharedVault.id.toString(),
  49. userUuid: dto.userUuid,
  50. permission: 'admin',
  51. })
  52. if (sharedVaultUserOrError.isFailed()) {
  53. return Result.fail(sharedVaultUserOrError.getError())
  54. }
  55. const sharedVaultUser = sharedVaultUserOrError.getValue()
  56. return Result.ok({ sharedVault, sharedVaultUser })
  57. }
  58. private getUserSharedVaultLimit(userRoleNames: string[]): number | undefined {
  59. if (userRoleNames.includes(RoleName.NAMES.ProUser)) {
  60. return undefined
  61. }
  62. if (userRoleNames.includes(RoleName.NAMES.PlusUser)) {
  63. return 3
  64. }
  65. return 1
  66. }
  67. }