import { NextRequest, NextResponse } from "next/server"; import { requireAuth } from "@/lib/auth"; import { writeFile } from "fs/promises"; import path from "path"; const MAX_SIZE = 10 * 1024 * 1024; // 10 MB const ALLOWED_MIME = [ "image/jpeg", "image/png", "image/gif", "image/webp", "application/pdf", "application/zip", "application/x-zip-compressed", "application/x-rar-compressed", "application/x-7z-compressed", "application/gzip", ]; // POST /api/souq/upload — upload a delivery file export async function POST(request: NextRequest) { try { const auth = await requireAuth(request); if (!auth) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const formData = await request.formData(); const file = formData.get("file") as File | null; const orderId = formData.get("orderId") as string | null; if (!file) { return NextResponse.json({ error: "No file provided" }, { status: 400 }); } if (!orderId) { return NextResponse.json( { error: "orderId is required" }, { status: 400 } ); } // Check file size if (file.size > MAX_SIZE) { return NextResponse.json( { error: "File too large. Maximum 10 MB." }, { status: 413 } ); } // Only check mime type if available; allow fallback for unknown types if (file.type && !ALLOWED_MIME.includes(file.type)) { return NextResponse.json( { error: "Invalid file type. Allowed: images, PDFs, ZIP, RAR, 7z, GZIP.", }, { status: 400 } ); } // Generate unique filename const timestamp = Date.now(); const safeName = file.name.replace(/[^a-zA-Z0-9._-]/g, "_"); const fileName = `${orderId}-${timestamp}-${safeName}`; // Save to disk const uploadDir = path.join( process.cwd(), "public", "uploads", "deliveries" ); const filePath = path.join(uploadDir, fileName); const buffer = Buffer.from(await file.arrayBuffer()); await writeFile(filePath, buffer); // Return the public URL path const url = `/uploads/deliveries/${fileName}`; return NextResponse.json({ url, name: file.name, size: file.size, }); } catch (error) { console.error("POST /api/souq/upload error:", error); return NextResponse.json( { error: "Internal server error" }, { status: 500 } ); } }