update webhook

This commit is contained in:
2024-10-13 16:22:07 +07:00
parent 56c11a4b77
commit 641c0622a5
7 changed files with 153 additions and 10 deletions

View File

@@ -0,0 +1,26 @@
import {
Controller,
Get,
Post,
Put,
Delete,
Param,
Body,
Headers,
} from '@nestjs/common';
import { ClerkService } from './clerk.service';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
@ApiTags('Clerk')
@Controller('clerk')
export class ClerkController {
constructor(private readonly clerkService: ClerkService) {}
@Post('webhook')
@ApiOperation({ summary: 'Clerk Webhook' })
@ApiResponse({ status: 200, description: 'Webhook created successfully' })
webhook(@Body() body: any) {
return this.clerkService.webhook(body);
}
}
export default ClerkController;

View File

@@ -1,6 +1,7 @@
import { Module, Global } from '@nestjs/common';
import Clerk from '@clerk/clerk-sdk-node';
import { ClerkService } from './clerk.service';
import ClerkController from './clerk.controller';
@Global()
@Module({
providers: [
@@ -8,7 +9,9 @@ import Clerk from '@clerk/clerk-sdk-node';
provide: 'CLERK',
useValue: Clerk,
},
ClerkService,
],
exports: ['CLERK'],
controllers: [ClerkController],
exports: ['CLERK', ClerkService],
})
export class ClerkModule {}

View File

@@ -0,0 +1,108 @@
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);
// create a user in the database
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 ?? '',
},
});
}
eventUserUpdated(data: any) {
console.log(data);
}
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);
}
}

View File

@@ -15,12 +15,12 @@ import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
export class RestfulController {
constructor(private readonly restfulService: RestfulService) {}
// @Get()
// @ApiOperation({ summary: 'Get all items' })
// @ApiResponse({ status: 200, description: 'Returns all items.' })
// getAllItems() {
// return this.restfulService.getAllItems();
// }
@Get()
@ApiOperation({ summary: 'Get all items' })
@ApiResponse({ status: 200, description: 'Returns all items.' })
getAllItems() {
return this.restfulService.getAllItems();
}
// @Get(':id')
// @ApiOperation({ summary: 'Get an item by ID' })

View File

@@ -1,8 +1,10 @@
import { Module } from '@nestjs/common';
import { RestfulController } from './restful.controller';
import { RestfulService } from './restful.service';
import { ClerkModule } from '../Clerk/clerk.module';
@Module({
imports: [ClerkModule],
controllers: [RestfulController],
providers: [RestfulService],
})

View File

@@ -1,4 +1,8 @@
import { Injectable } from '@nestjs/common';
@Injectable()
export class RestfulService {}
export class RestfulService {
getAllItems() {
throw new Error('Method not implemented.');
}
}

File diff suppressed because one or more lines are too long