dokumentacia

This commit is contained in:
Marunič 2026-03-30 00:06:05 +02:00
parent 74f7d71e65
commit 8c129cdb76
3 changed files with 26 additions and 22 deletions

View File

@ -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}`);
});

View File

@ -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

View File

@ -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;
}
}