2026-01-28 23:00:58 -05:00

76 lines
2.2 KiB
JavaScript

// Cloudflare Pages Function - handles waitlist submissions securely
// API key is stored as an environment secret, not in frontend code
export async function onRequestPost(context) {
const { request, env } = context;
// CORS headers
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
};
try {
const body = await request.json();
const { firstName, lastName, phone, email } = body;
// Validate required fields
if (!firstName || !phone) {
return new Response(JSON.stringify({ error: 'Name and phone are required' }), {
status: 400,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
});
}
// Call GHL API with secret key
const ghlResponse = await fetch('https://rest.gohighlevel.com/v1/contacts/', {
method: 'POST',
headers: {
'Authorization': `Bearer ${env.GHL_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
firstName,
lastName: lastName || '',
phone,
email: email || undefined,
tags: ['MCP Waitlist']
})
});
if (!ghlResponse.ok) {
const errorText = await ghlResponse.text();
console.error('GHL API error:', errorText);
return new Response(JSON.stringify({ error: 'Failed to add to waitlist' }), {
status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
});
}
const result = await ghlResponse.json();
return new Response(JSON.stringify({ success: true, contactId: result.contact?.id }), {
status: 200,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
});
} catch (err) {
console.error('Waitlist error:', err);
return new Response(JSON.stringify({ error: 'Server error' }), {
status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
});
}
}
// Handle CORS preflight
export async function onRequestOptions() {
return new Response(null, {
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
}
});
}