import { NextRequest, NextResponse } from 'next/server' import { auth } from '@/auth' import { prisma } from '@/lib/prisma' export async function POST(req: NextRequest) { try { const session = await auth() if (!session?.user?.id) { return NextResponse.json({ success: false, error: 'Unauthorized' }, { status: 401 }) } const userId = session.user.id // 1. Find and delete labels that have no notes and belong to this user // We only delete labels that are not part of a notebook (global labels) const orphanedLabels = await prisma.label.findMany({ where: { userId, notebookId: null, notes: { none: {} } } }) await prisma.label.deleteMany({ where: { id: { in: orphanedLabels.map(l => l.id) } } }) // 2. Clean up NoteEmbeddings that don't have a corresponding Note const orphanedEmbeddings: Array<{ id: string }> = await prisma.$queryRawUnsafe( `SELECT e.id FROM "NoteEmbedding" e LEFT JOIN "Note" n ON n.id = e."noteId" WHERE n.id IS NULL` ) if (orphanedEmbeddings.length > 0) { await prisma.$executeRawUnsafe( `DELETE FROM "NoteEmbedding" WHERE id = ANY(${`ARRAY['${orphanedEmbeddings.map(e => e.id).join("','")}']`}::text[])` ) } // 3. Remove note history entries for notes that were deleted (cascade should handle this, but let's be safe) return NextResponse.json({ success: true, deletedLabels: orphanedLabels.length }) } catch (error) { console.error('Cleanup error:', error) return NextResponse.json( { success: false, error: 'Failed to cleanup data' }, { status: 500 } ) } }