diff --git a/libs/dal/src/repositories/base-repository.ts b/libs/dal/src/repositories/base-repository.ts index bc185020819..b7bd3072b95 100644 --- a/libs/dal/src/repositories/base-repository.ts +++ b/libs/dal/src/repositories/base-repository.ts @@ -72,7 +72,7 @@ export class BaseRepository { async find( query: FilterQuery & T_Enforcement, select: ProjectionType = '', - options: { limit?: number; sort?: any; skip?: number } = {} + options: { limit?: number; sort?: any; skip?: number; readPreference?: 'secondaryPreferred' | 'primary' } = {} ): Promise { const data = await this.MongooseModel.find(query, select, { sort: options.sort || null, @@ -80,6 +80,7 @@ export class BaseRepository { .skip(options.skip as number) .limit(options.limit as number) .lean() + .read(options?.readPreference || 'primary') .exec(); return this.mapEntities(data); diff --git a/packages/application-generic/src/usecases/get-subscriber-preference/get-subscriber-preference.usecase.ts b/packages/application-generic/src/usecases/get-subscriber-preference/get-subscriber-preference.usecase.ts index adf94ec77f0..7eb4823f436 100644 --- a/packages/application-generic/src/usecases/get-subscriber-preference/get-subscriber-preference.usecase.ts +++ b/packages/application-generic/src/usecases/get-subscriber-preference/get-subscriber-preference.usecase.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { NotificationTemplateRepository, SubscriberRepository, + SubscriberPreferenceRepository, } from '@novu/dal'; import { ISubscriberPreferenceResponse } from '@novu/shared'; @@ -18,7 +19,8 @@ export class GetSubscriberPreference { private subscriberRepository: SubscriberRepository, private notificationTemplateRepository: NotificationTemplateRepository, private getSubscriberTemplatePreferenceUsecase: GetSubscriberTemplatePreference, - private analyticsService: AnalyticsService + private analyticsService: AnalyticsService, + private subscriberPreferenceRepository: SubscriberPreferenceRepository ) {} async execute( @@ -36,6 +38,18 @@ export class GetSubscriberPreference { true ); + const subscriberPreference = await this.subscriberPreferenceRepository.find( + { + _environmentId: command.environmentId, + _subscriberId: subscriber._id, + _templateId: { + $in: templateList.map((template) => template._id), + }, + }, + 'enabled channels _templateId', + { readPreference: 'secondaryPreferred' } + ); + this.analyticsService.mixpanelTrack( 'Fetch User Preferences - [Notification Center]', '', @@ -46,17 +60,22 @@ export class GetSubscriberPreference { ); return await Promise.all( - templateList.map(async (template) => - this.getSubscriberTemplatePreferenceUsecase.execute( + templateList.map(async (template) => { + const preference = subscriberPreference.find( + (i) => i._templateId === template._id + ); + + return this.getSubscriberTemplatePreferenceUsecase.execute( GetSubscriberTemplatePreferenceCommand.create({ organizationId: command.organizationId, subscriberId: command.subscriberId, environmentId: command.environmentId, template, subscriber, + preference: preference || null, }) - ) - ) + ); + }) ); } } diff --git a/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.command.ts b/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.command.ts index d875c76a829..344653a5be6 100644 --- a/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.command.ts +++ b/packages/application-generic/src/usecases/get-subscriber-template-preference/get-subscriber-template-preference.command.ts @@ -1,4 +1,8 @@ -import { NotificationTemplateEntity, SubscriberEntity } from '@novu/dal'; +import { + NotificationTemplateEntity, + SubscriberEntity, + SubscriberPreferenceEntity, +} from '@novu/dal'; import { IsDefined, IsNotEmpty, IsOptional } from 'class-validator'; import { EnvironmentWithSubscriber } from '../../commands'; @@ -14,4 +18,10 @@ export class GetSubscriberTemplatePreferenceCommand extends EnvironmentWithSubsc @IsOptional() tenant?: ITenantDefine; + + @IsOptional() + preference?: Pick< + SubscriberPreferenceEntity, + 'channels' | '_templateId' | 'enabled' + >; } 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 9d11366046d..e1f7ea8be2b 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 @@ -56,15 +56,17 @@ export class GetSubscriberTemplatePreference { const initialActiveChannels = await this.getActiveChannels(command); const subscriberPreference = - await this.subscriberPreferenceRepository.findOne( - { - _environmentId: command.environmentId, - _subscriberId: subscriber._id, - _templateId: command.template._id, - }, - 'enabled channels', - { readPreference: 'secondaryPreferred' } - ); + command.preference === undefined + ? await this.subscriberPreferenceRepository.findOne( + { + _environmentId: command.environmentId, + _subscriberId: subscriber._id, + _templateId: command.template._id, + }, + 'enabled channels', + { readPreference: 'secondaryPreferred' } + ) + : command.preference; const workflowOverride = await this.getWorkflowOverride(command); const templateChannelPreference = command.template.preferenceSettings; @@ -98,10 +100,13 @@ export class GetSubscriberTemplatePreference { return null; } - const tenant = await this.tenantRepository.findOne({ - _environmentId: command.environmentId, - identifier: command.tenant.identifier, - }); + const tenant = await this.tenantRepository.findOne( + { + _environmentId: command.environmentId, + identifier: command.tenant.identifier, + }, + '_id' + ); if (!tenant) { return null;