64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import { getAppConfiguration } from "~/utils/db/appConfiguration.db.server";
|
|
import { createScopedLogger } from "~/utils/logger.server";
|
|
import { sendEmailMailjet } from "./MailjetEmailService";
|
|
|
|
const emailLogger = createScopedLogger("email");
|
|
|
|
type EmailProvider = "mailjet";
|
|
|
|
export async function sendEmail({
|
|
request,
|
|
to,
|
|
subject,
|
|
body,
|
|
alias,
|
|
data,
|
|
tenantId,
|
|
priorityOverride,
|
|
}: {
|
|
request: Request;
|
|
to: string;
|
|
subject: string;
|
|
body: string;
|
|
alias?: string;
|
|
data?: {
|
|
[key: string]: any;
|
|
};
|
|
tenantId?: string | null;
|
|
priorityOverride?: "critical" | "high" | "normal" | "low";
|
|
}) {
|
|
const config = await getEmailConfig({ request, throwError: true });
|
|
if (!config) {
|
|
throw new Error("Email provider not configured");
|
|
}
|
|
// Intentionally never log `to`, `subject`, `body`, or `data` (PII).
|
|
// Only log provider class, presence-of-alias, and a generic flag for template data.
|
|
emailLogger.info(
|
|
{
|
|
provider: config.provider,
|
|
hasAlias: typeof alias === "string" && alias.length > 0,
|
|
hasTemplateData: Boolean(data),
|
|
},
|
|
"Sending email",
|
|
);
|
|
return await sendEmailMailjet({ data: { to, subject, body, alias, data, tenantId, priorityOverride } });
|
|
}
|
|
|
|
export async function getEmailProvider({ request }: { request: Request }) {
|
|
const clientConfig = await getEmailConfig({ request });
|
|
return clientConfig?.provider;
|
|
}
|
|
|
|
export async function getEmailConfig({ request, throwError = false }: { request: Request; throwError?: boolean }) {
|
|
const appConfiguration = await getAppConfiguration({ request });
|
|
let provider = appConfiguration.email.provider;
|
|
if (provider === "mailjet") {
|
|
return appConfiguration.email;
|
|
}
|
|
emailLogger.error({ provider: provider ?? "<none>" }, "Email provider not configured");
|
|
if (throwError) {
|
|
throw new Error("Email provider not configured");
|
|
}
|
|
return null;
|
|
}
|