Add test endpoint for verifying email configuration
All checks were successful
Deploy / deploy (push) Successful in 2m46s
All checks were successful
Deploy / deploy (push) Successful in 2m46s
POST /api/test/email with {"to": "email@example.com"} to send a test email.
Protected by CRON_SECRET.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
59
src/app/api/test/email/route.ts
Normal file
59
src/app/api/test/email/route.ts
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
// ABOUTME: Test endpoint for verifying email configuration.
|
||||||
|
// ABOUTME: Sends a test email to verify Mailgun integration works.
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import type { DailyEmailData } from "@/lib/email";
|
||||||
|
import { sendDailyEmail } from "@/lib/email";
|
||||||
|
|
||||||
|
export async function POST(request: Request) {
|
||||||
|
// Verify cron secret (reuse same auth as cron endpoints)
|
||||||
|
const authHeader = request.headers.get("authorization");
|
||||||
|
const expectedSecret = process.env.CRON_SECRET;
|
||||||
|
|
||||||
|
if (!expectedSecret || authHeader !== `Bearer ${expectedSecret}`) {
|
||||||
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const body = await request.json().catch(() => ({}));
|
||||||
|
const to = body.to as string;
|
||||||
|
|
||||||
|
if (!to) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: "Missing 'to' email address in request body" },
|
||||||
|
{ status: 400 },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const testData: DailyEmailData = {
|
||||||
|
to,
|
||||||
|
cycleDay: 15,
|
||||||
|
phase: "OVULATION",
|
||||||
|
decision: {
|
||||||
|
status: "TRAIN",
|
||||||
|
reason: "This is a test email to verify Mailgun configuration works!",
|
||||||
|
icon: "🧪",
|
||||||
|
},
|
||||||
|
bodyBatteryCurrent: 85,
|
||||||
|
bodyBatteryYesterdayLow: 45,
|
||||||
|
hrvStatus: "Balanced",
|
||||||
|
weekIntensity: 60,
|
||||||
|
phaseLimit: 80,
|
||||||
|
remainingMinutes: 20,
|
||||||
|
seeds: "Sesame (1-2 tbsp) + Sunflower (1-2 tbsp)",
|
||||||
|
carbRange: "100-150g",
|
||||||
|
ketoGuidance: "No - exit keto, need carbs for ovulation",
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
await sendDailyEmail(testData, "test-user");
|
||||||
|
return NextResponse.json({
|
||||||
|
success: true,
|
||||||
|
message: `Test email sent to ${to}`,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
const message = error instanceof Error ? error.message : "Unknown error";
|
||||||
|
return NextResponse.json(
|
||||||
|
{ success: false, error: message },
|
||||||
|
{ status: 500 },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user