76 lines
2.2 KiB
JavaScript
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',
|
|
}
|
|
});
|
|
}
|