From 54abc3956a5ad04246441c3f320ce7cc34b35e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaas=20B=C3=B6rgmann?= Date: Tue, 24 Sep 2024 15:36:49 +0200 Subject: [PATCH] Mitgliederfunktionen: Abrufen nach Abteilung, neu Anlegen --- README.md | 51 ++++++++++++++++++ server/app.js | 7 +-- server/controllers/memberController.js | 73 ++++++++++++++++++++++++++ server/controllers/userController.js | 25 ++++++++- server/routes/auth.js | 9 +++- server/routes/members.js | 10 ++++ 6 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 server/controllers/memberController.js create mode 100644 server/routes/members.js diff --git a/README.md b/README.md index e69de29..8200fff 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,51 @@ + + +**Server README** +================ + +**Übersicht** +------------ + +Dieser Server ist eine Webanwendung, die mit Node.js und Express.js erstellt wurde. Er bietet eine API für Benutzerregistrierung und -anmeldung sowie eine geschützte Route für autorisierte Benutzer. + +**Anforderungen** +--------------- + +* Node.js (Version 14 oder höher) +* Express.js (Version 4 oder höher) +* PostgreSQL-Datenbank (mit pg-Modul) + +**Konfiguration** +---------------- + +* Die Datenbankverbindung wird über Umgebungsvariablen konfiguriert (siehe `.env`-Datei). +* Der Server läuft standardmäßig auf Port 3000. + +**API-Endpunkte** +----------------- + +* `/auth/register`: Registrierung eines neuen Benutzers +* `/auth/login`: Anmeldung eines bestehenden Benutzers +* `/mitglieder`: Geschützte Route für autorisierte Benutzer + +**Middleware** +------------- + +* `authenticateToken`: Überprüft den JWT-Token in der Authorization-Header + +**Datenbank** +------------ + +* Die Datenbank wird mit dem pg-Modul verbunden. +* Die Tabellen werden automatisch erstellt, wenn der Server gestartet wird. + +**Starten des Servers** +---------------------- + +* `npm start` oder `node server/app.js` + +**Hinweis** +--------- + +* Bitte stellen Sie sicher, dass Sie die `.env`-Datei mit Ihren eigenen Datenbankzugangsdaten konfiguriert haben. +* Bitte beachten Sie, dass dies ein Beispielprojekt ist und Sie es an Ihre eigenen Bedürfnisse anpassen sollten. \ No newline at end of file diff --git a/server/app.js b/server/app.js index a1afb92..742929a 100644 --- a/server/app.js +++ b/server/app.js @@ -2,6 +2,7 @@ require("dotenv").config(); const express = require("express"); const app = express(); const authRoutes = require("./routes/auth"); +const memberRoutes = require("./routes/members"); const bodyParser = require("body-parser"); // Middleware @@ -10,13 +11,9 @@ app.use(express.urlencoded({ extended: true })); const authenticateToken = require("./middleware/authenticateToken"); -// Beispiel für eine geschützte Route -app.get("/mitglieder", authenticateToken, (req, res) => { - res.json({ message: "Dies ist eine geschützte Route", user: req.user }); -}); - // Routes app.use("/auth", authRoutes); +app.use("/members", memberRoutes); // Server starten const PORT = process.env.PORT || 3000; diff --git a/server/controllers/memberController.js b/server/controllers/memberController.js new file mode 100644 index 0000000..956a189 --- /dev/null +++ b/server/controllers/memberController.js @@ -0,0 +1,73 @@ +const bcrypt = require("bcryptjs"); +const jwt = require("jsonwebtoken"); +const { Pool } = require("pg"); + +// Datenbankverbindung +const pool = new Pool({ + user: process.env.DB_USER, + host: process.env.DB_HOST, + database: process.env.DB_NAME, + password: process.env.DB_PASSWORD, + port: 5432, +}); + +const allMembers = async (req, res) => { + const { id } = req.body; // Abteilungs-ID aus dem Request-Body + + try { + // Überprüfen, ob eine ID übergeben wurde + if (!id) { + return res.status(400).json({ message: "Abteilungs-ID fehlt" }); + } + + // Abfrage der Mitglieder basierend auf der Abteilungs-ID + const allMembers = await pool.query( + ` + SELECT m.* + FROM mitglieder m + JOIN Abteilungszuordnung az ON m.ID = az.FID_Mitglied + WHERE az.FID_Abteilung = $1 + `, + [id] + ); + + // Wenn keine Mitglieder gefunden wurden + if (allMembers.rows.length === 0) { + return res + .status(404) + .json({ message: "Keine Mitglieder in dieser Abteilung gefunden" }); + } + + // Erfolgreiche Antwort mit den Mitgliedern + res.status(200).json({ members: allMembers.rows }); + } catch (err) { + res.status(500).json({ + message: "Fehler beim Abrufen der Mitglieder", + error: err.message, + }); + } +}; + +const newMember = async (req, res) => { + const { vorname, nachname, geburtsdatum, abteilung, adresse, probe } = + req.body; + try { + const newMember = await pool.query( + "INSERT INTO mitglieder (vorname, nachname, geburtsdatum, adresse, probe) VALUES ($1, $2, $3, $4, $5) RETURNING id", + [vorname, nachname, geburtsdatum, adresse, probe] + ); + const intoAbt = await pool.query( + "INSERT INTO Abteilungszuordnung (FID_Mitglied, FID_Abteilung) VALUES ($1, $2)", + [newMember.rows[0].id, abteilung] + ); + res + .status(201) + .json({ message: "Mitglied erstellt", member: newMember.rows[0] }); + } catch (err) { + res.status(500).json({ + message: "Fehler beim Erstellen des Mitglieds", + error: err.message, + }); + } +}; +module.exports = { allMembers, newMember }; diff --git a/server/controllers/userController.js b/server/controllers/userController.js index 5295dbb..d197f25 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -77,4 +77,27 @@ const loginUser = async (req, res) => { } }; -module.exports = { registerUser, loginUser }; +const updateUser = async (req, res) => { + const { id, username, password, email, role } = req.body; + try { + const updateUser = await pool.query( + "UPDATE users SET username = $1, password = $2, email = $3, role = $4 WHERE id = $5 RETURNING *", + [username, password, email, role, id] + ); + res + .status(200) + .json({ + message: "Benutzerdaten aktualisiert", + user: updateUser.rows[0], + }); + } catch (err) { + res + .status(500) + .json({ + message: "Fehler beim Aktualisieren der Benutzerdaten", + error: err.message, + }); + } +}; + +module.exports = { registerUser, loginUser, updateUser }; diff --git a/server/routes/auth.js b/server/routes/auth.js index d76794a..ad2ab2b 100644 --- a/server/routes/auth.js +++ b/server/routes/auth.js @@ -1,6 +1,11 @@ const express = require("express"); -const { loginUser, registerUser } = require("../controllers/userController"); +const { + loginUser, + registerUser, + updateUser, +} = require("../controllers/userController"); const router = express.Router(); +const authenticateToken = require("../middleware/authenticateToken"); // Registrierungsroute router.post("/register", registerUser); @@ -8,4 +13,6 @@ router.post("/register", registerUser); // Loginroute router.post("/login", loginUser); +router.post("/update", authenticateToken, updateUser); + module.exports = router; diff --git a/server/routes/members.js b/server/routes/members.js new file mode 100644 index 0000000..02701a2 --- /dev/null +++ b/server/routes/members.js @@ -0,0 +1,10 @@ +const express = require("express"); +const { allMembers, newMember } = require("../controllers/memberController"); +const router = express.Router(); +const authenticateToken = require("../middleware/authenticateToken"); + +// Loginroute +router.post("/all", authenticateToken, allMembers); +router.post("/new", authenticateToken, newMember); + +module.exports = router;