import { NextRequest, NextResponse } from 'next/server' import prisma from '@/lib/prisma' import { auth } from '@/auth' import { documentIngestionService } from '@/lib/ai/services/document-ingestion.service' import fs from 'fs' import path from 'path' import { randomUUID } from 'crypto' export async function POST( 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: noteId } = await params const note = await prisma.note.findFirst({ where: { id: noteId, userId: session.user.id, trashedAt: null }, }) if (!note) { return NextResponse.json({ error: 'Note not found' }, { status: 404 }) } const formData = await request.formData() const file = formData.get('file') as File | null if (!file) { return NextResponse.json({ error: 'No file provided' }, { status: 400 }) } if (file.size > 20 * 1024 * 1024) { return NextResponse.json({ error: 'File too large (max 20MB)' }, { status: 400 }) } if (file.type !== 'application/pdf') { return NextResponse.json({ error: 'Only PDF files are supported' }, { status: 400 }) } const dir = path.join(process.cwd(), 'data', 'uploads', 'attachments', noteId) fs.mkdirSync(dir, { recursive: true }) const fileId = randomUUID() const filePath = path.join(dir, `${fileId}.pdf`) fs.writeFileSync(filePath, Buffer.from(await file.arrayBuffer())) const attachment = await prisma.noteAttachment.create({ data: { noteId, fileName: file.name, fileType: file.type, fileSize: file.size, filePath, mimeType: file.type, status: 'pending', }, }) setImmediate(() => { documentIngestionService.ingest(attachment.id).catch((err) => { console.error('Document ingestion failed:', err) }) }) return NextResponse.json({ success: true, data: attachment }, { status: 201 }) } catch (error) { console.error('Error uploading attachment:', error) return NextResponse.json({ error: 'Upload failed' }, { status: 500 }) } } export async function GET( 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: noteId } = await params const note = await prisma.note.findFirst({ where: { id: noteId, userId: session.user.id, trashedAt: null }, }) if (!note) { return NextResponse.json({ error: 'Note not found' }, { status: 404 }) } const attachments = await prisma.noteAttachment.findMany({ where: { noteId }, orderBy: { createdAt: 'desc' }, select: { id: true, fileName: true, fileSize: true, mimeType: true, status: true, pageCount: true, error: true, createdAt: true, }, }) return NextResponse.json({ success: true, data: attachments }) } catch (error) { console.error('Error fetching attachments:', error) return NextResponse.json({ error: 'Failed to fetch attachments' }, { status: 500 }) } }