70 lines
2.3 KiB
JavaScript
70 lines
2.3 KiB
JavaScript
/**
|
|
* Cloudflare Worker: MCPEngage Waitlist → GoHighLevel proxy
|
|
* Hides the API key server-side. Deploy to: waitlist.mcpengage.com or similar
|
|
*/
|
|
export default {
|
|
async fetch(request, env) {
|
|
// CORS preflight
|
|
if (request.method === 'OPTIONS') {
|
|
return new Response(null, {
|
|
headers: {
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'POST, OPTIONS',
|
|
'Access-Control-Allow-Headers': 'Content-Type',
|
|
'Access-Control-Max-Age': '86400',
|
|
},
|
|
});
|
|
}
|
|
|
|
if (request.method !== 'POST') {
|
|
return new Response(JSON.stringify({ error: 'POST only' }), { status: 405, headers: { 'Content-Type': 'application/json' } });
|
|
}
|
|
|
|
try {
|
|
const body = await request.json();
|
|
|
|
// Validate required fields
|
|
if (!body.firstName || !body.lastName || !body.phone) {
|
|
return new Response(JSON.stringify({ error: 'firstName, lastName, and phone are required' }), {
|
|
status: 400,
|
|
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
|
|
});
|
|
}
|
|
|
|
// Build GHL contact payload
|
|
const ghlPayload = {
|
|
firstName: body.firstName,
|
|
lastName: body.lastName,
|
|
name: body.firstName + ' ' + body.lastName,
|
|
phone: body.phone,
|
|
tags: body.tags || ['MCP waitlist'],
|
|
source: body.source || 'MCPEngage Waitlist',
|
|
locationId: env.GHL_LOCATION_ID || 'DZEpRd43MxUJKdtrev9t',
|
|
};
|
|
if (body.email) ghlPayload.email = body.email;
|
|
|
|
const ghlRes = await fetch('https://services.leadconnectorhq.com/contacts/', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Authorization': 'Bearer ' + (env.GHL_API_KEY || ''),
|
|
'Content-Type': 'application/json',
|
|
'Version': '2021-07-28',
|
|
},
|
|
body: JSON.stringify(ghlPayload),
|
|
});
|
|
|
|
const ghlData = await ghlRes.json();
|
|
|
|
return new Response(JSON.stringify({ ok: ghlRes.ok, contact: ghlData.contact?.id || null }), {
|
|
status: ghlRes.ok ? 200 : 500,
|
|
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
|
|
});
|
|
} catch (err) {
|
|
return new Response(JSON.stringify({ error: err.message }), {
|
|
status: 500,
|
|
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
|
|
});
|
|
}
|
|
},
|
|
};
|