import { connect } from "mongoose"; import CompanyNotificationPolicy from "../../Models/NotificationPolicies/CompanyNotificationPolicy"; import ClientNotificationPreferences from "../../Models/NotificationPolicies/ClientNotificationPreferences"; import ClientCompanyNotificationOverride from "../../Models/NotificationPolicies/ClientCompanyNotificationOverride"; import { ICompanyNotificationPolicy, } from "../../Models/NotificationPolicies/CompanyNotificationPolicy.Interface"; import { IClientNotificationPreferences, } from "../../Models/NotificationPolicies/ClientNotificationPreferences.Interface"; import { IClientCompanyNotificationOverride, } from "../../Models/NotificationPolicies/ClientCompanyNotificationOverride.Interface"; import { NotificationChannel } from "../../Models/NotificationJobs/NotificationJobs.Interface"; export interface SessionUserParams { sessionUser: string; } export interface FindCompanyPolicyParams extends SessionUserParams { companyId: string; } export interface UpsertCompanyPolicyParams extends SessionUserParams { companyId: string; defaultChannels?: NotificationChannel[]; timezone?: string; quietHours?: { from: string; to: string }; reminderRules?: { offset: number; enabled: boolean }[]; } export interface FindClientPreferencesParams extends SessionUserParams { clientId: string; } export interface UpsertClientPreferencesParams extends SessionUserParams { clientId: string; preferredChannels?: NotificationChannel[]; mutedChannels?: NotificationChannel[]; } export interface FindClientCompanyOverrideParams extends SessionUserParams { clientId: string; companyId: string; } export interface UpsertClientCompanyOverrideParams extends SessionUserParams { clientId: string; companyId: string; preferredChannels?: NotificationChannel[]; mutedChannels?: NotificationChannel[]; } export class NotificationPoliciesService { public async getCompanyPolicy( params: FindCompanyPolicyParams ): Promise { await connect(`${process.env.DATABASE_CONNECTION}`); return CompanyNotificationPolicy.findOne(params); } public async upsertCompanyPolicy( params: UpsertCompanyPolicyParams ): Promise { await connect(`${process.env.DATABASE_CONNECTION}`); const data: Partial< Omit > = {}; if (params.defaultChannels !== undefined) data.defaultChannels = params.defaultChannels; if (params.timezone !== undefined) data.timezone = params.timezone; if (params.quietHours !== undefined) data.quietHours = params.quietHours; if (params.reminderRules !== undefined) data.reminderRules = params.reminderRules; return CompanyNotificationPolicy.upsert({ companyId: params.companyId, sessionUser: params.sessionUser, data, }); } public async getClientPreferences( params: FindClientPreferencesParams ): Promise { await connect(`${process.env.DATABASE_CONNECTION}`); return ClientNotificationPreferences.findOne({ userId: params.clientId, sessionUser: params.sessionUser, }); } public async upsertClientPreferences( params: UpsertClientPreferencesParams ): Promise { await connect(`${process.env.DATABASE_CONNECTION}`); const data: Partial< Omit > = {}; if (params.preferredChannels !== undefined) data.preferredChannels = params.preferredChannels; if (params.mutedChannels !== undefined) data.mutedChannels = params.mutedChannels; return ClientNotificationPreferences.upsert({ userId: params.clientId, sessionUser: params.sessionUser, data, }); } public async getClientCompanyOverride( params: FindClientCompanyOverrideParams ): Promise { await connect(`${process.env.DATABASE_CONNECTION}`); return ClientCompanyNotificationOverride.findOne(params); } public async upsertClientCompanyOverride( params: UpsertClientCompanyOverrideParams ): Promise { await connect(`${process.env.DATABASE_CONNECTION}`); const data: Partial< Omit< IClientCompanyNotificationOverride, "id" | "clientId" | "companyId" | "createdAt" | "updatedAt" > > = {}; if (params.preferredChannels !== undefined) data.preferredChannels = params.preferredChannels; if (params.mutedChannels !== undefined) data.mutedChannels = params.mutedChannels; return ClientCompanyNotificationOverride.upsert({ clientId: params.clientId, companyId: params.companyId, sessionUser: params.sessionUser, data, }); } }