DisableEmailSettingBasedOnEmailSubscription.ts 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { EmailLevel, Result, UseCaseInterface, Username } from '@standardnotes/domain-core'
  2. import { SettingName } from '@standardnotes/settings'
  3. import { DisableEmailSettingBasedOnEmailSubscriptionDTO } from './DisableEmailSettingBasedOnEmailSubscriptionDTO'
  4. import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
  5. import { SetSettingValue } from '../SetSettingValue/SetSettingValue'
  6. import { SetSubscriptionSettingValue } from '../SetSubscriptionSettingValue/SetSubscriptionSettingValue'
  7. import { GetSharedOrRegularSubscriptionForUser } from '../GetSharedOrRegularSubscriptionForUser/GetSharedOrRegularSubscriptionForUser'
  8. export class DisableEmailSettingBasedOnEmailSubscription implements UseCaseInterface<void> {
  9. constructor(
  10. private userRepository: UserRepositoryInterface,
  11. private setSettingValue: SetSettingValue,
  12. private setSubscriptionSetting: SetSubscriptionSettingValue,
  13. private getSharedOrRegularSubscriptionForUser: GetSharedOrRegularSubscriptionForUser,
  14. ) {}
  15. async execute(dto: DisableEmailSettingBasedOnEmailSubscriptionDTO): Promise<Result<void>> {
  16. const usernameOrError = Username.create(dto.userEmail)
  17. if (usernameOrError.isFailed()) {
  18. return Result.fail(usernameOrError.getError())
  19. }
  20. const username = usernameOrError.getValue()
  21. const user = await this.userRepository.findOneByUsernameOrEmail(username)
  22. if (user === null) {
  23. return Result.fail(`User not found for email ${dto.userEmail}`)
  24. }
  25. const settingNameOrError = this.getSettingNameFromLevel(dto.level)
  26. if (settingNameOrError.isFailed()) {
  27. return Result.fail(settingNameOrError.getError())
  28. }
  29. const settingName = settingNameOrError.getValue()
  30. if (settingName.isASubscriptionSetting()) {
  31. const subscriptionOrError = await this.getSharedOrRegularSubscriptionForUser.execute({
  32. userUuid: user.uuid,
  33. })
  34. if (subscriptionOrError.isFailed()) {
  35. return Result.fail(subscriptionOrError.getError())
  36. }
  37. const subscription = subscriptionOrError.getValue()
  38. return this.setSubscriptionSetting.execute({
  39. settingName: settingName.value,
  40. userSubscriptionUuid: subscription.uuid,
  41. value: 'muted',
  42. })
  43. } else {
  44. return this.setSettingValue.execute({
  45. settingName: settingName.value,
  46. userUuid: user.uuid,
  47. value: 'muted',
  48. })
  49. }
  50. }
  51. private getSettingNameFromLevel(level: string): Result<SettingName> {
  52. /* istanbul ignore next */
  53. switch (level) {
  54. case EmailLevel.LEVELS.FailedCloudBackup:
  55. return Result.ok(SettingName.create(SettingName.NAMES.MuteFailedCloudBackupsEmails).getValue())
  56. case EmailLevel.LEVELS.FailedEmailBackup:
  57. return Result.ok(SettingName.create(SettingName.NAMES.MuteFailedBackupsEmails).getValue())
  58. case EmailLevel.LEVELS.Marketing:
  59. return Result.ok(SettingName.create(SettingName.NAMES.MuteMarketingEmails).getValue())
  60. case EmailLevel.LEVELS.SignIn:
  61. return Result.ok(SettingName.create(SettingName.NAMES.MuteSignInEmails).getValue())
  62. default:
  63. return Result.fail(`Unknown level: ${level}`)
  64. }
  65. }
  66. }