From cd040269a9ca64bd70fd0db18c930d6903f2f594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82?= Date: Thu, 22 Jun 2023 19:22:15 +0200 Subject: [PATCH] chore(application-generic): refactor the get subscriber preferences use-case functions --- ...criber-template-preference.usecase.spec.ts | 12 +- ...-subscriber-template-preference.usecase.ts | 112 ++++++------------ 2 files changed, 40 insertions(+), 84 deletions(-) diff --git a/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.spec.ts b/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.spec.ts index a6c356d0d20..e1793ebe99b 100644 --- a/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.spec.ts +++ b/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.spec.ts @@ -1,10 +1,10 @@ import { - determineOverrides, + overridePreferences, filteredPreference, } from './get-subscriber-template-preference.usecase'; import { ChannelTypeEnum } from '@novu/shared'; -describe('determineOverrides', function () { +describe('overridePreferences', function () { beforeEach(function () {}); it('should be overridden by the subscribers preference', async function () { @@ -21,7 +21,7 @@ describe('determineOverrides', function () { push: false, }; - const { preferences, overrides } = determineOverrides( + const { channels, overrides } = overridePreferences( { template: templateChannelPreference, subscriber: subscriberChannelPreference, @@ -43,7 +43,7 @@ describe('determineOverrides', function () { push: false, }; - expect(preferences).toEqual(expectedPreferenceResult); + expect(channels).toEqual(expectedPreferenceResult); expect( overrides.find((override) => override.channel === 'email').source ).toEqual('subscriber'); @@ -71,7 +71,7 @@ describe('determineOverrides', function () { }; const subscriberChannelPreference = {}; - const { preferences, overrides } = determineOverrides( + const { channels, overrides } = overridePreferences( { template: templateChannelPreference, subscriber: subscriberChannelPreference, @@ -93,7 +93,7 @@ describe('determineOverrides', function () { push: true, }; - expect(preferences).toEqual(expectedPreferenceResult); + expect(channels).toEqual(expectedPreferenceResult); expect( overrides.find((override) => override.channel === 'email').source ).toEqual('template'); diff --git a/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.ts b/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.ts index b31bd5e1552..6a5b9870255 100644 --- a/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.ts +++ b/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.usecase.ts @@ -21,6 +21,8 @@ import { GetSubscriberTemplatePreferenceCommand } from './get-subscriber-templat import { ApiException } from '../../utils/exceptions'; import { CachedEntity, buildSubscriberKey } from '../../services'; +const PRIORITY_ORDER = ['template', 'subscriber']; + @Injectable() export class GetSubscriberTemplatePreference { constructor( @@ -50,24 +52,23 @@ export class GetSubscriberTemplatePreference { _templateId: command.template._id, }); - const templateConfiguration = mapTemplateConfiguration(command.template); - const templatePreferred = subscriberPreference?.enabled ?? true; const subscriberChannelPreference = subscriberPreference?.channels; const templateChannelPreference = command.template.preferenceSettings; - const { channelPreferences, overrides } = - this.getChannelPreferenceAndOverrides( - templateChannelPreference, - subscriberChannelPreference, - initialActiveChannels - ); + const { channels, overrides } = overridePreferences( + { + template: templateChannelPreference, + subscriber: subscriberChannelPreference, + }, + initialActiveChannels + ); return { - template: templateConfiguration, + template: mapTemplateConfiguration(command.template), preference: { - enabled: templatePreferred, - channels: channelPreferences, - overrides: overrides, + enabled: subscriberPreference?.enabled ?? true, + channels, + overrides, }, }; } @@ -90,22 +91,6 @@ export class GetSubscriberTemplatePreference { return initialActiveChannels; } - private getChannelPreferenceAndOverrides( - templateChannelPreference, - subscriberChannelPreference, - initialActiveChannels: IPreferenceChannels - ) { - const { preferences, overrides } = determineOverrides( - { - template: templateChannelPreference, - subscriber: subscriberChannelPreference, - }, - initialActiveChannels - ); - - return { channelPreferences: preferences, overrides }; - } - private async queryActiveChannels( command: GetSubscriberTemplatePreferenceCommand ): Promise { @@ -189,80 +174,51 @@ function updateOverrideReasons( } } -export function determineOverrides( - preferenceSources: Record<'template' | 'subscriber', IPreferenceChannels>, - initialActiveChannels: IPreferenceChannels -) { - const priorityOrder = ['template', 'subscriber']; - - let result: { - overrideReasons: IPreferenceOverride[]; - preferences: IPreferenceChannels; - } = { - overrideReasons: [], - preferences: { ...initialActiveChannels }, - }; - - result = overridePreferenceBySourcePriority( - priorityOrder, - preferenceSources, - result - ); - - return { - preferences: result.preferences, - overrides: result.overrideReasons, - }; -} - function overridePreference( oldPreferenceState: { - overrideReasons: IPreferenceOverride[]; - preferences: IPreferenceChannels; + overrides: IPreferenceOverride[]; + channels: IPreferenceChannels; }, sourcePreference: IPreferenceChannels, sourceName: string ) { - const resultPreferences = { ...oldPreferenceState.preferences }; - const resultOverrideReasons = [...oldPreferenceState.overrideReasons]; + const channels = { ...oldPreferenceState.channels }; + const overrides = [...oldPreferenceState.overrides]; for (const [channelName, channelValue] of Object.entries(sourcePreference)) { - if (typeof resultPreferences[channelName] !== 'boolean') continue; + if (typeof channels[channelName] !== 'boolean') continue; - const index = resultOverrideReasons.findIndex( + const index = overrides.findIndex( (overrideReason) => overrideReason.channel === channelName ); - const isSameReason = resultOverrideReasons[index]?.source !== channelValue; + const isSameReason = overrides[index]?.source !== channelValue; if (!isSameReason) continue; - resultPreferences[channelName] = channelValue; - updateOverrideReasons( - channelName, - sourceName, - index, - resultOverrideReasons - ); + channels[channelName] = channelValue; + updateOverrideReasons(channelName, sourceName, index, overrides); } return { - preferences: resultPreferences, - overrideReasons: resultOverrideReasons, + channels, + overrides, }; } -function overridePreferenceBySourcePriority( - priorityOrder: string[], +export function overridePreferences( preferenceSources: Record<'template' | 'subscriber', IPreferenceChannels>, - oldPreferenceState: { - overrideReasons: IPreferenceOverride[]; - preferences: IPreferenceChannels; - } + initialActiveChannels: IPreferenceChannels ) { - let result = { ...oldPreferenceState }; + let result: { + overrides: IPreferenceOverride[]; + channels: IPreferenceChannels; + } = { + overrides: [], + channels: { ...initialActiveChannels }, + }; - for (const sourceName of priorityOrder) { + for (const sourceName of PRIORITY_ORDER) { const sourcePreference = preferenceSources[ sourceName ] as IPreferenceChannels;