import { sendCompleteRegistrationEvent } from '@/lib/monitoring/metaPixelUnescoPetition'; import { supabase, supabaseServiceRole } from '@/lib/supabase'; import { buildSignatureData, uploadCameraFile, validateCameraFile, validateFormData, } from '@/lib/unescoFormHelper'; import type { APIRoute } from 'astro'; export const POST: APIRoute = async ({ request, clientAddress }) => { const headers = { 'Content-Type': 'application/json' }; try { const formData = await request.formData(); const validationResult = validateFormData(formData); if (!validationResult.valid) { return new Response(JSON.stringify({ success: false, message: validationResult.message }), { status: 400, headers, }); } const realName = formData.get('realName')?.toString(); const email = formData.get('email')?.toString() || ''; const location = formData.get('location')?.toString(); const instagramUsername = formData.get('instagramUsername')?.toString(); const cameraFile = formData.get('cameraFile') as File | null; const workosUserId = formData.get('workosUserId')?.toString() || null; if (cameraFile && cameraFile.size > 0) { const fileValidationError = validateCameraFile(cameraFile); if (fileValidationError) { return new Response(JSON.stringify({ success: false, message: fileValidationError }), { status: 400, headers, }); } } const signatureData = buildSignatureData( email, workosUserId, clientAddress, request.headers.get('user-agent'), realName, location, instagramUsername ); const db = supabaseServiceRole ?? supabase; const { data: insertedSignature, error: insertError } = await db .from('unesco_petition_signatures') .insert(signatureData) .select('id') .single(); if (insertError) { return new Response( JSON.stringify({ success: false, message: 'Failed to save your signature. Please try again.', }), { status: 500, headers } ); } if (cameraFile && cameraFile.size > 0 && insertedSignature?.id) { const photoUrl = await uploadCameraFile(cameraFile, insertedSignature.id); if (photoUrl) { await db .from('unesco_petition_signatures') .update({ photo_proof_url: photoUrl }) .eq('id', insertedSignature.id); } } const { data: currentCounter } = await db .from('unesco_petition_counter') .select('signatures_count') .single(); const newCount = currentCounter?.signatures_count || 0; const eventSourceUrl = `${new URL(request.url).origin}/unesco`; sendCompleteRegistrationEvent( signatureData.email, eventSourceUrl, signatureData.user_agent, signatureData.ip_address, signatureData.home_location ).catch(() => {}); return new Response( JSON.stringify({ success: true, message: 'Thank you for signing the petition!', signatureCount: newCount, }), { status: 200, headers } ); } catch (error) { return new Response( JSON.stringify({ success: false, message: 'The server was not able to get your signature. Please text me on Instagram (@palacejunwon) and I will fix this problem!', }), { status: 500, headers } ); } };