feat: enhance CSV upload handling with chunked requests and token support; improve form input limits

This commit is contained in:
2025-08-14 10:38:35 +02:00
parent bb63388986
commit 214a3cb3c8
6 changed files with 961 additions and 61 deletions

View File

@@ -15,9 +15,10 @@ const app = express();
const port = 8002;
app.use(cors());
app.use(express.urlencoded({ extended: true }));
// Increase body size limits to support large CSV JSON payloads
app.use(express.urlencoded({ extended: true, limit: "10mb" }));
app.set("view engine", "ejs");
app.use(express.json());
app.use(express.json({ limit: "10mb" }));
app.get("/", (req, res) => {
res.render("index.ejs", { title: port });
@@ -32,22 +33,8 @@ app.post("/lose", async (req, res) => {
}
});
// !!!!!!! AUTHORISATION HINZUFÜGEN - DENN GEHT NICHT !!!!!!!!
app.get("/table-data", authenticate, async (req, res) => {
const result = await getTableData();
if (result.success) {
@@ -57,16 +44,21 @@ app.get("/table-data", authenticate, async (req, res) => {
}
});
app.post("/create-entry", async (req, res) => {
const result = await createEntry(req.body.losnummer);
if (result) {
res.status(201).json({ success: true });
} else {
res.status(400).json({ success: false });
app.post("/create-entry", authenticate, async (req, res) => {
try {
const result = await createEntry(req.body.losnummer);
if (result) {
res.status(201).json({ success: true });
} else {
res.status(400).json({ success: false, message: "Insert failed" });
}
} catch (err) {
console.error("/create-entry error", err);
res.status(500).json({ success: false, message: String(err) });
}
});
app.delete("/remove-entries", async (req, res) => {
app.delete("/remove-entries", authenticate, async (req, res) => {
const result = await removeEntries(req.body.losnummern);
if (result) {
res.status(200).json({ success: true });
@@ -75,7 +67,7 @@ app.delete("/remove-entries", async (req, res) => {
}
});
app.put("/save-row", async (req, res) => {
app.put("/save-row", authenticate, async (req, res) => {
const result = await saveRow(req.body);
if (result.success) {
res.status(200).json({ success: true });

View File

@@ -52,22 +52,28 @@ export async function getTableData() {
}
export async function createEntry(data) {
let { status } = { status: true };
for (const item of data) {
if (!Array.isArray(data) || data.length === 0) return true;
// Normalize values to strings and unique them to reduce duplicates
const values = Array.from(
new Set(data.map((v) => String(v).trim()).filter(Boolean))
);
// Prepare bulk insert values [[v1],[v2],...]
const rows = values.map((v) => [v]);
try {
// Use INSERT IGNORE to skip duplicates on UNIQUE(losnummer)
const [result] = await pool.query(
"INSERT INTO lose (losnummer) VALUES (?)",
[item]
"INSERT IGNORE INTO lose (losnummer) VALUES ?",
[rows]
);
if (result.affectedRows > 0) {
status = true;
} else {
status = false;
return status;
}
// result.affectedRows may be less than rows.length if duplicates existed
return true;
} catch (e) {
console.error("Bulk insert failed", e);
return false;
}
return status;
}
export async function removeEntries(losnummern) {