import { type NextRequest, NextResponse } from "next/server"; import { neonAuth } from "@/lib/auth/server"; import { prisma } from "@/lib/prisma"; import type { ChatSession } from "@/lib/types"; // MIGRATED: Removed "export const dynamic = 'force-dynamic'" - dynamic by default with Cache Components export async function GET( _request: NextRequest, { params }: { params: Promise<{ id: string }> } ) { const { id } = await params; if (!id) { return NextResponse.json( { error: "Session ID is required" }, { status: 400 } ); } // Verify user is authenticated const { session: authSession, user: authUser } = await neonAuth(); if (!authSession || !authUser?.email) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } // Look up user in our database to get companyId for authorization const user = await prisma.user.findUnique({ where: { email: authUser.email }, select: { companyId: true }, }); if (!user) { return NextResponse.json({ error: "User not found" }, { status: 401 }); } try { const prismaSession = await prisma.session.findUnique({ where: { id }, include: { messages: { orderBy: { order: "asc" }, }, }, }); if (!prismaSession) { return NextResponse.json({ error: "Session not found" }, { status: 404 }); } // Verify user has access to this session (same company) if (prismaSession.companyId !== user.companyId) { return NextResponse.json({ error: "Forbidden" }, { status: 403 }); } // Map Prisma session object to ChatSession type const session: ChatSession = { // Spread prismaSession to include all its properties ...prismaSession, // Override properties that need conversion or specific mapping id: prismaSession.id, // ChatSession.id from Prisma.Session.id sessionId: prismaSession.id, // ChatSession.sessionId from Prisma.Session.id startTime: new Date(prismaSession.startTime), endTime: prismaSession.endTime ? new Date(prismaSession.endTime) : null, createdAt: new Date(prismaSession.createdAt), // Prisma.Session does not have an `updatedAt` field. We'll use `createdAt` as a fallback. // Or, if your business logic implies an update timestamp elsewhere, use that. updatedAt: new Date(prismaSession.createdAt), // Fallback to createdAt // Prisma.Session does not have a `userId` field. userId: null, // Explicitly set to null or map if available from another source // Ensure nullable fields from Prisma are correctly mapped to ChatSession's optional or nullable fields category: prismaSession.category ?? null, language: prismaSession.language ?? null, country: prismaSession.country ?? null, ipAddress: prismaSession.ipAddress ?? null, sentiment: prismaSession.sentiment ?? null, messagesSent: prismaSession.messagesSent ?? undefined, // Use undefined if ChatSession expects number | undefined avgResponseTime: prismaSession.avgResponseTime ?? null, escalated: prismaSession.escalated ?? undefined, forwardedHr: prismaSession.forwardedHr ?? undefined, initialMsg: prismaSession.initialMsg ?? undefined, fullTranscriptUrl: prismaSession.fullTranscriptUrl ?? null, summary: prismaSession.summary ?? null, // New field transcriptContent: null, // Not available in Session model messages: prismaSession.messages?.map((msg) => ({ id: msg.id, sessionId: msg.sessionId, timestamp: msg.timestamp ? new Date(msg.timestamp) : new Date(), role: msg.role, content: msg.content, order: msg.order, createdAt: new Date(msg.createdAt), })) ?? [], // New field - parsed messages }; return NextResponse.json({ session }); } catch (error) { const errorMessage = error instanceof Error ? error.message : "An unknown error occurred"; return NextResponse.json( { error: "Failed to fetch session", details: errorMessage }, { status: 500 } ); } }