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

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}`);
});

Powered by TurnKey Linux.