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;