code auf einzelne Datein aufgeteilt
This commit is contained in:
1 parent
7451e0bf78
commit
8c94fc91f6
30 files changed
+5765
-27
No files matched your search
@@ -1,12 +1,23 @@
|
||||
/*
|
||||
* Express-Server der Projektübersicht: liefert die statischen Frontend-Dateien aus
|
||||
* public/ (Test.html unter "/") aus und stellt den Frontend-Modulen unter public/js/
|
||||
* eine CSV-API zum Laden und Speichern der Sitzungsdaten in sessions/ bereit.
|
||||
* Standardport ist 3003, überschreibbar über die Umgebungsvariable PORT.
|
||||
* Endpunkte: GET /, GET /health, GET /load-all, POST /save-csv, POST /delete-csv.
|
||||
* Die Daten werden als UTF-8-CSV mit BOM geschrieben; ungültige Abteilungen fallen
|
||||
* auf ELT zurück, Dateinamen werden über safeName() streng validiert.
|
||||
*/
|
||||
const express = require('express');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const app = express();
|
||||
|
||||
// Wichtige Konstanten: UTF-8-BOM für CSV-Dateien, Serverport (PORT-Env) und die gültigen Abteilungsordner
|
||||
const BOM = Buffer.from([0xEF, 0xBB, 0xBF]);
|
||||
const PORT = process.env.PORT || 3003;
|
||||
const VALID_DEPARTMENTS = new Set(['ELT','HLS','ARCH']);
|
||||
|
||||
// Globale Middleware: CORS, JSON-Body-Limit (2 MB) und statisches Serving von public/ ohne Cache für Skripte/Styles
|
||||
app.use(require('cors')());
|
||||
app.use(express.json({ limit: '2mb' }));
|
||||
app.use(express.static(path.join(__dirname, 'public'), {
|
||||
@@ -19,6 +30,7 @@ app.use(express.static(path.join(__dirname, 'public'), {
|
||||
}
|
||||
}));
|
||||
|
||||
// Datenverzeichnis sessions/ bei Bedarf anlegen
|
||||
const SESSIONS_DIR = path.join(__dirname, 'sessions');
|
||||
if(!fs.existsSync(SESSIONS_DIR)) fs.mkdirSync(SESSIONS_DIR, { recursive: true });
|
||||
|
||||
@@ -34,6 +46,7 @@ function safeName(name){
|
||||
return safe;
|
||||
}
|
||||
|
||||
// Liefert den Zielordner für eine Abteilung (nur ELT|HLS|ARCH, sonst ELT) und legt ihn bei Bedarf an
|
||||
function departmentDir(department){
|
||||
const dept = (typeof department === 'string' && VALID_DEPARTMENTS.has(department)) ? department : 'ELT';
|
||||
const dir = path.join(SESSIONS_DIR, dept);
|
||||
@@ -41,6 +54,7 @@ function departmentDir(department){
|
||||
return dir;
|
||||
}
|
||||
|
||||
// Route: Speichert eine CSV-Datei (mit UTF-8-BOM) für eine Abteilung im sessions/-Ordner
|
||||
app.post('/save-csv', (req, res) => {
|
||||
const { filename, csv, department } = req.body || {};
|
||||
if(!filename || typeof csv !== 'string') return res.status(400).json({ ok: false, error: 'Missing filename or csv' });
|
||||
@@ -56,6 +70,7 @@ app.post('/save-csv', (req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
// Route: Löscht eine CSV-Datei einer Abteilung aus dem sessions/-Ordner (fehlende Datei wird toleriert)
|
||||
app.post('/delete-csv', (req, res) => {
|
||||
const { filename, department } = req.body || {};
|
||||
if(!filename) return res.status(400).json({ ok: false, error: 'Missing filename' });
|
||||
@@ -77,6 +92,7 @@ app.post('/delete-csv', (req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
// Route: Lädt alle Sitzungs-CSV-Dateien einer Abteilung plus _people.csv (nach Dateiname sortiert)
|
||||
app.get('/load-all', (req, res) => {
|
||||
const dir = departmentDir(req.query.department);
|
||||
fs.readdir(dir, (err, files) => {
|
||||
@@ -97,12 +113,15 @@ app.get('/load-all', (req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
// Route: Healthcheck-Endpunkt für Docker/Überwachung
|
||||
app.get('/health', (req,res)=> res.json({ok:true}));
|
||||
|
||||
// Route: Liefert die Hauptseite Test.html
|
||||
app.get('/', (req,res)=>{
|
||||
res.sendFile(path.join(__dirname, 'public', 'Test.html'));
|
||||
});
|
||||
|
||||
// Serverstart mit Fehlerbehandlung (z.B. Port bereits belegt)
|
||||
const server = app.listen(PORT, ()=> console.log(`CSV-Session server running on http://localhost:${PORT}`));
|
||||
server.on('error', (err) => {
|
||||
console.error('Server konnte nicht starten:', err.message);
|
||||
|
||||
Reference in new issue
Block a user