const express = require("express"); const pool = require("../db"); // PostgreSQL-Datenbankverbindung const { requireAuth, requireRole, requireAdmin, } = require("../middleware/auth"); // Auth-Middleware const router = express.Router(); router.get("/:id?", requireAuth, requireRole(3), async (req, res) => { const { id } = req.params; // Mitglieds-ID (optional) const abteilung = req.abteilung; // Abteilung aus Middleware console.log(abteilung); try { let query; let values = []; if (id) { if (abteilung) { console.log("**Einzelnes Mitglied mit aktueller Riege abrufen**"); query = ` SELECT m.*, r.id AS riegen_id, r.fid_abteilung, riegenzuordnung.von, riegenzuordnung.bis FROM mitglieder m LEFT JOIN riegenzuordnung ON m.id = riegenzuordnung.fid_mitglied AND riegenzuordnung.bis IS NULL LEFT JOIN riegen r ON riegenzuordnung.fid_riege = r.id WHERE m.id = $1 AND (r.fid_abteilung = $2 OR r.fid_abteilung IS NULL) `; values = [id, abteilung]; } else { console.log(" **Einzelnes Mitglied ohne Riege abrufen**"); query = `SELECT * FROM members WHERE id = $1`; values = [id]; } } else if (abteilung) { console.log("**Alle Mitglieder einer Abteilung abrufen**"); query = ` SELECT m.*, r.id AS riegen_id, r.fid_abteilung, riegenzuordnung.von, riegenzuordnung.bis FROM mitglieder m LEFT JOIN riegenzuordnung ON m.id = riegenzuordnung.fid_mitglied AND riegenzuordnung.bis IS NULL LEFT JOIN riegen r ON riegenzuordnung.fid_riege = r.id WHERE r.fid_abteilung = $1 `; values = [abteilung]; } else { console.log("**Alle Mitglieder abrufen**"); query = `SELECT * FROM mitglieder`; } const result = await pool.query(query, values); if (result.rows.length === 0) { return res.status(404).json({ error: "Keine Mitglieder gefunden" }); } return res.json(result.rows); } catch (err) { console.error(err); res.status(500).json({ error: "Interner Serverfehler" }); } }); // **2. Mitglied anlegen oder aktualisieren (Nur für Admins)** router.put("/:id?", requireAuth, requireRole(3), async (req, res) => { const { id } = req.params; const { vorname, nachname, geburtsdatum, adresse, mit_seit, mit_num, helfer, probe, } = req.body; try { let result; if (id) { // **Mitglied aktualisieren** if ( !vorname || !nachname || geburtsdatum === undefined || adresse === undefined || mit_seit === undefined || mit_num === undefined || helfer === undefined || probe === undefined ) { return res.status(400).json({ error: "Alle Felder sind erforderlich" }); } result = await pool.query( `UPDATE mitglieder SET vorname = $1, nachname = $2, geburtsdatum = $3, adresse = $4, mit_seit = $5, mit_num = $6, helfer = $7, probe = $8 WHERE id = $9 RETURNING *`, [ vorname, nachname, geburtsdatum, adresse, mit_seit, mit_num, helfer, probe, id, ] ); if (result.rows.length === 0) { return res.status(404).json({ error: "Mitglied nicht gefunden" }); } return res.json({ message: "Mitglied erfolgreich aktualisiert", member: result.rows[0], }); } else { // **Neues Mitglied anlegen** if ( !vorname || !nachname || geburtsdatum === undefined || adresse === undefined || mit_seit === undefined || mit_num === undefined || helfer === undefined || probe === undefined ) { return res.status(400).json({ error: "Alle Felder sind erforderlich" }); } result = await pool.query( `INSERT INTO mitglieder (vorname, nachname, geburtsdatum, adresse, mit_seit, mit_num, helfer, probe) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *`, [ vorname, nachname, geburtsdatum, adresse, mit_seit, mit_num, helfer, probe, ] ); return res.status(201).json({ message: "Mitglied erfolgreich angelegt", member: result.rows[0], }); } } catch (err) { console.error(err); res.status(500).json({ error: "Interner Serverfehler" }); } }); // **3. Mitglied löschen (Nur für Admins)** router.delete("/:id", requireAuth, requireRole(2), async (req, res) => { const { id } = req.params; try { const memberResult = await pool.query( "SELECT id FROM mitglieder WHERE id = $1", [id] ); if (memberResult.rows.length === 0) { return res.status(404).json({ error: "Mitglied nicht gefunden" }); } await pool.query("DELETE FROM mitglieder WHERE id = $1", [id]); res.json({ message: "Mitglied erfolgreich gelöscht" }); } catch (err) { console.error(err); res.status(500).json({ error: "Interner Serverfehler" }); } }); // **1. notfallnummern abrufen (Falls ID gegeben: Nur die Nummern eines Mitglieds)** router.get("/phone/:id", requireAuth, requireRole(3), async (req, res) => { const { id } = req.params; try { const result = await pool.query( "SELECT * FROM notfallnummern WHERE fid_mitglied = $1", [id] ); if (result.rows.length === 0) { return res .status(404) .json({ error: "Keine notfallnummern für dieses Mitglied gefunden" }); } return res.json(result.rows); } catch (err) { console.error(err); res.status(500).json({ error: "Interner Serverfehler" }); } }); // **2. Telefonnummer anlegen oder aktualisieren (Nur für Admins)** router.put("/phone/:id?", requireAuth, requireRole(3), async (req, res) => { const { id } = req.params; const { fid_teilnehmer, name, nummer, verbindung, stand } = req.body; try { let result; if (id) { // **Telefonnummer aktualisieren** if (!fid_teilnehmer || !nummer) { return res .status(400) .json({ error: "Telefonnumer und Mitglieds ID sind erforderlich" }); } result = await pool.query( `UPDATE notfallnummern SET fid_mitglied = $1, name = $2, nummer = $3, verbindung = $4, stand = COALESCE($5, stand) WHERE id = $6 RETURNING *`, [ fid_teilnehmer, name || null, nummer, verbindung || null, stand || new Date(), id, ] ); if (result.rows.length === 0) { return res.status(404).json({ error: "Telefonnummer nicht gefunden" }); } return res.json({ message: "Telefonnummer erfolgreich aktualisiert", phone: result.rows[0], }); } else { // **Neue Telefonnummer anlegen** if (!fid_teilnehmer || !nummer) { return res .status(400) .json({ error: 'Alle Felder außer "stand" sind erforderlich' }); } result = await pool.query( `INSERT INTO notfallnummern (fid_mitglied, name, nummer, verbindung, stand) VALUES ($1, $2, $3, $4, COALESCE($5, NOW())) RETURNING *`, [fid_teilnehmer, name, nummer, verbindung, stand] ); return res.status(201).json({ message: "Telefonnummer erfolgreich angelegt", phone: result.rows[0], }); } } catch (err) { console.error(err); res.status(500).json({ error: "Interner Serverfehler" }); } }); // **3. Telefonnummer löschen (Nur für Admins)** router.delete("/phone/:id", requireAuth, requireRole(2), async (req, res) => { const { id } = req.params; try { const phoneResult = await pool.query( "SELECT id FROM notfallnummern WHERE id = $1", [id] ); if (phoneResult.rows.length === 0) { return res.status(404).json({ error: "Telefonnummer nicht gefunden" }); } await pool.query("DELETE FROM notfallnummern WHERE id = $1", [id]); res.json({ message: "Telefonnummer erfolgreich gelöscht" }); } catch (err) { console.error(err); res.status(500).json({ error: "Interner Serverfehler" }); } }); router.post("/riege/:id", requireAuth, requireRole(2), async (req, res) => { const { id } = req.params; const abteilung = req.abteilung; const { neue_riege } = req.body; if (!neue_riege) { return res.status(400).json({ error: "Neue Riege ist erforderlich" }); } try { await pool.query("BEGIN"); // Transaktion starten // **1. Prüfen, ob das Mitglied bereits in einer Riege dieser Abteilung ist** const aktuelleRiege = await pool.query( `SELECT rz.id, rz.fid_mitglied, rz.fid_riege FROM riegenzuordnung rz JOIN riegen r ON rz.fid_riege = r.id WHERE rz.fid_mitglied = $1 AND r.fid_abteilung = $2 AND rz.bis IS NULL`, [id, abteilung] ); if (aktuelleRiege.rows.length > 0) { const alteRiegenId = aktuelleRiege.rows[0].fid_riege; // **2. Falls Mitglied bereits in einer Riege ist → Diesen Eintrag beenden** await pool.query( `UPDATE riegenzuordnung SET bis = NOW() WHERE fid_mitglied = $1 AND fid_riege = $2 AND bis IS NULL`, [id, alteRiegenId] ); } // **3. Neuen Riegen-Eintrag für das Mitglied erstellen** const result = await pool.query( `INSERT INTO riegenzuordnung (fid_mitglied, fid_riege, von) VALUES ($1, $2, NOW()) RETURNING *`, [id, neue_riege] ); await pool.query("COMMIT"); // Transaktion abschließen res.json({ message: "Mitglied erfolgreich in neue Riege verschoben", riegenzuordnung: result.rows[0], }); } 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;