import { NextApiRequest, NextApiResponse } from 'next'; import NewsletterSchema from '../../utils/schemas/NewsletterSchema'; import getSentryClient from '../../utils/sentry'; const headers = { Accept: 'application/json', 'Content-Type': 'application/json', Authorization: `Bearer ${process.env.INTERCOM_TOKEN}`, 'Intercom-Version': '2.0' }; async function searchContactId(email: string): Promise { const contactReq = await fetch( 'https://api.intercom.io/contacts/search', { method: 'POST', headers: headers, body: JSON.stringify({ query: { field: 'email', operator: '=', value: email } }) } ); const contact = await contactReq.json(); return contact.data[0]?.id; } async function updateContact(id: string): Promise { await fetch( `https://api.intercom.io/contacts/${id}`, { method: 'PUT', headers: headers, body: JSON.stringify({ unsubscribed_from_emails: false }) } ); } async function createContact(email: string): Promise { const contactReq = await fetch( 'https://api.intercom.io/contacts', { method: 'POST', headers: headers, body: JSON.stringify({ email, role: 'lead', unsubscribed_from_emails: false }) } ); const contact = await contactReq.json(); return contact?.id; } async function createOrUpdateCompany(email: string): Promise { const companyReq = await fetch( 'https://api.intercom.io/companies', { method: 'POST', headers: headers, body: JSON.stringify({ company_id: email, custom_attributes: { Source: 'Easyblog' } }) } ); const company = await companyReq.json(); return company?.id; } async function attachCompanyToContact(contactId: string, companyId: string): Promise { await fetch( `https://api.intercom.io/contacts/${contactId}/companies`, { method: 'POST', headers: headers, body: JSON.stringify({ id: companyId }) } ); } export default async (req: NextApiRequest, res: NextApiResponse): Promise => { if (req.method === 'POST') { const body = JSON.parse(req.body); try { NewsletterSchema.validateSync(body); } catch (e) { return res.status(400).send('Payload is invalid'); } try { let contactId = await searchContactId(body.email); if (contactId) { await updateContact(contactId); } else { contactId = await createContact(body.email); const companyId = await createOrUpdateCompany(body.email); await attachCompanyToContact(contactId, companyId); } } catch (err) { if (err.status) { getSentryClient().captureException(new Error( `Error create or update contact intercom email : ${body.email}, ${err.status ? `status ${err.status}` : ''}` )); } } return res.status(200).send('ok'); } else { return res.status(405).send('Invalid method'); } }