user_email_backup.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'reflect-metadata'
  2. import { Logger } from 'winston'
  3. import * as dayjs from 'dayjs'
  4. import * as utc from 'dayjs/plugin/utc'
  5. import { ContainerConfigLoader } from '../src/Bootstrap/Container'
  6. import TYPES from '../src/Bootstrap/Types'
  7. import { Env } from '../src/Bootstrap/Env'
  8. import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
  9. import { DomainEventFactoryInterface } from '../src/Domain/Event/DomainEventFactoryInterface'
  10. import { SettingRepositoryInterface } from '../src/Domain/Setting/SettingRepositoryInterface'
  11. import { MuteFailedBackupsEmailsOption, SettingName } from '@standardnotes/settings'
  12. import { RoleServiceInterface } from '../src/Domain/Role/RoleServiceInterface'
  13. import { PermissionName } from '@standardnotes/features'
  14. import { UserRepositoryInterface } from '../src/Domain/User/UserRepositoryInterface'
  15. import { Email } from '@standardnotes/domain-core'
  16. const inputArgs = process.argv.slice(2)
  17. const backupEmail = inputArgs[0]
  18. const requestBackups = async (
  19. userRepository: UserRepositoryInterface,
  20. settingRepository: SettingRepositoryInterface,
  21. roleService: RoleServiceInterface,
  22. domainEventFactory: DomainEventFactoryInterface,
  23. domainEventPublisher: DomainEventPublisherInterface,
  24. ): Promise<void> => {
  25. const permissionName = PermissionName.DailyEmailBackup
  26. const muteEmailsSettingName = SettingName.NAMES.MuteFailedBackupsEmails
  27. const muteEmailsSettingValue = MuteFailedBackupsEmailsOption.Muted
  28. const emailOrError = Email.create(backupEmail)
  29. if (emailOrError.isFailed()) {
  30. throw new Error('Could not trigger email backup for user - missing email parameter')
  31. }
  32. const email = emailOrError.getValue()
  33. const user = await userRepository.findOneByUsernameOrEmail(email)
  34. if (user === null) {
  35. throw new Error(`Could not find user with email: ${backupEmail}`)
  36. }
  37. const userIsPermittedForEmailBackups = await roleService.userHasPermission(user.uuid, permissionName)
  38. if (!userIsPermittedForEmailBackups) {
  39. throw new Error(`User ${backupEmail} is not permitted for email backups`)
  40. }
  41. let userHasEmailsMuted = false
  42. const emailsMutedSetting = await settingRepository.findOneByNameAndUserUuid(muteEmailsSettingName, user.uuid)
  43. if (emailsMutedSetting !== null && emailsMutedSetting.value !== null) {
  44. userHasEmailsMuted = emailsMutedSetting.value === muteEmailsSettingValue
  45. }
  46. await domainEventPublisher.publish(
  47. domainEventFactory.createEmailBackupRequestedEvent(
  48. user.uuid,
  49. emailsMutedSetting?.uuid as string,
  50. userHasEmailsMuted,
  51. ),
  52. )
  53. return
  54. }
  55. const container = new ContainerConfigLoader('worker')
  56. void container.load().then((container) => {
  57. dayjs.extend(utc)
  58. const env: Env = new Env()
  59. env.load()
  60. const logger: Logger = container.get(TYPES.Auth_Logger)
  61. logger.info(`Starting email backup requesting for ${backupEmail} ...`)
  62. const settingRepository: SettingRepositoryInterface = container.get(TYPES.Auth_SettingRepository)
  63. const userRepository: UserRepositoryInterface = container.get(TYPES.Auth_UserRepository)
  64. const roleService: RoleServiceInterface = container.get(TYPES.Auth_RoleService)
  65. const domainEventFactory: DomainEventFactoryInterface = container.get(TYPES.Auth_DomainEventFactory)
  66. const domainEventPublisher: DomainEventPublisherInterface = container.get(TYPES.Auth_DomainEventPublisher)
  67. Promise.resolve(
  68. requestBackups(userRepository, settingRepository, roleService, domainEventFactory, domainEventPublisher),
  69. )
  70. .then(() => {
  71. logger.info(`Email backup requesting complete for ${backupEmail}`)
  72. process.exit(0)
  73. })
  74. .catch((error) => {
  75. logger.error(`Could not finish email backup requesting for ${backupEmail}: ${error.message}`)
  76. process.exit(1)
  77. })
  78. })