import { NextRequest, NextResponse } from 'next/server'
import { createServerSupabaseClient } from '@/lib/supabase'
export async function POST(request: NextRequest) {
try {
const formData = await request.formData()
const file = formData.get('file') as File
const userId = formData.get('userId') as string
if (!file) {
return NextResponse.json({ error: 'No file provided' }, { status: 400 })
}
if (!userId) {
return NextResponse.json({ error: 'User ID required' }, { status: 400 })
}
// Validate file type
if (!file.type.startsWith('image/')) {
return NextResponse.json({ error: 'File must be an image' }, { status: 400 })
}
// Validate file size (max 5MB)
if (file.size > 5 * 1024 * 1024) {
return NextResponse.json({ error: 'File size must be less than 5MB' }, { status: 400 })
}
const supabase = createServerSupabaseClient()
// Generate unique filename
const fileExt = file.name.split('.').pop()
const fileName = `${userId}/${Date.now()}-${Math.random().toString(36).substring(2)}.${fileExt}`
const filePath = `book-covers/${fileName}`
// Convert file to buffer
const bytes = await file.arrayBuffer()
const buffer = Buffer.from(bytes)
// Upload to Supabase Storage
const { data, error } = await supabase.storage
.from('book-covers')
.upload(filePath, buffer, {
contentType: file.type,
cacheControl: '3600',
upsert: false
})
if (error) {
console.error('Storage upload error:', error)
return NextResponse.json({ error: 'Failed to upload image' }, { status: 500 })
}
// Get public URL
const { data: { publicUrl } } = supabase.storage
.from('book-covers')
.getPublicUrl(data.path)
return NextResponse.json({
success: true,
imageUrl: publicUrl,
path: data.path
})
} catch (error) {
console.error('Upload API error:', error)
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
}
}