From 7b4a5a5e383a0ef818d470fce1daa870247cf27f Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 28 Apr 2025 16:18:54 +0000 Subject: [PATCH] Neuste Aenderungen vom Server --- index.js | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 130 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index d2447ff..795cd14 100644 --- a/index.js +++ b/index.js @@ -263,7 +263,7 @@ app.put("/api/users/:id", async (req, res) => { // Speicherort definieren -const storage = multer.diskStorage({ +const newsStorage = multer.diskStorage({ destination: (req, file, cb) => { const dir = "./uploads/news"; fs.mkdirSync(dir, { recursive: true }); @@ -276,7 +276,25 @@ const storage = multer.diskStorage({ }, }); -const upload = multer({ storage }); +const playerStorage = multer.diskStorage({ + destination: (req, file, cb) => { + const dir = "./uploads/players"; + fs.mkdirSync(dir, { recursive: true }); + cb(null, dir); + }, + filename: (req, file, cb) => { + const ext = path.extname(file.originalname); + const filename = Date.now() + ext; + cb(null, filename); + }, +}); + +const uploadNewsImage = multer({ storage: newsStorage }); +const uploadPlayerImage = multer({ storage: playerStorage }); + + + + //Neues Bild zu den News hinzufügen app.post("/api/upload-news-image", upload.single("image"), (req, res) => { @@ -295,20 +313,21 @@ app.get("/api/teams", async (req, res) => { SELECT t.id, t.name, - COUNT(p.id) AS player_count + COUNT(pt.player_id) AS player_count FROM teams t - LEFT JOIN players p ON p.team_id = t.id + LEFT JOIN player_teams pt ON pt.team_id = t.id GROUP BY t.id ORDER BY t.name ASC `); res.json(result.rows); } catch (err) { - console.error("Fehler beim Laden der Teams:", err); + console.error(err); res.status(500).send("Fehler beim Abrufen der Teams"); } }); + //Teams anlegen app.post("/api/teams", async (req, res) => { @@ -325,12 +344,19 @@ app.post("/api/teams", async (req, res) => { ); res.status(201).json(result.rows[0]); } catch (err) { + if (err.code === "23505") { + // 23505 = Unique violation + return res.status(400).send("Ein Team mit diesem Namen existiert bereits"); + } + console.error("Fehler beim Anlegen des Teams:", err); res.status(500).send("Fehler beim Anlegen des Teams"); } }); -//Team löschen + + +//Team loeschen app.delete("/api/teams/:id", async (req, res) => { const { id } = req.params; @@ -350,6 +376,104 @@ app.delete("/api/teams/:id", async (req, res) => { }); +//Spieler anlegen +app.post("/api/players", async (req, res) => { + const { name, nickname, birthdate, position, jersey_number, favorite_food, image_url, status, team_ids } = req.body; + + if (!name || !position) { + return res.status(400).send("Name und Position sind Pflichtfelder"); + } + + const client = await pool.connect(); + try { + await client.query("BEGIN"); + + const result = await client.query( + `INSERT INTO players (name, nickname, birthdate, position, jersey_number, favorite_food, image_url, status) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id`, + [name, nickname, birthdate, position, jersey_number, favorite_food, image_url, status || "aktiv"] + ); + + const playerId = result.rows[0].id; + + if (team_ids && team_ids.length > 0) { + const teamInsert = team_ids.map((teamId) => `(${playerId}, ${teamId})`).join(","); + await client.query(`INSERT INTO player_teams (player_id, team_id) VALUES ${teamInsert}`); + } + + await client.query("COMMIT"); + res.status(201).json({ id: playerId }); + } catch (err) { + await client.query("ROLLBACK"); + console.error("Fehler beim Anlegen des Spielers:", err); + res.status(500).send("Fehler beim Anlegen des Spielers"); + } finally { + client.release(); + } +}); + + +//Einzelnes Team + Spieler laden + +// Einzelnes Team + Spieler laden +app.get("/api/teams/:id", async (req, res) => { + const { id } = req.params; + + try { + // Team-Daten holen + const teamResult = await pool.query( + "SELECT id, name FROM teams WHERE id = $1", + [id] + ); + + if (teamResult.rowCount === 0) { + return res.status(404).send("Team nicht gefunden"); + } + + // Spieler für dieses Team holen + const playerResult = await pool.query(` + SELECT p.id, p.name, p.nickname, p.position, p.jersey_number + FROM players p + INNER JOIN player_teams pt ON p.id = pt.player_id + WHERE pt.team_id = $1 + ORDER BY p.name ASC + `, [id]); + + res.json({ + id: teamResult.rows[0].id, + name: teamResult.rows[0].name, + players: playerResult.rows, + }); + } catch (err) { + console.error("Fehler beim Laden des Teams:", err); + res.status(500).send("Fehler beim Laden des Teams"); + } +}); + + +//Alle Spieler abrufen +app.get("/api/players", async (req, res) => { + try { + const result = await pool.query("SELECT * FROM players ORDER BY name ASC"); + res.json(result.rows); + } catch (err) { + console.error("Fehler beim Abrufen der Spieler:", err); + res.status(500).send("Fehler beim Abrufen der Spieler"); + } +}); + + +//Upload Player Image +app.post("/api/upload-player-image", upload.single("image"), (req, res) => { + if (!req.file) { + return res.status(400).send("Kein Bild hochgeladen"); + } + const imageUrl = `/uploads/players/${req.file.filename}`; + res.json({ imageUrl }); +}); + + + // Server starten app.listen(port, () => { const nets = os.networkInterfaces();