feat: enhance CSV upload handling with chunked requests and token support; improve form input limits
This commit is contained in:
@@ -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 });
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user