const express = require('express');
const app = express();
// Authorization middleware
app.use((req, res, next) => {
const token = req.headers["authorization"];
if (token !== `Bearer ${API_TOKEN}`) {
return res.status(401).json({ error: "Unauthorized" });
}
next();
});
// Webhook endpoint
app.post("/webhook", async (req, res) => {
console.log("Webhook received:", JSON.stringify(req.body, null, 2));
const eventData = req.body;
const { id, type, time, data } = eventData;
const user = data.object;
try {
switch (type) {
case "user.created":
await handleUserCreated(user, time);
break;
case "user.updated":
await handleUserUpdated(user, time);
break;
case "user.deleted":
await handleUserDeleted(user, time);
break;
default:
await handleDefaultEvent(id, type, time, data);
}
console.log(`Webhook event of type '${type}' committed to the database.`);
res.sendStatus(204);
} catch (err) {
console.error("Error processing webhook:", err);
res.status(500).json({ error: "Internal server error" });
}
});
// Specific function for handling the user created event
// In this example we're making sure users are also created in our own database
async function handleUserCreated(user, time) {
const { user_id, email, name, nickname, created_at, updated_at } = user;
const query = `
INSERT INTO users (user_id, email, name, nickname, created_at, updated_at, raw_user, last_event_processed)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
`;
const values = [
user_id,
email,
name,
nickname,
created_at,
updated_at,
user,
time,
];
try {
await getPool().query(query, values);
} catch (err) {
if (err.code === "23505") {
console.error(`Duplicate user_id=${user_id}, skipping insert.`);
} else {
console.error(`Database error while creating user_id=${user_id}:`, err);
throw err;
}
}
}