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; } /** Default provider: no keys needed — logs the message. */ class LogProvider implements EmailProvider { name = 'log'; async send(message: EmailMessage): Promise { 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 { 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 { return getEmail(event).send(message); }