Files
NextChair/src/services/notifications/providers/index.ts
T
2026-08-03 21:15:24 +01:00

54 lines
2.5 KiB
TypeScript

import "server-only";
import { BrevoEmailProvider, loadBrevoEmailProviderConfigFromEnv } from "./brevo-email-provider";
import { ConsoleEmailProvider } from "./console-email-provider";
import { ConsolePushProvider } from "./console-push-provider";
import type { EmailProvider } from "./email-provider";
import type { PushProvider } from "./push-provider";
import { WebPushProvider, loadWebPushProviderConfigFromEnv } from "./web-push-provider";
export type { EmailAddress, EmailProvider, EmailSendResult, SendEmailParams } from "./email-provider";
export type { PushProvider, PushSendResult, PushSubscriptionKeys, SendPushParams } from "./push-provider";
export { BrevoEmailProvider } from "./brevo-email-provider";
export { ConsoleEmailProvider } from "./console-email-provider";
export { MockEmailProvider } from "./mock-email-provider";
export { ConsolePushProvider } from "./console-push-provider";
export { MockPushProvider } from "./mock-push-provider";
export { WebPushProvider } from "./web-push-provider";
let cachedEmailProvider: EmailProvider | undefined;
let cachedPushProvider: PushProvider | undefined;
/**
* Selected once via `EMAIL_PROVIDER` and cached — never chosen per-call, so
* a single deployment always sends through exactly one path. Defaults to
* "console" whenever real SMTP credentials aren't present (e.g. local dev
* with no .env values filled in), so the app never accidentally tries a
* real send with empty credentials; this must never be the default in a
* deployed environment (see docs/phase-7-summary.md, "Environment
* variables required" — EMAIL_PROVIDER=brevo is required for production).
*/
export function getEmailProvider(): EmailProvider {
if (cachedEmailProvider) return cachedEmailProvider;
const selected = process.env.EMAIL_PROVIDER ?? "console";
if (selected === "brevo") {
cachedEmailProvider = new BrevoEmailProvider(loadBrevoEmailProviderConfigFromEnv());
} else {
cachedEmailProvider = new ConsoleEmailProvider();
}
return cachedEmailProvider;
}
/** Same selection pattern as getEmailProvider() — set PUSH_PROVIDER="web-push" once real VAPID keys are configured for a deployment; defaults to logging instead of sending. */
export function getPushProvider(): PushProvider {
if (cachedPushProvider) return cachedPushProvider;
const selected = process.env.PUSH_PROVIDER ?? "console";
if (selected === "web-push") {
cachedPushProvider = new WebPushProvider(loadWebPushProviderConfigFromEnv());
} else {
cachedPushProvider = new ConsolePushProvider();
}
return cachedPushProvider;
}