user_email_backup.ts 4.0 KB

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