import express from "express"; import multer from "multer"; import mammoth from "mammoth"; import { MODEL_CAPS, MAX_FILE_BYTES } from "../lib/modelCaps.js"; const router = express.Router(); const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: MAX_FILE_BYTES } }); function extOf(name = "") { return (name.split(".").pop() || "").toLowerCase(); } async function extractText(file) { const ext = extOf(file.originalname); if (["txt", "md", "csv", "json", "js", "ts", "py", "html", "css", "java", "c", "cpp"].includes(ext)) { return file.buffer.toString("utf8"); } if (ext === "docx") { const { value } = await mammoth.extractRawText({ buffer: file.buffer }); return value; } if (ext === "pdf") { // pdf-parse عبر import ديناميكي (CJS) const pdfParse = (await import("pdf-parse")).default; const data = await pdfParse(file.buffer); return data.text; } return ""; } // POST /api/upload (multipart: file, model) router.post("/upload", upload.single("file"), async (req, res) => { try { const model = (req.body.model || "flash").toLowerCase(); const caps = MODEL_CAPS[model] || MODEL_CAPS.flash; const file = req.file; if (!file) return res.status(400).json({ error: "no_file" }); const ext = extOf(file.originalname); const isImage = file.mimetype.startsWith("image/"); // تحقق من دعم النموذج لهذا النوع if (isImage) { if (!caps.vision || !caps.imageMimes.includes(file.mimetype)) { return res.status(415).json({ error: "unsupported", message: `النموذج (${model}) لا يدعم الصور.` }); } const b64 = file.buffer.toString("base64"); return res.json({ kind: "image", name: file.originalname, dataUrl: `data:${file.mimetype};base64,${b64}`, }); } if (!caps.docExts.includes(ext)) { return res.status(415).json({ error: "unsupported", message: `النموذج (${model}) لا يدعم ملفات .${ext}` }); } let text = await extractText(file); if (text.length > 20000) text = text.slice(0, 20000) + "\n...[truncated]"; return res.json({ kind: "text", name: file.originalname, text }); } catch (err) { console.error("upload error:", err); res.status(500).json({ error: "upload_failed", message: String(err?.message || err) }); } }); export default router;