app.post('/webhooks/ranked', express.raw({ type: 'application/json' }), async (req, res) => {
const signature = req.headers['x-webhook-signature'];
const payload = req.body.toString();
// Verify signature
if (!verifyWebhook(payload, signature, process.env.RANKED_WEBHOOK_SECRET)) {
return res.status(401).send();
}
const event = JSON.parse(payload);
// 1. Store raw event immediately
await db.query(
'INSERT INTO webhook_events (event_type, project_id, payload, signature) VALUES ($1, $2, $3, $4)',
[event.event, event.project_id, event, signature]
);
// 2. Return 200 quickly
res.status(200).send('OK');
// 3. Process asynchronously
try {
await processEvent(event);
await db.query("UPDATE webhook_events SET status = 'processed' WHERE payload->>'timestamp' = $1", [event.timestamp]);
} catch (err) {
await db.query("UPDATE webhook_events SET status = 'failed' WHERE payload->>'timestamp' = $1", [event.timestamp]);
console.error('Failed to process event:', err);
}
});