import { NextRequest, NextResponse } from 'next/server' import prisma from '@/lib/prisma' import { CheckItem } from '@/lib/types' // Helper to parse JSON fields function parseNote(dbNote: any) { return { ...dbNote, checkItems: dbNote.checkItems ? JSON.parse(dbNote.checkItems) : null, labels: dbNote.labels ? JSON.parse(dbNote.labels) : null, images: dbNote.images ? JSON.parse(dbNote.images) : null, } } // GET /api/notes - Get all notes export async function GET(request: NextRequest) { try { const searchParams = request.nextUrl.searchParams const includeArchived = searchParams.get('archived') === 'true' const search = searchParams.get('search') let where: any = {} 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('GET /api/notes error:', 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) { 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: { title: title || null, content: content || '', color: color || 'default', type: type || 'text', checkItems: checkItems ? JSON.stringify(checkItems) : null, labels: labels ? JSON.stringify(labels) : null, images: images ? JSON.stringify(images) : null, } }) return NextResponse.json({ success: true, data: parseNote(note) }, { status: 201 }) } catch (error) { console.error('POST /api/notes error:', 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) { 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 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 ? JSON.stringify(checkItems) : null if (labels !== undefined) updateData.labels = labels ? JSON.stringify(labels) : null if (isPinned !== undefined) updateData.isPinned = isPinned if (isArchived !== undefined) updateData.isArchived = isArchived if (images !== undefined) updateData.images = images ? JSON.stringify(images) : null const note = await prisma.note.update({ where: { id }, data: updateData }) return NextResponse.json({ success: true, data: parseNote(note) }) } catch (error) { console.error('PUT /api/notes error:', 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) { 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 } ) } await prisma.note.delete({ where: { id } }) return NextResponse.json({ success: true, message: 'Note deleted successfully' }) } catch (error) { console.error('DELETE /api/notes error:', error) return NextResponse.json( { success: false, error: 'Failed to delete note' }, { status: 500 } ) } }