# 🎬 Mozisarok Backend – API Dokumentáció

**Base URL:** `http(s)://<host>:3000`

> **Auth** – Az endpoint `Authorization: ****** headert igényel.  
> **Admin** – `Auth` + `UploaderAuth` middleware szükséges.  
> **AdminOnly** – `Auth` + `AdminAuth` middleware szükséges.

---

## 🔐 Auth – `/auth`

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/auth/validate` | – | Ellenőrzi, hogy a megadott JWT token érvényes-e. |
| `POST` | `/auth/register` | – | Új felhasználó regisztrációja. Body: `{ username, password, email }` |
| `POST` | `/auth/login` | – | Bejelentkezés, JWT tokent ad vissza. Body: `{ username, password }` |
| `POST` | `/auth/forgot` | – | Elfelejtett jelszó – emailt küld a reset linkkel. Body: `{ username, email }` |
| `POST` | `/auth/reset` | – | Jelszó visszaállítása tokennel. Body: `{ token, password }` |

---

## 🎥 Media – `/media`

### Böngészés / Felfedezés

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/media/:media_type/discover` | – | Filmek / sorozatok felfedezése. `media_type`: `movie` / `tv`. Query: `page`, `uploaded` (opcionális, `false` = nem feltöltöttek). Eredmény cachelve 1 óra. |
| `GET` | `/media/weekly` | – | Heti legnépszerűbb tartalmak. Cachelve 1 óra. |
| `GET` | `/media/trending` | – | Trending tartalmak. Cachelve 1 óra. |
| `GET` | `/media/top-rated` | – | Legjobban értékelt tartalmak. Cachelve 1 óra. |
| `GET` | `/media/search` | – | Keresés. Query: `query`, `genre`, `without_genres` |
| `GET` | `/media/:media_type/:id` | – | Egy tartalom részletes adatai. `media_type`: `movie` / `tv` / `person`, `id`: TMDB ID. Cachelve 1 óra. |

### Linkek / Feltöltések

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/media/links` | – | Tartalom linkjeinek lekérése. Query: `type` (`movie`/`tv`), `tmdb_id`, opcionálisan `episode`, `season` |
| `POST` | `/media/links` | ✅ | Új link (feltöltés) beküldése jóváhagyásra. Body: `{ type, tmdb_id, url, language, subtitle, quality, season, episode, anonymous }` |
| `GET` | `/media/uploads` | – | Legutóbbi jóváhagyott feltöltések. Query: `page`. Cachelve 24 óra. |
| `GET` | `/media/stats` | – | Globális statisztikák (filmek, sorozatok, stb. száma). Cachelve 24 óra. |

### Értékelések (Reviews)

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/media/reviews` | – | Értékelések lekérése. Query: `tmdb_id`, `type` (`movie`/`tv`) |
| `POST` | `/media/review` | ✅ | Értékelés írása. Body: `{ tmdb_id, media_type, review, rating }` |
| `PUT` | `/media/review` | ✅ | Saját értékelés szerkesztése. Body: `{ tmdb_id, media_type, review, rating }` |
| `DELETE` | `/media/review` | ✅ | Saját értékelés törlése. Body: `{ tmdb_id, media_type }` |

### TV Szezonok

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/media/season` | – | Szezon adatainak lekérése. Query: `tmdb_id`, `season`. Cachelve 24 óra. |

### Megtekintések / Riportok

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `POST` | `/media/view` | – | Megtekintés rögzítése. Body: `{ id }` (link ID) |
| `POST` | `/media/report` | ✅ | Link hibájának bejelentése. Body: `{ link_id, reason_id, message }` |

### Megjegyzések (Notes)

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/media/note/:media_type/:id` | – | Admin megjegyzések lekérése egy tartalomhoz. |

### Kérések (Requests)

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/media/request` | – | Feltöltési kérések listája. Query: `tmdb_id`, `media_type` |
| `GET` | `/media/request/search` | – | Kérések keresése. Query/Body: `title`, `query`, `tmdb_id` |
| `GET` | `/media/request/block` | – | Blokkolt tartalom lekérése. |
| `POST` | `/media/request` | ✅ | Új feltöltési kérés leadása. Body: `{ tmdb_id, media_type, quality_id, language, subtitle, hype, request_type, season, episodes[] }` |
| `GET` | `/media/request/check` | ✅ | Saját kérés ellenőrzése. Body: `{ tmdb_id, media_type }` |
| `DELETE` | `/media/request` | ✅ | Saját kérés törlése. Body: `{ tmdb_id, media_type }` |

