SettingService.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { SettingName } from '@standardnotes/settings'
  2. import { inject, injectable } from 'inversify'
  3. import { Logger } from 'winston'
  4. import TYPES from '../../Bootstrap/Types'
  5. import { User } from '../User/User'
  6. import { CreateOrReplaceSettingDto } from './CreateOrReplaceSettingDto'
  7. import { CreateOrReplaceSettingResponse } from './CreateOrReplaceSettingResponse'
  8. import { FindSettingDTO } from './FindSettingDTO'
  9. import { Setting } from './Setting'
  10. import { SettingRepositoryInterface } from './SettingRepositoryInterface'
  11. import { SettingServiceInterface } from './SettingServiceInterface'
  12. import { SettingsAssociationServiceInterface } from './SettingsAssociationServiceInterface'
  13. import { SettingInterpreterInterface } from './SettingInterpreterInterface'
  14. import { SettingDecrypterInterface } from './SettingDecrypterInterface'
  15. import { SettingFactoryInterface } from './SettingFactoryInterface'
  16. @injectable()
  17. export class SettingService implements SettingServiceInterface {
  18. constructor(
  19. @inject(TYPES.Auth_SettingFactory) private factory: SettingFactoryInterface,
  20. @inject(TYPES.Auth_SettingRepository) private settingRepository: SettingRepositoryInterface,
  21. @inject(TYPES.Auth_SettingsAssociationService)
  22. private settingsAssociationService: SettingsAssociationServiceInterface,
  23. @inject(TYPES.Auth_SettingInterpreter) private settingInterpreter: SettingInterpreterInterface,
  24. @inject(TYPES.Auth_SettingDecrypter) private settingDecrypter: SettingDecrypterInterface,
  25. @inject(TYPES.Auth_Logger) private logger: Logger,
  26. ) {}
  27. async applyDefaultSettingsUponRegistration(user: User): Promise<void> {
  28. let defaultSettingsWithValues = this.settingsAssociationService.getDefaultSettingsAndValuesForNewUser()
  29. if (user.isPotentiallyAPrivateUsernameAccount()) {
  30. defaultSettingsWithValues =
  31. this.settingsAssociationService.getDefaultSettingsAndValuesForNewPrivateUsernameAccount()
  32. }
  33. for (const settingName of defaultSettingsWithValues.keys()) {
  34. this.logger.debug(`Creating setting ${settingName} for user ${user.uuid}`)
  35. const setting = defaultSettingsWithValues.get(settingName) as {
  36. value: string
  37. sensitive: boolean
  38. serverEncryptionVersion: number
  39. }
  40. await this.createOrReplace({
  41. user,
  42. props: {
  43. name: settingName,
  44. unencryptedValue: setting.value,
  45. serverEncryptionVersion: setting.serverEncryptionVersion,
  46. sensitive: setting.sensitive,
  47. },
  48. })
  49. }
  50. }
  51. async findSettingWithDecryptedValue(dto: FindSettingDTO): Promise<Setting | null> {
  52. let setting: Setting | null
  53. if (dto.settingUuid !== undefined) {
  54. setting = await this.settingRepository.findOneByUuid(dto.settingUuid)
  55. } else {
  56. setting = await this.settingRepository.findLastByNameAndUserUuid(dto.settingName.value, dto.userUuid)
  57. }
  58. if (setting === null) {
  59. return null
  60. }
  61. setting.value = await this.settingDecrypter.decryptSettingValue(setting, dto.userUuid)
  62. return setting
  63. }
  64. async createOrReplace(dto: CreateOrReplaceSettingDto): Promise<CreateOrReplaceSettingResponse> {
  65. const { user, props } = dto
  66. const settingNameOrError = SettingName.create(props.name)
  67. if (settingNameOrError.isFailed()) {
  68. throw new Error(settingNameOrError.getError())
  69. }
  70. const settingName = settingNameOrError.getValue()
  71. const existing = await this.findSettingWithDecryptedValue({
  72. userUuid: user.uuid,
  73. settingName,
  74. settingUuid: props.uuid,
  75. })
  76. if (existing === null) {
  77. const setting = await this.settingRepository.save(await this.factory.create(props, user))
  78. this.logger.debug('[%s] Created setting %s: %O', user.uuid, props.name, setting)
  79. await this.settingInterpreter.interpretSettingUpdated(setting.name, user, props.unencryptedValue)
  80. return {
  81. status: 'created',
  82. setting,
  83. }
  84. }
  85. const setting = await this.settingRepository.save(await this.factory.createReplacement(existing, props))
  86. this.logger.debug('[%s] Replaced existing setting %s with: %O', user.uuid, props.name, setting)
  87. await this.settingInterpreter.interpretSettingUpdated(setting.name, user, props.unencryptedValue)
  88. return {
  89. status: 'replaced',
  90. setting,
  91. }
  92. }
  93. }