@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.
138 lines (132 loc) • 4.14 kB
text/typescript
import debug from 'debug';
import { NextRequest, NextResponse } from 'next/server';
import { serverDBEnv } from '@/config/db';
import { serverDB } from '@/database/server';
import { dateKeys } from '@/libs/next-auth/adapter';
import { NextAuthUserService } from '@/server/services/nextAuthUser';
const log = debug('lobe-next-auth:api:auth:adapter');
/**
* @description Process the db query for the NextAuth adapter.
* Returns the db query result directly and let NextAuth handle the raw results.
* @returns {
* success: boolean; // Only return false if the database query fails or the action is invalid.
* data?: any;
* error?: string;
* }
*/
export async function POST(req: NextRequest) {
try {
// try validate the request
if (
!req.headers.get('Authorization') ||
req.headers.get('Authorization')?.trim() !== `Bearer ${serverDBEnv.KEY_VAULTS_SECRET}`
) {
log('Unauthorized request, missing or invalid Authorization header');
return NextResponse.json({ error: 'Unauthorized', success: false }, { status: 401 });
}
// Parse the request body
const data = await req.json();
log('Received request data:', data);
// Preprocess
if (data?.data) {
for (const key of dateKeys) {
if (data?.data && data.data[key]) {
data.data[key] = new Date(data.data[key]);
continue;
}
}
}
const service = new NextAuthUserService(serverDB);
let result;
switch (data.action) {
case 'createAuthenticator': {
result = await service.createAuthenticator(data.data);
break;
}
case 'createSession': {
result = await service.createSession(data.data);
break;
}
case 'createUser': {
result = await service.createUser(data.data);
break;
}
case 'createVerificationToken': {
result = await service.createVerificationToken(data.data);
break;
}
case 'deleteSession': {
result = await service.deleteSession(data.data);
break;
}
case 'deleteUser': {
result = await service.deleteUser(data.data);
break;
}
case 'getAccount': {
result = await service.getAccount(data.data.providerAccountId, data.data.provider);
break;
}
case 'getAuthenticator': {
result = await service.getAuthenticator(data.data);
break;
}
case 'getSessionAndUser': {
result = await service.getSessionAndUser(data.data);
break;
}
case 'getUser': {
result = await service.getUser(data.data);
break;
}
case 'getUserByAccount': {
result = await service.getUserByAccount(data.data);
break;
}
case 'getUserByEmail': {
result = await service.getUserByEmail(data.data);
break;
}
case 'linkAccount': {
result = await service.linkAccount(data.data);
break;
}
case 'listAuthenticatorsByUserId': {
result = await service.listAuthenticatorsByUserId(data.data);
break;
}
case 'unlinkAccount': {
result = await service.unlinkAccount(data.data);
break;
}
case 'updateAuthenticatorCounter': {
result = await service.updateAuthenticatorCounter(
data.data.credentialID,
data.data.counter,
);
break;
}
case 'updateSession': {
result = await service.updateSession(data.data);
break;
}
case 'updateUser': {
result = await service.updateUser(data.data);
break;
}
case 'useVerificationToken': {
result = await service.useVerificationToken(data.data);
break;
}
default: {
return NextResponse.json({ error: 'Invalid action', success: false }, { status: 400 });
}
}
return NextResponse.json({ data: result, success: true });
} catch (error) {
log('Error processing request:');
log(error);
return NextResponse.json({ error, success: false }, { status: 400 });
}
}
export const runtime = 'nodejs';