Files
PrintAuftrag-Portfolio/frontend/components/upload-form/action.ts
2025-11-08 13:42:43 +01:00

58 lines
1.8 KiB
TypeScript

"use server";
import { main, OrderData } from "./orderUpdateBillbee";
export async function uploadFile(formData: FormData) {
const file = formData.get("file") as File;
// Check if the file is a CSV
if (!file || (file.type !== "text/csv" && !file.name.endsWith(".csv"))) {
return { message: "Ausgewählte Datei ist keine CSV", status: false };
}
const arrayBuffer = await file.arrayBuffer();
const buffer = new Uint8Array(arrayBuffer);
// Decode the buffer to a string
const decoder: TextDecoder = new TextDecoder("utf-8");
const csvContent: string = decoder.decode(buffer);
// Determine the delimiter (comma or semicolon)
const delimiter = csvContent.includes(";") ? ";" : ",";
// Parse the CSV content using the detected delimiter
const rows: string[][] = csvContent
.split("\n")
.map((row) => row.split(delimiter));
const requiredHeaders = ["Bestellnummer", "Sendungsnummer"];
const headers: string[] = rows[0].map((header) =>
header.trim().replace(/\r/g, "")
);
// Check if CSV containes required Headers
const allHeadersPresent: boolean = requiredHeaders.every((header) =>
headers.includes(header)
);
if (!allHeadersPresent) {
return {
message:
'CSV enthält nicht die notwendigen Header "Bestellnummer" und "Sendungsnummer"',
status: false,
};
}
// Get the indices of the required headers
const indices: number[] = requiredHeaders.map((header) =>
headers.indexOf(header)
);
// Create an array of objects with only the required headers
const filteredData: OrderData[] = rows.slice(1).map((row) => {
const orderData: OrderData = {
Bestellnummer: row[indices[0]] ? row[indices[0]].trim() : null,
Sendungsnummer: row[indices[1]] ? row[indices[1]].trim() : null,
};
return orderData;
});
return { data: await main(filteredData), status: true };
}