refactor source code

This commit is contained in:
2024-10-29 17:42:54 +07:00
parent 3b23d9e0b7
commit 152bb50da8
83 changed files with 8473 additions and 7577 deletions

View File

@@ -5,9 +5,9 @@ import {
ExecutionContext,
Inject,
UnauthorizedException,
} from '@nestjs/common';
import Clerk from '@clerk/express';
import { GqlExecutionContext } from '@nestjs/graphql';
} from '@nestjs/common'
import Clerk from '@clerk/express'
import { GqlExecutionContext } from '@nestjs/graphql'
@Injectable()
export class ClerkAuthGuard implements CanActivate {
@@ -15,36 +15,36 @@ export class ClerkAuthGuard implements CanActivate {
async canActivate(context: ExecutionContext): Promise<boolean> {
// For GraphQL, get the request from the GQL context
const ctx = GqlExecutionContext.create(context);
const request = ctx.getContext().req;
const ctx = GqlExecutionContext.create(context)
const request = ctx.getContext().req
// Get the token from the Authorization header
const authHeader = request.headers['authorization'];
const authHeader = request.headers['authorization']
if (!authHeader) {
throw new UnauthorizedException('Authorization header not found');
throw new UnauthorizedException('Authorization header not found')
}
const token = authHeader.split(' ')[1]; // Assuming 'Bearer TOKEN'
const token = authHeader.split(' ')[1] // Assuming 'Bearer TOKEN'
if (!token) {
throw new UnauthorizedException('Token not found');
throw new UnauthorizedException('Token not found')
}
try {
// Verify the token with Clerk
const session = await this.clerk.verifyToken(token, {});
const session = await this.clerk.verifyToken(token, {})
if (!session) {
throw new UnauthorizedException('Invalid session');
throw new UnauthorizedException('Invalid session')
}
// Attach user info to the request context if needed
request.user = session.user;
request.user = session.user
return true;
return true
} catch (error: any) {
throw new UnauthorizedException(error.message);
throw new UnauthorizedException(error.message)
}
}
}

View File

@@ -7,9 +7,9 @@ import {
Param,
Body,
Headers,
} from '@nestjs/common';
import { ClerkService } from './clerk.service';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
} from '@nestjs/common'
import { ClerkService } from './clerk.service'
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger'
@ApiTags('Clerk')
@Controller('clerk')
export class ClerkController {
@@ -19,8 +19,8 @@ export class ClerkController {
@ApiOperation({ summary: 'Clerk Webhook' })
@ApiResponse({ status: 200, description: 'Webhook created successfully' })
webhook(@Headers() headers: any, @Body() body: any) {
return this.clerkService.webhook(body);
return this.clerkService.webhook(body)
}
}
export default ClerkController;
export default ClerkController

View File

@@ -1,7 +1,7 @@
import { Module, Global } from '@nestjs/common';
import Clerk from '@clerk/express';
import { ClerkService } from './clerk.service';
import ClerkController from './clerk.controller';
import { Module, Global } from '@nestjs/common'
import Clerk from '@clerk/express'
import { ClerkService } from './clerk.service'
import ClerkController from './clerk.controller'
@Global()
@Module({
providers: [

View File

@@ -1,17 +1,17 @@
import { Injectable, Logger } from '@nestjs/common';
import { Injectable, Logger } from '@nestjs/common'
import { PrismaService } from '../Prisma/prisma.service';
import { clerkClient } from '@clerk/express';
import { PrismaService } from '../Prisma/prisma.service'
import { clerkClient } from '@clerk/express'
@Injectable()
export class ClerkService {
constructor(private readonly prisma: PrismaService) {}
webhook(body: any) {
// get the event type
const eventType = body.type;
const eventType = body.type
// dispatch the event
this.dispatchEvent(eventType, body.data);
return { message: `Webhook received: ${eventType}` };
this.dispatchEvent(eventType, body.data)
return { message: `Webhook received: ${eventType}` }
}
// dispatch the event
dispatchEvent(eventType: string, data: any) {
@@ -23,53 +23,53 @@ export class ClerkService {
// session.removed
// session.ended
// email.created
console.log(eventType, data);
console.log(eventType, data)
if (eventType === 'user.created') {
this.eventUserCreated(data);
this.eventUserCreated(data)
}
if (eventType === 'user.updated') {
this.eventUserUpdated(data);
this.eventUserUpdated(data)
}
if (eventType === 'session.created') {
this.eventSessionCreated(data);
this.eventSessionCreated(data)
}
if (eventType === 'session.revoked') {
this.eventSessionRevoked(data);
this.eventSessionRevoked(data)
}
if (eventType === 'session.removed') {
this.eventSessionRemoved(data);
this.eventSessionRemoved(data)
}
if (eventType === 'session.ended') {
this.eventSessionEnded(data);
this.eventSessionEnded(data)
}
if (eventType === 'email.created') {
this.eventEmailCreated(data);
this.eventEmailCreated(data)
}
}
async eventUserCreated(data: any) {
const primary_email_address_id = data.primary_email_address_id;
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);
)
console.log(primary_email_address)
if (!primary_email_address) {
primary_email_address = '';
primary_email_address = ''
}
// get user id
const user_id = data.id;
const user_id = data.id
// get created at and convert to date
const created_at = new Date(data.created_at);
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 = '';
const name = `${data.first_name} ${data.last_name}`
const role = 'CUSTOMER'
const phoneNumber = ''
// create user in database
try {
await this.prisma.user.create({
@@ -81,32 +81,32 @@ export class ClerkService {
createdAt: created_at,
phoneNumber: phoneNumber ?? '',
},
});
})
} catch (err) {
Logger.error(err);
Logger.error(err)
}
}
async eventUserUpdated(data: any) {
console.log(data);
const user_id = data.id;
const name = `${data.first_name} ${data.last_name}`;
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 },
});
})
}
async eventSessionCreated(data: any) {
console.log(data);
console.log(data)
// check if user exists in database or create user
const user = await this.prisma.user.findUnique({
where: { id: data.user_id },
});
})
if (!user) {
// get user info from clerk
const userInfo = await clerkClient.users.getUser(data.user_id);
console.log(userInfo);
const userInfo = await clerkClient.users.getUser(data.user_id)
console.log(userInfo)
try {
await this.prisma.user.create({
data: {
@@ -115,27 +115,27 @@ export class ClerkService {
name: `${userInfo.firstName} ${userInfo.lastName}`,
avatarUrl: userInfo.imageUrl,
},
});
})
} catch (err) {
Logger.error(err);
Logger.error(err)
}
}
// to do: get session info
}
eventSessionRevoked(data: any) {
console.log(data);
console.log(data)
}
eventSessionRemoved(data: any) {
console.log(data);
console.log(data)
}
eventSessionEnded(data: any) {
console.log(data);
console.log(data)
}
eventEmailCreated(data: any) {
console.log(data);
console.log(data)
}
}