import { NextRequest, NextResponse } from 'next/server' import { writeFile, mkdir } from 'fs/promises' import { join } from 'path' import { existsSync } from 'fs' export async function POST(request: NextRequest) { try { const formData = await request.formData() const file = formData.get('file') as File if (!file) { return NextResponse.json( { error: 'No file uploaded' }, { status: 400 } ) } // Validate file type const validTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp'] if (!validTypes.includes(file.type)) { return NextResponse.json( { error: 'Invalid file type. Only JPEG, PNG, and WebP are allowed.' }, { status: 400 } ) } // Validate file size (max 5MB) const maxSize = 5 * 1024 * 1024 // 5MB if (file.size > maxSize) { return NextResponse.json( { error: 'File size too large. Maximum size is 5MB.' }, { status: 400 } ) } const bytes = await file.arrayBuffer() const buffer = Buffer.from(bytes) // Create uploads directory if it doesn't exist const uploadsDir = join(process.cwd(), 'public', 'uploads') if (!existsSync(uploadsDir)) { await mkdir(uploadsDir, { recursive: true }) } // Generate unique filename const timestamp = Date.now() const originalName = file.name.replace(/[^a-zA-Z0-9.-]/g, '_') const filename = `${timestamp}-${originalName}` const filepath = join(uploadsDir, filename) // Write file await writeFile(filepath, buffer) // Return the public URL const fileUrl = `/uploads/${filename}` return NextResponse.json({ url: fileUrl }, { status: 200 }) } catch (error) { console.error('Error uploading file:', error) return NextResponse.json( { error: 'Failed to upload file' }, { status: 500 } ) } }