tkd-api/routes/anwesend.js

94 lines
2.9 KiB
JavaScript

const express = require("express");
const pool = require("../db"); // PostgreSQL-Datenbankverbindung
const {
requireAuth,
requireRole,
requireAdmin,
} = require("../middleware/auth"); // Auth-Middleware
const router = express.Router();
// **1. Alle Anwesenheiten eines Trainings abrufen**
router.get("/:id", requireAuth, requireRole(3), async (req, res) => {
const { id } = req.params; // Training-ID
const abteilung = req.abteilung; // Abteilung aus Middleware
if (!abteilung) {
return res.status(400).json({ error: "Abteilung ist erforderlich" });
}
try {
const result = await pool.query(
`SELECT a.fid_mitglied, m.vorname, m.nachname
FROM anwesend a
JOIN mitglieder m ON a.fid_mitglied = m.id
WHERE a.fid_training = $1`,
[id]
);
if (result.rows.length === 0) {
return res.json([]); // Falls keine Anwesenheiten vorhanden sind
}
return res.json(result.rows);
} catch (err) {
console.error(err);
res.status(500).json({ error: "Interner Serverfehler" });
}
});
// **2. Anwesenheit für ein Training setzen**
router.post("/:id", requireAuth, requireRole(3), async (req, res) => {
const { id } = req.params; // Training-ID
const { inriege, anw } = req.body; // Arrays mit IDs
if (!Array.isArray(inriege) || !Array.isArray(anw)) {
return res
.status(400)
.json({ error: "Daten müssen als Arrays übergeben werden" });
}
try {
await pool.query("BEGIN"); // Transaktion starten
// **1. Alle aktuellen Einträge für das Training abrufen**
const existingEntries = await pool.query(
`SELECT fid_mitglied FROM anwesend WHERE fid_training = $1`,
[id]
);
const existingSet = new Set(
existingEntries.rows.map((row) => row.fid_mitglied)
);
const anwSet = new Set(anw);
// **2. Anwesenheit setzen**
for (const memberId of inriege) {
if (anwSet.has(memberId) && !existingSet.has(memberId)) {
// **Fall 1: ID ist in `anw`, aber nicht in der Tabelle → Neu hinzufügen**
await pool.query(
`INSERT INTO anwesend (fid_mitglied, fid_training) VALUES ($1, $2)`,
[memberId, id]
);
} else if (!anwSet.has(memberId) && existingSet.has(memberId)) {
// **Fall 2: ID ist nicht in `anw`, aber in der Tabelle → Löschen**
await pool.query(
`DELETE FROM anwesend WHERE fid_mitglied = $1 AND fid_training = $2`,
[memberId, id]
);
}
// **Fall 3 & 4: Keine Änderung nötig (Eintrag bleibt gleich oder existiert nicht)**
}
await pool.query("COMMIT"); // Transaktion abschließen
res.json({ message: "Anwesenheit erfolgreich aktualisiert" });
} catch (err) {
await pool.query("ROLLBACK"); // Falls Fehler, Transaktion rückgängig machen
console.error(err);
res.status(500).json({ error: "Interner Serverfehler" });
}
});
module.exports = router;