diff --git a/zadanie 1/backend/server.js b/zadanie 1/backend/server.js index 1743ff4..de0f09e 100755 --- a/zadanie 1/backend/server.js +++ b/zadanie 1/backend/server.js @@ -1,22 +1,22 @@ - +// ============================================================= // server.js – Blog API server - +// ============================================================= // Používame Express.js – minimálny webový framework pre Node.js // Počúva na porte 3000 a odpovedá na HTTP požiadavky od frontendu - +// ============================================================= const express = require('express'); -const cors = require('cors'); -const db = require('./db'); +const cors = require('cors'); +const db = require('./db'); -const app = express(); +const app = express(); const PORT = process.env.PORT || 3000; - +// ------------------------------------------------------------- // MIDDLEWARE // Middleware sú funkcie, ktoré spracujú každý request // predtým, než sa dostane k nášmu kódu (route handleru) - +// ------------------------------------------------------------- // Povolíme príjem JSON v tele requestu (napr. pri POST) app.use(express.json()); @@ -26,9 +26,9 @@ app.use(express.json()); // Bez toho by prehliadač zablokoval požiadavky z inej domény/portu app.use(cors()); - +// ------------------------------------------------------------- // ROUTES – definujeme čo sa stane pri každej URL - +// ------------------------------------------------------------- // GET /health – jednoduchý endpoint na overenie, že server beží // Používa sa napr. v Dockeri ako "healthcheck" @@ -108,7 +108,9 @@ app.post('/api/posts', async (req, res) => { } }); - +// PUT /api/posts/:id – upraví existujúci príspevok +// Klient pošle nové dáta v tele requestu (JSON), my ich uložíme do DB +// PUT = nahradíme celý zdroj novými dátami (na rozdiel od PATCH = čiastočná úprava) app.put('/api/posts/:id', async (req, res) => { const id = parseInt(req.params.id); @@ -116,6 +118,11 @@ app.put('/api/posts/:id', async (req, res) => { return res.status(400).json({ error: 'ID musí byť číslo' }); } + // Ochrana pred prípadom keď body nie je sparsované + if (!req.body || typeof req.body !== 'object') { + return res.status(400).json({ error: 'Neplatné telo požiadavky' }); + } + const { title, content, category, excerpt } = req.body; if (!title || !content) { @@ -137,13 +144,11 @@ app.put('/api/posts/:id', async (req, res) => { res.json(result.rows[0]); } catch (err) { - console.error('Chyba pri úprave príspevku:', err.message); - res.status(500).json({ error: 'Interná chyba servera' }); + console.error('Chyba pri úprave príspevku:', err.message, err.stack); + res.status(500).json({ error: 'Interná chyba servera', detail: err.message }); } }); - - // DELETE /api/posts/:id – zmaže príspevok podľa ID app.delete('/api/posts/:id', async (req, res) => { const id = parseInt(req.params.id); @@ -170,12 +175,12 @@ app.delete('/api/posts/:id', async (req, res) => { } }); - +// ------------------------------------------------------------- // SPUSTENIE SERVERA // app.listen() spustí server a začne počúvať na danom porte // '0.0.0.0' znamená: počúvaj na všetkých sieťových rozhraniach // (potrebné v Dockeri, inak by počúval len na localhost) - +// ------------------------------------------------------------- app.listen(PORT, '0.0.0.0', () => { console.log(`Backend server beží na porte ${PORT}`); }); diff --git a/zadanie 1/docker-compose.yaml b/zadanie 1/docker-compose.yaml index a73c37a..b1c0569 100755 --- a/zadanie 1/docker-compose.yaml +++ b/zadanie 1/docker-compose.yaml @@ -16,7 +16,7 @@ services: - # ── 1. DATABÁZA ───────────────────────────────────────────── + # 1. DATABÁZA db: image: postgres:16-alpine # oficiálny obraz, alpine = menší container_name: blog-db diff --git a/zadanie 1/nginx.conf b/zadanie 1/nginx.conf index a32e6fd..9bbe970 100755 --- a/zadanie 1/nginx.conf +++ b/zadanie 1/nginx.conf @@ -30,13 +30,12 @@ server { # ── Reverse proxy pre API ────────────────────────────────── # Všetky requesty začínajúce /api sa presmerujú na backend location /api/ { - # "backend" je názov služby v Docker Compose - # Docker vyrieši toto meno na IP adresu backend kontajnera proxy_pass http://backend:3000; - - # Hlavičky – informujeme backend o pôvodnom requeste proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass_request_body on; + proxy_pass_request_headers on; + proxy_request_buffering off; } }