UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

96 lines (79 loc) 2.79 kB
import { NextResponse } from 'next/server'; import { authEnv } from '@/config/auth'; import { isServerMode } from '@/const/version'; import { pino } from '@/libs/logger'; import { UserService } from '@/server/services/user'; import { validateRequest } from './validateRequest'; if (authEnv.NEXT_PUBLIC_ENABLE_CLERK_AUTH && isServerMode && !authEnv.CLERK_WEBHOOK_SECRET) { throw new Error('`CLERK_WEBHOOK_SECRET` environment variable is missing'); } export const POST = async (req: Request): Promise<NextResponse> => { const payload = await validateRequest(req, authEnv.CLERK_WEBHOOK_SECRET!); if (!payload) { return NextResponse.json( { error: 'webhook verification failed or payload was malformed' }, { status: 400 }, ); } const { type, data } = payload; pino.trace(`clerk webhook payload: ${{ data, type }}`); const userService = new UserService(); switch (type) { case 'user.created': { pino.info('creating user due to clerk webhook'); const result = await userService.createUser(data.id, data); return NextResponse.json(result, { status: 200 }); } case 'user.deleted': { if (!data.id) { pino.warn('clerk sent a delete user request, but no user ID was included in the payload'); return NextResponse.json({ message: 'ok' }, { status: 200 }); } pino.info('delete user due to clerk webhook'); await userService.deleteUser(data.id); return NextResponse.json({ message: 'user deleted' }, { status: 200 }); } case 'user.updated': { const result = await userService.updateUser(data.id, data); return NextResponse.json(result, { status: 200 }); } default: { pino.warn( `${req.url} received event type "${type}", but no handler is defined for this type`, ); return NextResponse.json({ error: `unrecognised payload type: ${type}` }, { status: 400 }); } // case 'user.updated': // break; // case 'session.created': // break; // case 'session.ended': // break; // case 'session.removed': // break; // case 'session.revoked': // break; // case 'email.created': // break; // case 'sms.created': // break; // case 'organization.created': // break; // case 'organization.updated': // break; // case 'organization.deleted': // break; // case 'organizationMembership.created': // break; // case 'organizationMembership.deleted': // break; // case 'organizationMembership.updated': // break; // case 'organizationInvitation.accepted': // break; // case 'organizationInvitation.created': // break; // case 'organizationInvitation.revoked': // break; } };