| 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") { |
| |
| const pdfParse = (await import("pdf-parse")).default; |
| const data = await pdfParse(file.buffer); |
| return data.text; |
| } |
| return ""; |
| } |
|
|
| |
| 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; |
|
|