Advertisement
Guest User

clerk-webhook.ts

a guest
Apr 24th, 2023
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.09 KB | None | 0 0
  1. import { type NextApiRequest, type NextApiResponse } from 'next';
  2. import { PrismaClient } from '@prisma/client';
  3. import { User, type UserJSON } from '@clerk/clerk-sdk-node';
  4. import { type IncomingHttpHeaders } from "http";
  5. import { Webhook, type WebhookRequiredHeaders } from "svix";
  6. import { buffer } from "micro";
  7. import { env } from '../../env.mjs';
  8.  
  9. const prisma = new PrismaClient();
  10.  
  11. // Disable bodyParser so I can validate the webhook signature
  12. export const config = {
  13. api: {
  14. bodyParser: false,
  15. },
  16. };
  17.  
  18. const webhookSecret = env.CLERK_SIGNING_SECRET;
  19.  
  20. export default async function handler(req: NextApiRequestWithSvixRequiredHeaders, res: NextApiResponse) {
  21. const payload = (await buffer(req)).toString();
  22. const headers = req.headers;
  23. const wh = new Webhook(webhookSecret);
  24. let evt: Event | null = null;
  25.  
  26. try {
  27. evt = wh.verify(payload, headers) as Event;
  28. } catch (_) {
  29. return res.status(400).json({ message: 'Invalid webhook signature' });
  30. }
  31.  
  32. const eventType: EventType = evt.type;
  33. if (eventType === "user.created") {
  34. const user = User.fromJSON(evt.data);
  35.  
  36. if (!user.emailAddresses || user.emailAddresses.length === 0 || !user.emailAddresses[0]) {
  37. res.status(400).json({ success: false, message: 'Email address not found' });
  38. return;
  39. }
  40.  
  41. try {
  42. await prisma.user.create({
  43. data: {
  44. id: user.id,
  45. email: user.emailAddresses[0].emailAddress
  46. },
  47. });
  48. } catch (error) {
  49. if (error instanceof Error) {
  50. res.status(500).json({ success: false, message: 'Failed to create user', error: error.message });
  51. } else {
  52. res.status(500).json({ success: false, message: 'Failed to create user', error: 'Unknown error' });
  53. }
  54. return;
  55. }
  56. }
  57.  
  58. res.json({ message: "ok" });
  59. }
  60.  
  61. type NextApiRequestWithSvixRequiredHeaders = NextApiRequest & {
  62. headers: IncomingHttpHeaders & WebhookRequiredHeaders;
  63. };
  64.  
  65. type Event = {
  66. data: UserJSON;
  67. object: "event";
  68. type: EventType;
  69. };
  70.  
  71. type EventType = "user.created" | "user.updated" | "*";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement