import express from "express"; import multer from "multer"; import dotenv from "dotenv"; dotenv.config(); const app = express(); const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 100 * 1024 * 1024, }, }); const PORT = process.env.PORT || 4001 || 4002; const HF_TOKEN = process.env.HF_TOKEN; const DEFAULT_DATASET_REPO = process.env.HUGGINGFACE_DATASET_REPO; app.use((req, res, next) => { res.setHeader("Access-Control-Allow-Origin", process.env.CORS_ORIGIN || "*"); res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS"); res.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization"); if (req.method === "OPTIONS") { return res.sendStatus(200); } next(); }); if (!HF_TOKEN) { console.error("Missing HF_TOKEN in environment. Set it in .env or process env."); process.exit(1); } app.post("/upload", upload.single("file"), async (req, res) => { try { if (!req.file) { return res.status(400).json({ error: "File is required (field name: file)." }); } const datasetRepo = req.body.dataset || DEFAULT_DATASET_REPO; if (!datasetRepo) { return res.status(400).json({ error: "Dataset repository is required in request body or HUGGINGFACE_DATASET_REPO .env." }); } const targetPath = req.body.path || req.file.originalname; const url = `https://huggingface.co/api/datasets/${encodeURIComponent(datasetRepo)}/files/${encodeURIComponent(targetPath)}`; const response = await fetch(url, { method: "PUT", headers: { Authorization: `Bearer ${HF_TOKEN}`, "Content-Type": req.file.mimetype || "application/octet-stream" }, body: req.file.buffer }); const result = await response.json(); if (!response.ok) { return res.status(response.status).json({ error: result, url }); } return res.status(200).json({ success: true, datasetRepo, path: targetPath, result }); } catch (error) { console.error("Upload error:", error); return res.status(500).json({ error: "Failed to upload file to Hugging Face dataset.", details: error.message }); } }); app.use((error, req, res, next) => { if (error instanceof multer.MulterError && error.code === "LIMIT_FILE_SIZE") { return res.status(413).json({ error: "Ukuran file melebihi batas 100 MB." }); } next(error); }); app.get("/", (req, res) => { res.json({ message: "Hugging Face dataset upload API is running.", uploadEndpoint: "/upload" }); }); app.listen(PORT, () => { console.log(`Server listening on http://localhost:${PORT}`); });