import { Injectable } from '@nestjs/common'; import { PrismaService } from '../Prisma/prisma.service'; @Injectable() export class ClerkService { constructor(private readonly prisma: PrismaService) {} webhook(body: any) { // get the event type const eventType = body.type; // dispatch the event this.dispatchEvent(eventType, body.data); return { message: `Webhook received: ${eventType}` }; } // dispatch the event dispatchEvent(eventType: string, data: any) { // event types: // user.created // user.updated // session.created // session.revoked // session.removed // session.ended // email.created console.log(eventType, data); if (eventType === 'user.created') { this.eventUserCreated(data); } if (eventType === 'user.updated') { this.eventUserUpdated(data); } if (eventType === 'session.created') { this.eventSessionCreated(data); } if (eventType === 'session.revoked') { this.eventSessionRevoked(data); } if (eventType === 'session.removed') { this.eventSessionRemoved(data); } if (eventType === 'session.ended') { this.eventSessionEnded(data); } if (eventType === 'email.created') { this.eventEmailCreated(data); } } async eventUserCreated(data: any) { console.log(data); const primary_email_address_id = data.primary_email_address_id; // get primary email address on email_addresses by querying email_addresses with primary_email_address_id let primary_email_address = data.email_addresses.find( (email: any) => email.id === primary_email_address_id, ); console.log(primary_email_address); if (!primary_email_address) { primary_email_address = ''; } // get user id const user_id = data.id; // get created at and convert to date const created_at = new Date(data.created_at); // get name by combining first_name and last_name const name = `${data.first_name} ${data.last_name}`; const role = 'CUSTOMER'; const phoneNumber = ''; // create user in database await this.prisma.user.create({ data: { id: user_id, email: primary_email_address.email_address ?? '', name: name ?? '', role: role ?? '', createdAt: created_at, phoneNumber: phoneNumber ?? '', }, }); } async eventUserUpdated(data: any) { console.log(data); const user_id = data.id; const name = `${data.first_name} ${data.last_name}`; await this.prisma.user.update({ where: { id: user_id }, data: { name: name }, }); } eventSessionCreated(data: any) { console.log(data); } eventSessionRevoked(data: any) { console.log(data); } eventSessionRemoved(data: any) { console.log(data); } eventSessionEnded(data: any) { console.log(data); } eventEmailCreated(data: any) { console.log(data); } }