import { NextRequest, NextResponse } from 'next/server' import prisma from '@/lib/prisma' import { auth } from '@/auth' import { revalidatePath } from 'next/cache' async function getDescendantIds(notebookId: string): Promise { const ids: string[] = [] const children = await prisma.notebook.findMany({ where: { parentId: notebookId }, select: { id: true }, }) for (const child of children) { ids.push(child.id) ids.push(...await getDescendantIds(child.id)) } return ids } export async function PATCH( request: NextRequest, { params }: { params: Promise<{ id: string }> } ) { const session = await auth() if (!session?.user?.id) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) } try { const { id } = await params const body = await request.json() const { name, icon, color, order, trashedAt } = body const existing = await prisma.notebook.findUnique({ where: { id }, select: { userId: true } }) if (!existing) { return NextResponse.json( { success: false, error: 'Notebook not found' }, { status: 404 } ) } if (existing.userId !== session.user.id) { return NextResponse.json( { success: false, error: 'Forbidden' }, { status: 403 } ) } const updateData: any = {} if (name !== undefined) updateData.name = name.trim() if (icon !== undefined) updateData.icon = icon if (color !== undefined) updateData.color = color if (order !== undefined) updateData.order = order if (trashedAt !== undefined) updateData.trashedAt = trashedAt if (trashedAt !== undefined) { const descendantIds = await getDescendantIds(id) const allIds = [id, ...descendantIds] await prisma.notebook.updateMany({ where: { id: { in: allIds }, userId: session.user.id }, data: { trashedAt }, }) } else { await prisma.notebook.update({ where: { id }, data: updateData, }) } try { revalidatePath('/') } catch {} return NextResponse.json({ success: true }) } catch (error) { console.error('Error updating notebook:', error) return NextResponse.json( { success: false, error: 'Failed to update notebook' }, { status: 500 } ) } } export async function DELETE( request: NextRequest, { params }: { params: Promise<{ id: string }> } ) { const session = await auth() if (!session?.user?.id) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) } try { const { id } = await params const notebook = await prisma.notebook.findUnique({ where: { id }, select: { userId: true, name: true } }) if (!notebook) { return NextResponse.json( { success: false, error: 'Notebook not found' }, { status: 404 } ) } if (notebook.userId !== session.user.id) { return NextResponse.json( { success: false, error: 'Forbidden' }, { status: 403 } ) } await prisma.notebook.delete({ where: { id } }) try { revalidatePath('/') } catch {} return NextResponse.json({ success: true, message: `Notebook "${notebook.name}" permanently deleted`, }) } catch (error) { console.error('Error deleting notebook:', error) return NextResponse.json( { success: false, error: 'Failed to delete notebook' }, { status: 500 } ) } }