44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import { env } from "@/env";
|
|
import { db } from "@/server/db";
|
|
import { users } from "@/server/db/schema";
|
|
import { verifyWebhook } from "@clerk/nextjs/webhooks";
|
|
import { eq } from "drizzle-orm";
|
|
|
|
export async function POST(req: Request) {
|
|
try {
|
|
const evt = await verifyWebhook(req, {
|
|
signingSecret: env.CLERK_WEBHOOK_SIGNING_SECRET,
|
|
});
|
|
|
|
const eventType = evt.type;
|
|
switch (eventType) {
|
|
case "user.created":
|
|
await db.insert(users).values({
|
|
id: evt.data.id,
|
|
name: evt.data.first_name ?? evt.data.last_name,
|
|
image: evt.data.image_url,
|
|
});
|
|
break;
|
|
case "user.updated":
|
|
await db
|
|
.update(users)
|
|
.set({
|
|
name: evt.data.first_name ?? evt.data.last_name,
|
|
image: evt.data.image_url,
|
|
})
|
|
.where(eq(users.id, evt.data.id));
|
|
break;
|
|
case "user.deleted":
|
|
await db.delete(users).where(eq(users.id, evt.data.id!));
|
|
break;
|
|
default:
|
|
console.log("Unknown event type:", eventType);
|
|
break;
|
|
}
|
|
return new Response("Webhook received", { status: 200 });
|
|
} catch (err) {
|
|
console.error("Error verifying webhook:", err);
|
|
return new Response("Error verifying webhook", { status: 400 });
|
|
}
|
|
}
|