### Video Tracker

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/media/video-tracker` | ✅ | Mentett lejátszási pozíció lekérése. Query: `tmdb_id`, `type`, opcionálisan `link_id` |
| `POST` | `/media/video-tracker` | ✅ | Lejátszási pozíció mentése. Body: `{ link_id, progress, progress_max, added_on, season, episode }` |

---

## 👤 User – `/user`

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/user/pfp` | – | Profilkép lekérése. Query: `username` |
| `GET` | `/user/profile` | – | Felhasználói profil adatai (watchlist, history, reviews összefoglalva). |
| `GET` | `/user/active` | – | Aktív felhasználók száma. |
| `GET` | `/user/role` | ✅ | Bejelentkezett felhasználó szerepköre. |
| `POST` | `/user/pfp` | ✅ | Profilkép feltöltése. (`multipart/form-data`) |
| `DELETE` | `/user/pfp` | ✅ | Saját profilkép törlése. |
| `POST` | `/user/description` | ✅ | Profil leírás frissítése. Body: `{ description }` |
| `GET` | `/user/seen` | ✅ | Megnézett állapot lekérése. Query: `type`, `tmdb_id` |
| `POST` | `/user/seen` | ✅ | Megnézett állapot váltása. Body: `{ type, tmdb_id, season, episode }` |
| `GET` | `/user/mylist` | ✅ | „Saját listám" tartalmak lekérése. Query: `limit` |
| `GET` | `/user/history` | ✅ | Megtekintési előzmények. Query: `limit` |
| `GET` | `/user/watchlist` | ✅ | Megnézési lista ellenőrzése. Query: `type`, `tmdb_id` |
| `POST` | `/user/watchlist` | ✅ | Megnézési listára hozzáadás / eltávolítás. Body: `{ type, tmdb_id, season, episode }` |
| `GET` | `/user/discordcode` | ✅ | Discord összekötési link / kód generálása. |
| `GET` | `/user/notifications` | ✅ | Értesítések lekérése. |
| `POST` | `/user/notifications` | ✅ | Értesítés megjelölése olvasottként. Body: `{ id }` |
| `DELETE` | `/user/notifications` | ✅ | Összes értesítés törlése. |
| `GET` | `/user/hypepoints` | ✅ | Hype pontok lekérése. |

---

## 💳 Donate – `/donate`

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `POST` | `/donate/kofi` | – | Ko-fi webhook fogadása (külső hívás). |
| `GET` | `/donate/kofimessages` | – | Ko-fi üzenetek listája. Cachelve 1 óra. |
| `GET` | `/donate/stripe` | ✅ | Stripe checkout URL generálása. Query: `price` |
| `POST` | `/donate/stripe` | ✅ | Stripe session ellenőrzése fizetés után. Body: `{ session_id }` |

---

## 🛡️ Admin – `/admin`

> Minden admin endpoint **Admin** middleware-t igényel, kivéve ahol **AdminOnly** jelölés van.

### Jóváhagyások (Approvals)

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/admin/approvals` | Admin | Jóváhagyásra váró feltöltések listája. Query: `type`, `search`, `page` |
| `POST` | `/admin/approvals` | Admin | Feltöltés elfogadása vagy elutasítása. Query: `response` (`accept`/`decline`), `link_id`, `reason` |
| `PUT` | `/admin/approvals/:id/:type` | Admin | Feltöltés adatának módosítása. `type`: `quality` / `language` / `subtitle` / `url`. Body: `{ value }` (vagy `{ url }`) |

### Riportok (Reports)

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `GET` | `/admin/report` | Admin | Bejelentett hibák listája. |
| `POST` | `/admin/report` | Admin | Riport kezelése. Query: `action` (`accept`/`decline`), `linkid` |
| `PUT` | `/admin/report/:id` | Admin | Riporthoz tartozó link adatainak szerkesztése. Body: `{ url, quality_id, language_id, subtitle_id }` (mind opcionális) |

### Kérések kezelése

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `POST` | `/admin/request` | Admin | Kérés státuszának módosítása. Body: `{ tmdb_id, media_type, quality_id, language_id, subtitle_id, request_type, season, episode }` |

### Értékelések törlése

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `DELETE` | `/admin/review` | AdminOnly | Bármely felhasználó értékelésének törlése. Body: `{ tmdb_id, media_type, user_id }` |

### Megjegyzések (Notes)

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `POST` | `/admin/note/:media_type/:id` | AdminOnly | Admin megjegyzés létrehozása. Body: `{ note, color, fontSize }` |
| `DELETE` | `/admin/note/:media_type/:id` | AdminOnly | Admin megjegyzés törlése. |

### Blokkolt kérések

| Metódus | Path | Auth | Leírás |
|---------|------|:----:|--------|
| `POST` | `/admin/request/block` | AdminOnly | Tartalom blokkolása (kérések tiltása). Body: `{ tmdb_id, media_type, ... }` |
| `DELETE` | `/admin/request/block` | AdminOnly | Blokkolás feloldása. |

---

## ⚠️ Egyéb

- **404** – Ismeretlen endpoint esetén: `{ "error": "Belső hiba!", "message": "Nem létezik ez az endpoint!" }`
- **Cache** – Több GET endpoint eredménye memory-cache-ben tárolódik (1 óra vagy 24 óra), az URI alapján.
- **Automatikus feladatok:**
  - Éjfélkor törli a 7 napnál régebbi history statisztikákat.
  - Hetente +2 hype pontot ad a felhasználóknak (maximum 5-ig).
