114 lines
2.9 KiB
TypeScript
114 lines
2.9 KiB
TypeScript
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);
|
|
}
|
|
}
|