File size: 2,589 Bytes
d1ca8c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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}`);
});