const express = require("express"); const cors = require("cors"); const Database = require("better-sqlite3"); const db = new Database("db.sqlite3"); db.exec(` CREATE TABLE IF NOT EXISTS startzeiten ( datum TEXT PRIMARY KEY, zeit TEXT ); CREATE TABLE IF NOT EXISTS endzeiten ( datum TEXT PRIMARY KEY, zeit TEXT ); `); const app = express(); app.use(cors()); app.use(express.json()); app.get("/api/data/:datum", (req, res) => { const datum = req.params.datum; const startzeitRow = db.prepare("SELECT zeit FROM startzeiten WHERE datum = ?").get(datum); const startzeit = startzeitRow ? startzeitRow.zeit : "05:00"; const endzeitRow = db.prepare("SELECT zeit FROM endzeiten WHERE datum = ?").get(datum); const endzeit = endzeitRow ? endzeitRow.zeit : "21:00"; const abwesenheiten = db.prepare("SELECT * FROM abwesenheiten WHERE datum = ?").all(datum); const zeitslots = db.prepare("SELECT * FROM zeitslots WHERE datum = ?").all(datum); const startTotalMin = parseInt(startzeit.split(":")[0]) * 60 + parseInt(startzeit.split(":")[1]); const endTotalMin = parseInt(endzeit.split(":")[0]) * 60 + parseInt(endzeit.split(":")[1]); const gefilterteSlots = zeitslots.filter(z => { const startMin = parseInt(z.start.split(":")[0]) * 60 + parseInt(z.start.split(":")[1]); const endMin = parseInt(z.ende.split(":")[0]) * 60 + parseInt(z.ende.split(":")[1]); return startMin >= startTotalMin && endMin <= endTotalMin; }); res.json({ abwesenheiten, zeitslots: gefilterteSlots, startzeit, endzeit }); }); app.post("/api/abwesenheit", (req, res) => { const { datum, titel, start, ende } = req.body; if (!datum || !titel || !start || !ende) { return res.status(400).json({ error: "Fehlende Angaben" }); } const id = Date.now().toString(); const stmt = db.prepare("INSERT INTO abwesenheiten (id, datum, titel, start, ende) VALUES (?, ?, ?, ?, ?)"); stmt.run(id, datum, titel, start, ende); const abwesenheit = { id, datum, titel, start, ende }; res.status(201).json(abwesenheit); }); app.put("/api/abwesenheit/:id", (req, res) => { const id = req.params.id; const existing = db.prepare("SELECT * FROM abwesenheiten WHERE id = ?").get(id); if (!existing) { return res.status(404).json({ error: "Abwesenheit nicht gefunden" }); } const { datum = existing.datum, grund = existing.grund, von = existing.von, bis = existing.bis } = req.body; const stmt = db.prepare("UPDATE abwesenheiten SET datum = ?, grund = ?, von = ?, bis = ? WHERE id = ?"); stmt.run(datum, grund, von, bis, id); const updated = db.prepare("SELECT * FROM abwesenheiten WHERE id = ?").get(id); res.json(updated); }); app.delete("/api/abwesenheit/:id", (req, res) => { const id = req.params.id; const stmt = db.prepare("DELETE FROM abwesenheiten WHERE id = ?"); const info = stmt.run(id); if (info.changes === 0) { res.status(404).json({ error: "Abwesenheit nicht gefunden" }); } else { res.status(204).end(); } }); app.post("/api/zeitslot", (req, res) => { const { datum, start, ende, titel, farbe } = req.body; if (!datum || !start || !ende || !titel) { return res.status(400).json({ error: "Fehlende Angaben" }); } const id = Date.now().toString(); const stmt = db.prepare("INSERT INTO zeitslots (id, datum, start, ende, titel, farbe) VALUES (?, ?, ?, ?, ?, ?)"); stmt.run(id, datum, start, ende, titel, farbe); const zeitslot = { id, datum, start, ende, titel, farbe }; res.status(201).json(zeitslot); }); app.put("/api/zeitslot/:id", (req, res) => { const id = req.params.id; const existing = db.prepare("SELECT * FROM zeitslots WHERE id = ?").get(id); if (!existing) { return res.status(404).json({ error: "Zeitslot nicht gefunden" }); } const { datum = existing.datum, start = existing.start, ende = existing.ende, titel = existing.titel, farbe = existing.farbe } = req.body; const stmt = db.prepare("UPDATE zeitslots SET datum = ?, start = ?, ende = ?, titel = ?, farbe = ? WHERE id = ?"); stmt.run(datum, start, ende, titel, farbe, id); const updated = db.prepare("SELECT * FROM zeitslots WHERE id = ?").get(id); res.json(updated); }); app.delete("/api/zeitslot/:id", (req, res) => { const id = req.params.id; const stmt = db.prepare("DELETE FROM zeitslots WHERE id = ?"); const info = stmt.run(id); if (info.changes === 0) { res.status(404).json({ error: "Zeitslot nicht gefunden" }); } else { res.status(204).end(); } }); app.post("/api/startzeit", (req, res) => { const { datum, zeit } = req.body; if (datum && zeit) { const stmt = db.prepare("INSERT INTO startzeiten (datum, zeit) VALUES (?, ?) ON CONFLICT(datum) DO UPDATE SET zeit=excluded.zeit"); stmt.run(datum, zeit); res.json({ datum, zeit }); } else { res.status(400).json({ error: "Fehlende Angaben" }); } }); app.post("/api/endzeit", (req, res) => { const { datum, zeit } = req.body; if (datum && zeit) { const stmt = db.prepare("INSERT INTO endzeiten (datum, zeit) VALUES (?, ?) ON CONFLICT(datum) DO UPDATE SET zeit=excluded.zeit"); stmt.run(datum, zeit); res.json({ datum, zeit }); } else { res.status(400).json({ error: "Fehlende Angaben" }); } }); const PORT = process.env.PORT || 3001; app.listen(PORT, () => { console.log(`Server läuft auf Port ${PORT}`); });