REST API Dokumentácia

Kompletná dokumentácia REST API endpointov pre prácu s olympionikmi SR. Base URL: /zadanie2/api/

🔐 Autentifikácia (JWT — BONUS)

Mutačné endpointy (POST, PUT, DELETE) vyžadujú JWT token v hlavičke:

Authorization: Bearer <váš_jwt_token>

Získanie tokenu:

POST /zadanie2/api/auth/login
Content-Type: application/json

{
    "email": "user@example.com",
    "password": "heslo123"
}

Odpoveď (200):

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expires_in": 3600,
    "user": {
        "id": 1,
        "first_name": "Ján",
        "last_name": "Novák",
        "email": "user@example.com"
    }
}

Token je platný 1 hodinu. Po expirácii je nutné sa znova prihlásiť.

📋 HTTP Stavové kódy
KódNázovPopis
200OKÚspešné čítanie alebo aktualizácia údajov
201CreatedNový záznam bol úspešne vytvorený
400Bad RequestChybný vstup — chýba povinné pole alebo neplatný formát
401UnauthorizedChýba alebo neplatný JWT token
404Not FoundZáznam s daným ID neexistuje
409ConflictDuplicitný záznam (UNIQUE constraint)
500Internal ErrorNeočakávaná chyba na serveri

Endpointy

GET /athletes — Zoznam olympionikov s filtrami

Query parametre (voliteľné):

ParameterTypPopis
typestringTyp OH: LOH alebo ZOH
yearintRok olympiády (napr. 2024)
placingintUmiestnenie (1 = zlato, 2 = striebro, 3 = bronz)
disciplinestringNázov disciplíny alebo jeho časť (LIKE)

Príklad:

GET /zadanie2/api/athletes?type=LOH&year=2024

Odpoveď (200):

[
    {
        "athlete_id": 1,
        "first_name": "Peter",
        "last_name": "Sagan",
        "birth_date": "1990-01-26",
        "birth_country": "Slovensko",
        "oh_year": "2016",
        "oh_type": "LOH",
        "discipline": "cyklistika",
        "placing": 1,
        "medal_name": "Zlatá medaila",
        "medal_record_id": 42
    }
]
GET /athletes/{id} — Detail olympionika

URL parametre:

ParameterTypPopis
idintID atléta z tabuľky athletes

Odpoveď (200):

{
    "id": 1,
    "first_name": "Peter",
    "last_name": "Sagan",
    "birth_date": "1990-01-26",
    "birth_country": "Slovensko",
    "medals": [
        {
            "medal_record_id": 42,
            "discipline": "cyklistika",
            "placing": 1,
            "oh_year": "2016",
            "oh_type": "LOH"
        }
    ]
}

Chyba (404):

{ "error": "Olympionik nenájdený" }
POST /athletes — Pridať olympionika 🔒

Vyžaduje JWT autentifikáciu

Telo požiadavky (JSON):

{
    "first_name": "Peter",
    "last_name": "Sagan",
    "birth_date": "1990-01-26",
    "birth_place": "Žilina",
    "birth_country": "Slovensko",
    "medals": [
        {
            "oh_year": "2016",
            "oh_type": "LOH",
            "oh_city": "Rio de Janeiro",
            "oh_country": "Brazília",
            "discipline": "cyklistika",
            "placing": 1
        }
    ]
}

Odpoveď (201):

{
    "message": "Olympionik pridaný",
    "athlete_id": 1,
    "medals_added": 1
}
POST /athletes/bulk — Hromadné pridanie z JSON 🔒

Vyžaduje JWT autentifikáciu

Telo požiadavky: JSON pole objektov (rovnaká štruktúra ako single create).

[
    { "first_name": "Peter", "last_name": "Sagan", "medals": [...] },
    { "first_name": "Anastasiya", "last_name": "Kuzminová", "medals": [...] }
]

Odpoveď (201):

