37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { jsonError } from '@/lib/auth-helpers';
|
|
import { getServiceRoleSupabase } from '@/lib/supabase';
|
|
|
|
export const dynamic = 'force-dynamic';
|
|
|
|
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
const ALLOWED_LISTS = new Set(['merch', 'ledger-book', 'The Line', 'The Edge', 'The Correlation', 'The System', 'general']);
|
|
|
|
export async function POST(req: NextRequest) {
|
|
let body: { email?: string; list?: string; honeypot?: string };
|
|
try {
|
|
body = await req.json();
|
|
} catch {
|
|
return jsonError(400, 'Invalid JSON.');
|
|
}
|
|
|
|
// Honeypot — silently accept then drop
|
|
if (body.honeypot) return NextResponse.json({ ok: true });
|
|
|
|
if (!body.email || !EMAIL_RE.test(body.email)) {
|
|
return jsonError(400, 'Enter a valid email.');
|
|
}
|
|
const list = body.list && ALLOWED_LISTS.has(body.list) ? body.list : 'general';
|
|
|
|
const sb = getServiceRoleSupabase();
|
|
if (sb) {
|
|
await sb
|
|
.from('waitlist_signups')
|
|
.insert({ email: body.email.toLowerCase(), list, source: 'web' })
|
|
.select()
|
|
.maybeSingle();
|
|
}
|
|
|
|
return NextResponse.json({ ok: true, list });
|
|
}
|