import { NextRequest, NextResponse } from 'next/server' import { prisma } from '@/lib/prisma' import { auth } from '@/lib/auth' export const dynamic = 'force-dynamic' // GET /api/wx-users/[id] - Get a wx user and all levels with completion state export async function GET( request: NextRequest, { params }: { params: Promise<{ id: string }> } ) { try { const session = await auth.api.getSession({ headers: request.headers, }) if (!session) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) } const { id } = await params const user = await prisma.wxUser.findUnique({ where: { id }, select: { id: true, openid: true, sessionKey: true, nickname: true, avatarUrl: true, stamina: true, staminaUpdatedAt: true, createdAt: true, updatedAt: true, levelProgress: { orderBy: [ { level: { sortOrder: 'asc' } }, { completedAt: 'desc' }, ], select: { id: true, userId: true, levelId: true, completedAt: true, timeSpent: true, level: { select: { id: true, answer: true, sortOrder: true, }, }, }, }, }, }) if (!user) { return NextResponse.json({ error: 'User not found' }, { status: 404 }) } const levels = await prisma.level.findMany({ orderBy: { sortOrder: 'asc' }, select: { id: true, answer: true, sortOrder: true, }, }) const progressByLevelId = new Map( user.levelProgress.map((progress) => [progress.levelId, progress]) ) return NextResponse.json({ id: user.id, openid: user.openid, sessionKey: user.sessionKey, nickname: user.nickname, avatarUrl: user.avatarUrl, stamina: user.stamina, staminaUpdatedAt: user.staminaUpdatedAt, createdAt: user.createdAt, updatedAt: user.updatedAt, completedLevelCount: user.levelProgress.length, assignedLevels: levels.map((level) => { const progress = progressByLevelId.get(level.id) return { id: level.id, answer: level.answer, sortOrder: level.sortOrder, completed: Boolean(progress), progressId: progress?.id || null, completedAt: progress?.completedAt || null, } }), }) } catch (error) { console.error('Error fetching wx user:', error) return NextResponse.json( { error: 'Failed to fetch wx user' }, { status: 500 } ) } }