task-managment / src / app / api / webhooks / route.ts
route.ts
Raw
import { Webhook } from "svix";
import { headers } from "next/headers";
import { userFacadeService } from "@/server/user/application/facade";
import { User } from "@/server/user/domain/models";
import { WebhookEvent } from "@clerk/nextjs/server";


export async function POST(req: Request) {
  const SIGNING_SECRET = process.env.SIGNING_SECRET;
  if (!SIGNING_SECRET) {
    throw new Error("Missing SIGNING_SECRET in environment variables");
  }

  const wh = new Webhook(SIGNING_SECRET);
  const headerPayload = headers();
  const svix_id = headerPayload.get("svix-id");
  const svix_timestamp = headerPayload.get("svix-timestamp");
  const svix_signature = headerPayload.get("svix-signature");

  if (!svix_id || !svix_timestamp || !svix_signature) {
    return new Response("Missing Svix headers", { status: 400 });
  }

  const payload = await req.json();
  const body: any = JSON.stringify(payload);

  let evt: WebhookEvent;
  try {
    evt = wh.verify(body, {
      "svix-id": svix_id,
      "svix-timestamp": svix_timestamp,
      "svix-signature": svix_signature,
    }) as WebhookEvent;
  } catch (err) {
    return new Response("Verification error", { status: 400 });
  }


  console.log('meta data',payload?.data?.meta_data)

  const newUser: User = {
    id: payload?.data?.id,
    firstName: payload?.data?.first_name,
    lastName: payload?.data?.last_name,
    email: payload?.data?.email_addresses?.[0]?.email_address,
    isActive: true,
    rol:payload?.data?.meta_data?.role
  };

  if (evt.type === "user.updated") {
    await userFacadeService.updateUserDb(newUser);
  }

  if (evt.type === "user.deleted") {
    await userFacadeService.deleteUserDb({ value: payload?.data?.id });
  }

  return new Response("Webhook received", { status: 200 });
}