import { NextResponse } from 'next/server'; import { prisma } from '@/lib/db'; import { getCurrentAdmin, AdminPermission, hasPermission } from '@/lib/admin-auth'; export const runtime = 'nodejs'; export async function GET(request: Request) { try { const admin = await getCurrentAdmin(request as any); if (!admin || !hasPermission(admin, AdminPermission.READ_CHAT)) { return NextResponse.json( { error: 'Unauthorized' }, { status: 401 } ); } const url = new URL(request.url); const page = parseInt(url.searchParams.get('page') || '0'); const pageSize = parseInt(url.searchParams.get('pageSize') || '10'); const search = url.searchParams.get('search') || ''; const status = url.searchParams.get('status') || 'all'; const language = url.searchParams.get('language') || 'all'; const sortBy = url.searchParams.get('sortBy') || 'lastMessage'; // Build where clause for filtering const where: any = {}; if (search) { where.OR = [ { title: { contains: search, mode: 'insensitive' } }, { user: { email: { contains: search, mode: 'insensitive' } } }, { user: { name: { contains: search, mode: 'insensitive' } } } ]; } if (status !== 'all') { where.isActive = status === 'active'; } if (language !== 'all') { where.language = language; } // Build order by clause let orderBy: any = { lastMessageAt: 'desc' }; switch (sortBy) { case 'created': orderBy = { createdAt: 'desc' }; break; case 'messageCount': orderBy = { messages: { _count: 'desc' } }; break; case 'lastMessage': default: orderBy = { lastMessageAt: 'desc' }; break; } // Get total count for pagination const total = await prisma.chatConversation.count({ where }); // Get conversations with pagination const conversations = await prisma.chatConversation.findMany({ where, select: { id: true, title: true, language: true, isActive: true, createdAt: true, updatedAt: true, lastMessageAt: true, user: { select: { id: true, email: true, name: true, role: true } }, _count: { select: { messages: true } }, messages: { select: { id: true, role: true, content: true, timestamp: true }, orderBy: { timestamp: 'desc' }, take: 1 } }, orderBy, skip: page * pageSize, take: pageSize }); // Add conversation statistics const stats = { total: await prisma.chatConversation.count(), active: await prisma.chatConversation.count({ where: { isActive: true } }), inactive: await prisma.chatConversation.count({ where: { isActive: false } }), today: await prisma.chatConversation.count({ where: { createdAt: { gte: new Date(new Date().setHours(0, 0, 0, 0)) } } }), thisWeek: await prisma.chatConversation.count({ where: { createdAt: { gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) } } }) }; return NextResponse.json({ conversations, stats, pagination: { page, pageSize, total, totalPages: Math.ceil(total / pageSize) } }); } catch (error) { console.error('Admin chat conversations list error:', error); return NextResponse.json( { error: 'Server error' }, { status: 500 } ); } }