94 lines
2.9 KiB
JavaScript
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;
|