templates2.Base.Nuxt/server/utils/email.ts
w4c-templates a7a56fd5e0
Some checks failed
CI / quality (push) Has been cancelled
chore(template): publish Base.Nuxt
2026-10-11 23:23:38 +03:00

45 lines
1.7 KiB
TypeScript

import type { NitroEvent } from './h3-event';
export type EmailMessage = { to: string; subject: string; html: string };
export type EmailResult = { id: string; provider: string };
export interface EmailProvider {
name: string;
send(message: EmailMessage): Promise<EmailResult>;
}
/** Default provider: no keys needed — logs the message. */
class LogProvider implements EmailProvider {
name = 'log';
async send(message: EmailMessage): Promise<EmailResult> {
console.log(`[email:log] to=${message.to} subject="${message.subject}"`);
return { id: `log_${Date.now().toString(36)}`, provider: this.name };
}
}
/** Real provider, activated by RESEND_API_KEY. */
class ResendProvider implements EmailProvider {
name = 'resend';
constructor(private apiKey: string, private from: string) {}
async send(message: EmailMessage): Promise<EmailResult> {
const res = await fetch('https://api.resend.com/emails', {
method: 'POST',
headers: { Authorization: `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ from: this.from, to: message.to, subject: message.subject, html: message.html }),
});
if (!res.ok) throw new Error(`Resend error ${res.status}: ${await res.text()}`);
const data = (await res.json()) as { id: string };
return { id: data.id, provider: this.name };
}
}
export function getEmail(event: NitroEvent): EmailProvider {
const config = useRuntimeConfig(event);
if (config.resendApiKey) return new ResendProvider(config.resendApiKey, config.emailFrom);
return new LogProvider();
}
export function sendEmail(event: NitroEvent, message: EmailMessage): Promise<EmailResult> {
return getEmail(event).send(message);
}