195 lines
5.3 KiB
TypeScript
195 lines
5.3 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import blobStorage from '@/lib/blob-storage'
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const formData = await request.formData()
|
|
const files = formData.getAll('files') as File[]
|
|
const folder = formData.get('folder') as string || 'general'
|
|
const type = formData.get('type') as string || 'general'
|
|
|
|
if (!files || files.length === 0) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'No files provided' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
// Validate files
|
|
for (const file of files) {
|
|
if (!file || file.size === 0) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'Invalid file provided' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
}
|
|
|
|
let uploadResults: any[] = []
|
|
|
|
try {
|
|
// Handle different upload types
|
|
switch (type) {
|
|
case 'product-images': {
|
|
const productName = formData.get('productName') as string
|
|
if (!productName) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'Product name is required for product images' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
const urls = await blobStorage.uploadProductImages(files, productName)
|
|
uploadResults = urls.map(url => ({ url, type: 'product-image' }))
|
|
break
|
|
}
|
|
|
|
case 'category-image': {
|
|
if (files.length > 1) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'Only one category image allowed' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
const categoryName = formData.get('categoryName') as string
|
|
if (!categoryName) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'Category name is required' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
const url = await blobStorage.uploadCategoryImage(files[0], categoryName)
|
|
uploadResults = [{ url, type: 'category-image' }]
|
|
break
|
|
}
|
|
|
|
case 'user-avatar': {
|
|
if (files.length > 1) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'Only one avatar image allowed' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
const userId = formData.get('userId') as string
|
|
if (!userId) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'User ID is required' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
const url = await blobStorage.uploadUserAvatar(files[0], userId)
|
|
uploadResults = [{ url, type: 'user-avatar' }]
|
|
break
|
|
}
|
|
|
|
default: {
|
|
// General file upload
|
|
const results = await blobStorage.uploadMultipleFiles(files, { folder })
|
|
uploadResults = results.map(result => ({
|
|
url: result.url,
|
|
downloadUrl: result.downloadUrl,
|
|
pathname: result.pathname,
|
|
size: result.size,
|
|
uploadedAt: result.uploadedAt,
|
|
type: 'general'
|
|
}))
|
|
break
|
|
}
|
|
}
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: 'Files uploaded successfully',
|
|
data: uploadResults
|
|
})
|
|
|
|
} catch (uploadError) {
|
|
console.error('Upload error:', uploadError)
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
message: uploadError instanceof Error ? uploadError.message : 'Failed to upload files'
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('File upload error:', error)
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
message: 'Internal server error'
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
export async function DELETE(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url)
|
|
const url = searchParams.get('url')
|
|
const urls = searchParams.getAll('urls')
|
|
|
|
if (!url && (!urls || urls.length === 0)) {
|
|
return NextResponse.json(
|
|
{ success: false, message: 'No URL(s) provided for deletion' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
if (url) {
|
|
// Delete single file
|
|
await blobStorage.deleteFile(url)
|
|
} else {
|
|
// Delete multiple files
|
|
await blobStorage.deleteMultipleFiles(urls)
|
|
}
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: 'File(s) deleted successfully'
|
|
})
|
|
|
|
} catch (error) {
|
|
console.error('File deletion error:', error)
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
message: error instanceof Error ? error.message : 'Failed to delete file(s)'
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url)
|
|
const prefix = searchParams.get('prefix')
|
|
const limit = parseInt(searchParams.get('limit') || '100')
|
|
const cursor = searchParams.get('cursor')
|
|
|
|
const result = await blobStorage.listFiles({
|
|
prefix: prefix || undefined,
|
|
limit,
|
|
cursor: cursor || undefined
|
|
})
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
data: result
|
|
})
|
|
|
|
} catch (error) {
|
|
console.error('File listing error:', error)
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
message: 'Failed to list files'
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|