You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
5.2 KiB
144 lines
5.2 KiB
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}`);
|
|
}); |