| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| // CHAT API - Send and retrieve chat messages | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| // POST /api/chat - Send a chat message | |
| // GET /api/chat?sessionId=xxx&limit=100 - Get chat history | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| import { NextRequest, NextResponse } from 'next/server'; | |
| import { sessionManager } from '@/lib/session-manager'; | |
| export { OPTIONS } from '@/lib/cors'; | |
| export const runtime = 'nodejs'; | |
| export const dynamic = 'force-dynamic'; | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| // GET CHAT HISTORY | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| // GET /api/chat?sessionId=xxx&limit=100 | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| export async function GET(request: NextRequest) { | |
| const { searchParams } = new URL(request.url); | |
| const sessionId = searchParams.get('sessionId'); | |
| const limit = parseInt(searchParams.get('limit') || '100', 10); | |
| if (!sessionId) { | |
| return NextResponse.json({ | |
| success: false, | |
| error: 'Missing required parameter: sessionId' | |
| }, { status: 400 }); | |
| } | |
| const session = sessionManager.getSession(sessionId); | |
| if (!session) { | |
| return NextResponse.json({ | |
| success: false, | |
| error: 'Session not found' | |
| }, { status: 404 }); | |
| } | |
| const messages = sessionManager.getChatMessages(sessionId, limit); | |
| return NextResponse.json({ | |
| success: true, | |
| data: { | |
| messages, | |
| count: messages.length | |
| } | |
| }); | |
| } | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| // SEND CHAT MESSAGE | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| // POST /api/chat | |
| // Body: { | |
| // sessionId: string, // Required: Session ID | |
| // userId: string, // Required: User's unique ID | |
| // userName: string, // Required: User's display name | |
| // message: string, // Required: Chat message content | |
| // isTeacher: boolean // Required: Whether the sender is a teacher | |
| // } | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| export async function POST(request: NextRequest) { | |
| try { | |
| const body = await request.json(); | |
| const { sessionId, userId, userName, message, isTeacher } = body; | |
| // Validate required fields | |
| if (!sessionId || !userId || !userName || !message) { | |
| return NextResponse.json({ | |
| success: false, | |
| error: 'Missing required fields: sessionId, userId, userName, message' | |
| }, { status: 400 }); | |
| } | |
| // Validate message content | |
| if (typeof message !== 'string' || message.trim().length === 0) { | |
| return NextResponse.json({ | |
| success: false, | |
| error: 'Message cannot be empty' | |
| }, { status: 400 }); | |
| } | |
| // Check session exists | |
| const session = sessionManager.getSession(sessionId); | |
| if (!session) { | |
| return NextResponse.json({ | |
| success: false, | |
| error: 'Session not found' | |
| }, { status: 404 }); | |
| } | |
| // Send message | |
| const chatMessage = await sessionManager.sendChatMessage( | |
| sessionId, | |
| userId, | |
| userName, | |
| message.trim(), | |
| isTeacher || false | |
| ); | |
| return NextResponse.json({ | |
| success: true, | |
| data: chatMessage, | |
| message: 'Message sent successfully' | |
| }); | |
| } catch (error) { | |
| return NextResponse.json({ | |
| success: false, | |
| error: 'Invalid JSON body' | |
| }, { status: 400 }); | |
| } | |
| } | |