62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import { webhookPayloadSchema } from 'src/schemas'
|
|
import { recordCreated, recordUpdated, recordDeleted } from '../events'
|
|
import * as bp from '.botpress'
|
|
|
|
export function safeJsonParse(x: any) {
|
|
try {
|
|
return { data: JSON.parse(x), success: true }
|
|
} catch {
|
|
return { data: x, success: false }
|
|
}
|
|
}
|
|
|
|
export const handler: bp.IntegrationProps['handler'] = async ({ req, logger, client }) => {
|
|
if (!req.body) {
|
|
const errorMsg = 'Webhook processing failed: empty body'
|
|
logger.forBot().error(errorMsg)
|
|
return {
|
|
status: 400,
|
|
body: JSON.stringify({ error: errorMsg }),
|
|
}
|
|
}
|
|
|
|
// Parse and validate the webhook payload
|
|
const webhookData = safeJsonParse(req.body)
|
|
if (!webhookData.success) {
|
|
const errorMsg = 'Webhook processing failed: invalid JSON'
|
|
logger.forBot().error(errorMsg)
|
|
return { status: 400, body: JSON.stringify({ error: errorMsg }) }
|
|
}
|
|
|
|
const parseResult = webhookPayloadSchema.safeParse(webhookData.data)
|
|
if (!parseResult.success) {
|
|
const errorMsg = `Webhook processing failed: ${parseResult.error.message}`
|
|
logger.forBot().error(errorMsg)
|
|
return { status: 400, body: JSON.stringify({ error: errorMsg }) }
|
|
}
|
|
|
|
const { webhook_id, events } = parseResult.data
|
|
logger.forBot().info(`Processing webhook ${webhook_id} with ${events.length} events`)
|
|
|
|
// Process each event
|
|
for (const attioEvent of events) {
|
|
const event = attioEvent.event_type
|
|
|
|
switch (event) {
|
|
case 'record.created':
|
|
await recordCreated({ payload: attioEvent, client, logger })
|
|
break
|
|
case 'record.updated':
|
|
await recordUpdated({ payload: attioEvent, client, logger })
|
|
break
|
|
case 'record.deleted':
|
|
await recordDeleted({ payload: attioEvent, client, logger })
|
|
break
|
|
default:
|
|
logger.forBot().warn(`Unsupported event type: ${event}`)
|
|
}
|
|
}
|
|
|
|
return { status: 200 }
|
|
}
|