From d827513b73a57fbdb72c3112f32dc2a296103450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karol=20S=C3=B3jko?= Date: Thu, 9 Mar 2023 06:34:50 +0100 Subject: [PATCH] fix(auth): migrate encrypted sign in settings --- packages/auth/bin/migrate_email_settings.ts | 21 ++++++++++++++++--- .../Setting/SettingRepositoryInterface.ts | 1 + .../src/Infra/MySQL/MySQLSettingRepository.ts | 10 +++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/auth/bin/migrate_email_settings.ts b/packages/auth/bin/migrate_email_settings.ts index a3b523800..0c2047212 100644 --- a/packages/auth/bin/migrate_email_settings.ts +++ b/packages/auth/bin/migrate_email_settings.ts @@ -20,6 +20,7 @@ import { UserSubscriptionServiceInterface } from '../src/Domain/Subscription/Use import { UserRepositoryInterface } from '../src/Domain/User/UserRepositoryInterface' import { SubscriptionSettingServiceInterface } from '../src/Domain/Setting/SubscriptionSettingServiceInterface' import { EncryptionVersion } from '../src/Domain/Encryption/EncryptionVersion' +import { SettingServiceInterface } from '../src/Domain/Setting/SettingServiceInterface' const requestSettingMigration = async ( settingRepository: SettingRepositoryInterface, @@ -28,10 +29,10 @@ const requestSettingMigration = async ( userSubscriptionService: UserSubscriptionServiceInterface, domainEventFactory: DomainEventFactoryInterface, domainEventPublisher: DomainEventPublisherInterface, + settingService: SettingServiceInterface, ): Promise => { - const stream = await settingRepository.streamAllByNameAndValue( + const stream = await settingRepository.streamAllByName( SettingName.create(SettingName.NAMES.MuteSignInEmails).getValue(), - 'muted', ) return new Promise((resolve, reject) => { @@ -70,13 +71,25 @@ const requestSettingMigration = async ( return } + const typeORMSetting = await settingService.findSettingWithDecryptedValue({ + settingName: SettingName.create(SettingName.NAMES.MuteSignInEmails).getValue(), + settingUuid: setting.setting_uuid, + userUuid: user.uuid, + }) + + if (!typeORMSetting) { + callback() + + return + } + await subscriptionSettingService.createOrReplace({ userSubscription: subscription, props: { name: SettingName.NAMES.MuteSignInEmails, sensitive: false, serverEncryptionVersion: EncryptionVersion.Unencrypted, - unencryptedValue: 'muted', + unencryptedValue: typeORMSetting.value, }, }) @@ -113,6 +126,7 @@ void container.load().then((container) => { ) const userRepository: UserRepositoryInterface = container.get(TYPES.UserRepository) const userSubscriptionService: UserSubscriptionServiceInterface = container.get(TYPES.UserSubscriptionService) + const settingService: SettingServiceInterface = container.get(TYPES.SettingService) Promise.resolve( requestSettingMigration( @@ -122,6 +136,7 @@ void container.load().then((container) => { userSubscriptionService, domainEventFactory, domainEventPublisher, + settingService, ), ) .then(() => { diff --git a/packages/auth/src/Domain/Setting/SettingRepositoryInterface.ts b/packages/auth/src/Domain/Setting/SettingRepositoryInterface.ts index b09e4e1e1..9513323dd 100644 --- a/packages/auth/src/Domain/Setting/SettingRepositoryInterface.ts +++ b/packages/auth/src/Domain/Setting/SettingRepositoryInterface.ts @@ -11,6 +11,7 @@ export interface SettingRepositoryInterface { findLastByNameAndUserUuid(name: string, userUuid: string): Promise findAllByUserUuid(userUuid: string): Promise streamAllByNameAndValue(name: SettingName, value: string): Promise + streamAllByName(name: SettingName): Promise deleteByUserUuid(dto: DeleteSettingDto): Promise save(setting: Setting): Promise } diff --git a/packages/auth/src/Infra/MySQL/MySQLSettingRepository.ts b/packages/auth/src/Infra/MySQL/MySQLSettingRepository.ts index 27c7220bb..0e8faaaa5 100644 --- a/packages/auth/src/Infra/MySQL/MySQLSettingRepository.ts +++ b/packages/auth/src/Infra/MySQL/MySQLSettingRepository.ts @@ -29,6 +29,16 @@ export class MySQLSettingRepository implements SettingRepositoryInterface { .getOne() } + async streamAllByName(name: SettingName): Promise { + return this.ormRepository + .createQueryBuilder('setting') + .where('setting.name = :name', { + name: name.value, + }) + .orderBy('updated_at', 'ASC') + .stream() + } + async streamAllByNameAndValue(name: SettingName, value: string): Promise { return this.ormRepository .createQueryBuilder('setting')