Files
GibSend/apps/web/src/app/api/dev/email-preview/route.ts
2025-09-08 18:08:57 +10:00

72 lines
2.2 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import {
renderOtpEmail,
renderTeamInviteEmail,
renderUsageWarningEmail,
renderUsageLimitReachedEmail,
} from "~/server/email-templates";
export async function GET(request: NextRequest) {
const { searchParams } = new URL(request.url);
const type = searchParams.get("type") || "otp";
if (process.env.NODE_ENV !== "development") {
return NextResponse.json({ error: "Not Found" }, { status: 404 });
}
try {
let html: string;
if (type === "otp") {
html = await renderOtpEmail({
otpCode: "ABC123",
loginUrl: "https://app.usesend.com/login?token=abc123",
hostName: "useSend",
});
} else if (type === "invite") {
html = await renderTeamInviteEmail({
teamName: "My Awesome Team",
inviteUrl: "https://app.usesend.com/join-team?inviteId=123",
inviterName: "John Doe",
role: "admin",
});
} else if (type === "usage-warning") {
const isPaidPlan = searchParams.get("isPaidPlan") === "true";
const period = searchParams.get("period") || "daily";
html = await renderUsageWarningEmail({
teamName: "Acme Inc",
used: 8000,
limit: 10000,
period: period as "daily" | "monthly",
manageUrl: "https://app.usesend.com/settings/billing",
isPaidPlan: isPaidPlan,
});
} else if (type === "usage-limit") {
const isPaidPlan = searchParams.get("isPaidPlan") === "true";
const period = searchParams.get("period") || "daily";
html = await renderUsageLimitReachedEmail({
teamName: "Acme Inc",
limit: 10000,
period: period as "daily" | "monthly",
manageUrl: "https://app.usesend.com/settings/billing",
isPaidPlan: isPaidPlan,
});
} else {
return NextResponse.json({ error: "Invalid type" }, { status: 400 });
}
return new NextResponse(html, {
headers: {
"Content-Type": "text/html",
},
});
} catch (error) {
console.error("Error rendering email template:", error);
return NextResponse.json(
{ error: "Failed to render email template" },
{ status: 500 }
);
}
}