mirror of
https://github.com/Djeeberjr/fw-anwesenheit.git
synced 2025-11-04 23:54:11 +00:00
112 lines
2.6 KiB
JavaScript
112 lines
2.6 KiB
JavaScript
import express from "express";
|
|
import bodyParser from "body-parser";
|
|
|
|
import mockData from "./data.json" with {type: "json"};
|
|
|
|
const app = express();
|
|
const port = 3000;
|
|
|
|
const SECS_IN_DAY = 86_400;
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
function generateRandomId() {
|
|
const chars = "ABCDEF0123456789";
|
|
let id = "";
|
|
for (let i = 0; i < 12; i++) {
|
|
id += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
}
|
|
return id;
|
|
}
|
|
|
|
// GET /api/mapping
|
|
app.get("/api/mapping", (req, res) => {
|
|
res.json(mockData.mapping);
|
|
});
|
|
|
|
// POST /api/mapping
|
|
app.post("/api/mapping", (req, res) => {
|
|
const { id, name } = req.body;
|
|
|
|
if (!id || !name || !name.first || !name.last) {
|
|
return res.status(400).json({ error: "Invalid request body" });
|
|
}
|
|
|
|
// Check if ID already exists
|
|
const existing = mappings.find((entry) => entry[0] === id);
|
|
if (existing) {
|
|
return res.status(409).json({ error: "ID already exists" });
|
|
}
|
|
|
|
// Add new mapping
|
|
mockData.mappings.push([id, name]);
|
|
|
|
res.status(201).send("");
|
|
});
|
|
|
|
app.get("/api/day", (req, res) => {
|
|
let day;
|
|
|
|
if (req.query.day) {
|
|
day = parseInt(req.query.day, 10);
|
|
}else if (req.query.timestamp) {
|
|
let ts = parseInt(req.query.timestamp, 10);
|
|
day = ts / SECS_IN_DAY;
|
|
}else {
|
|
return res.status(400).json({ error: "Missing or invalid 'day' parameter" });
|
|
}
|
|
|
|
if (isNaN(day)) {
|
|
return res.status(400).json({ error: "Missing or invalid 'day' parameter" });
|
|
}
|
|
|
|
let foundDay = mockData.days.find(e => e.date == day);
|
|
|
|
if (!foundDay) {
|
|
return res.status(404).send("Not found");
|
|
}
|
|
|
|
res.status(200).json(foundDay);
|
|
});
|
|
|
|
app.get("/api/days", (req,res) => {
|
|
|
|
let qFrom = parseInt(req.query.from) / SECS_IN_DAY;
|
|
let qTo = parseInt(req.query.to) / SECS_IN_DAY;
|
|
|
|
let days = mockData.days.filter(e => e.date >= qFrom && e.date <= qTo).map(e => e.date);
|
|
|
|
res.status(200).json(days);
|
|
});
|
|
|
|
// SSE route: /api/idevent
|
|
app.get("/api/idevent", (req, res) => {
|
|
// Set headers for SSE
|
|
res.setHeader("Content-Type", "text/event-stream");
|
|
res.setHeader("Cache-Control", "no-cache");
|
|
res.setHeader("Connection", "keep-alive");
|
|
|
|
res.flushHeaders(); // flush the headers to establish SSE connection
|
|
|
|
// Send initial event
|
|
const sendEvent = () => {
|
|
const id = generateRandomId();
|
|
res.write(`data: ${id}\n\n`);
|
|
};
|
|
|
|
// Send immediately and then every 10 seconds
|
|
sendEvent();
|
|
const interval = setInterval(sendEvent, 10000);
|
|
|
|
// When client closes connection, stop interval
|
|
req.on("close", () => {
|
|
clearInterval(interval);
|
|
res.end();
|
|
});
|
|
});
|
|
|
|
// Start the server
|
|
app.listen(port, () => {
|
|
console.log(`Mock API server running at http://localhost:${port}`);
|
|
});
|