import { NextRequest, NextResponse } from 'next/server' import prisma from '@/lib/prisma' import { auth } from '@/auth' import { parseNote } from '@/lib/utils' // GET /api/notes - Get all notes export async function GET(request: NextRequest) { const session = await auth() if (!session?.user?.id) { return NextResponse.json( { success: false, error: 'Unauthorized' }, { status: 401 } ) } try { const searchParams = request.nextUrl.searchParams const includeArchived = searchParams.get('archived') === 'true' const search = searchParams.get('search') let where: any = { userId: session.user.id, trashedAt: null } if (!includeArchived) { where.isArchived = false } if (search) { where.OR = [ { title: { contains: search, mode: 'insensitive' } }, { content: { contains: search, mode: 'insensitive' } } ] } const notes = await prisma.note.findMany({ where, orderBy: [ { isPinned: 'desc' }, { order: 'asc' }, { updatedAt: 'desc' } ] }) return NextResponse.json({ success: true, data: notes.map(parseNote) }) } catch (error) { console.error('Error fetching notes:', error) return NextResponse.json( { success: false, error: 'Failed to fetch notes' }, { status: 500 } ) } } // POST /api/notes - Create a new note export async function POST(request: NextRequest) { const session = await auth() if (!session?.user?.id) { return NextResponse.json( { success: false, error: 'Unauthorized' }, { status: 401 } ) } try { const body = await request.json() const { title, content, color, type, checkItems, labels, images } = body if (!content && type !== 'checklist') { return NextResponse.json( { success: false, error: 'Content is required' }, { status: 400 } ) } const note = await prisma.note.create({ data: { userId: session.user.id, title: title || null, content: content || '', color: color || 'default', type: type || 'text', checkItems: checkItems ?? null, labels: labels ?? null, images: images ?? null, } }) return NextResponse.json({ success: true, data: parseNote(note) }, { status: 201 }) } catch (error) { console.error('Error creating note:', error) return NextResponse.json( { success: false, error: 'Failed to create note' }, { status: 500 } ) } } // PUT /api/notes - Update an existing note export async function PUT(request: NextRequest) { const session = await auth() if (!session?.user?.id) { return NextResponse.json( { success: false, error: 'Unauthorized' }, { status: 401 } ) } try { const body = await request.json() const { id, title, content, color, type, checkItems, labels, isPinned, isArchived, images } = body if (!id) { return NextResponse.json( { success: false, error: 'Note ID is required' }, { status: 400 } ) } const existingNote = await prisma.note.findUnique({ where: { id } }) if (!existingNote) { return NextResponse.json( { success: false, error: 'Note not found' }, { status: 404 } ) } if (existingNote.userId !== session.user.id) { return NextResponse.json( { success: false, error: 'Forbidden' }, { status: 403 } ) } const updateData: any = {} if (title !== undefined) updateData.title = title if (content !== undefined) updateData.content = content if (color !== undefined) updateData.color = color if (type !== undefined) updateData.type = type if (checkItems !== undefined) updateData.checkItems = checkItems ?? null if (labels !== undefined) updateData.labels = labels ?? null if (isPinned !== undefined) updateData.isPinned = isPinned if (isArchived !== undefined) updateData.isArchived = isArchived if (images !== undefined) updateData.images = images ?? null const note = await prisma.note.update({ where: { id }, data: updateData }) return NextResponse.json({ success: true, data: parseNote(note) }) } catch (error) { console.error('Error updating note:', error) return NextResponse.json( { success: false, error: 'Failed to update note' }, { status: 500 } ) } } // DELETE /api/notes?id=xxx - Delete a note export async function DELETE(request: NextRequest) { const session = await auth() if (!session?.user?.id) { return NextResponse.json( { success: false, error: 'Unauthorized' }, { status: 401 } ) } try { const searchParams = request.nextUrl.searchParams const id = searchParams.get('id') if (!id) { return NextResponse.json( { success: false, error: 'Note ID is required' }, { status: 400 } ) } const existingNote = await prisma.note.findUnique({ where: { id } }) if (!existingNote) { return NextResponse.json( { success: false, error: 'Note not found' }, { status: 404 } ) } if (existingNote.userId !== session.user.id) { return NextResponse.json( { success: false, error: 'Forbidden' }, { status: 403 } ) } await prisma.note.update({ where: { id }, data: { trashedAt: new Date() } }) return NextResponse.json({ success: true, message: 'Note moved to trash' }) } catch (error) { console.error('Error deleting note:', error) return NextResponse.json( { success: false, error: 'Failed to delete note' }, { status: 500 } ) } }