{
    "message": "Spracovaných: 2, pridaných: 2, chýb: 0",
    "results": [
        { "index": 0, "status": "ok", "athlete_id": 1, "medals_added": 1 },
        { "index": 1, "status": "ok", "athlete_id": 2, "medals_added": 3 }
    ]
}
PUT /athletes/{id} — Upraviť údaje olympionika 🔒

Vyžaduje JWT autentifikáciu

Telo požiadavky (JSON): len polia, ktoré chcete zmeniť.

{
    "first_name": "Nové meno",
    "birth_place": "Bratislava"
}

Odpoveď (200):

{ "message": "Údaje boli aktualizované" }
DELETE /athletes/{id} — Vymazať olympionika + medaily 🔒

Vyžaduje JWT autentifikáciu

Vymaže atléta a všetky jeho medailové záznamy (ON DELETE CASCADE).

Odpoveď (200):

{ "message": "Olympionik a všetky jeho záznamy boli vymazané" }

Chyba (404):

{ "error": "Olympionik nenájdený" }
GET /athletes/medal/{id} — Detail medailového záznamu

Vracia údaje jedného záznamu z tabuľky athlete_medals vrátane údajov o atlétovi.

Odpoveď (200):

{
    "id": 42,
    "athlete_id": 1,
    "first_name": "Peter",
    "last_name": "Sagan",
    "oh_year": "2016",
    "oh_type": "LOH",
    "discipline": "cyklistika",
    "placing": 1
}
PUT /athletes/medal/{id} — Upraviť medailový záznam 🔒

Vyžaduje JWT autentifikáciu

{
    "first_name": "Peter",
    "last_name": "Sagan",
    "oh_year": "2020",
    "oh_type": "LOH",
    "oh_city": "Tokio",
    "oh_country": "Japonsko",
    "discipline": "cyklistika",
    "placing": 2
}

Odpoveď (200):

{ "message": "Záznam bol aktualizovaný" }
GET /athletes/grouped — Zoznam olympionikov zoskupených s medailami

Vracia zoznam unikátnych olympionikov, každý s vnoreným poľom medals.

Odpoveď (200):

[
    {
        "id": 1,
        "first_name": "Peter",
        "last_name": "Sagan",
        "birth_date": "1990-01-26",
        "birth_country": "Slovensko",
        "medals": [
            { "medal_record_id": 42, "discipline": "cyklistika", "placing": 1, "oh_year": "2016", "oh_type": "LOH" }
        ]
    }
]
POST /athletes/{id}/medals — Pridať medailu existujúcemu olympionikovi 🔒

Vyžaduje JWT autentifikáciu

Telo požiadavky:

{
    "oh_year": "2024",
    "oh_type": "LOH",
    "oh_city": "Paríž",
    "oh_country": "Francúzsko",
    "discipline": "cyklistika",
    "placing": 1
}

Odpoveď (201):

{ "message": "Medaila pridaná" }

Chyba (409):

{ "error": "Atlét nenájdený alebo duplicitná medaila" }
DELETE /athletes/medal/{id} — Vymazať jeden medailový záznam 🔒

Vyžaduje JWT autentifikáciu

Vymaže jeden záznam z tabuľky athlete_medals. Atlét zostane v databáze.

Odpoveď (200):

{ "message": "Medailový záznam vymazaný" }
GET /athletes/datatable — DataTables server-side processing

Špeciálny endpoint pre DataTables jQuery plugin. Vracia dáta vo formáte { draw, recordsTotal, recordsFiltered, data }.

Query parametre: Štandardné DataTables parametre (draw, start, length, search[value], order[0][column], order[0][dir]) + vlastné filtre (filterYear, filterDiscipline).

POST /auth/login — Prihlásenie (získanie JWT)

Telo požiadavky:

{
    "email": "user@example.com",
    "password": "heslo123"
}

Odpoveď (200):

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expires_in": 3600,
    "user": { "id": 1, "first_name": "Ján", "last_name": "Novák", "email": "user@example.com" }
}

Chyba (401):

{ "error": "Nesprávne prihlasovacie údaje" }