Tickets #55, #88, #89, #91, #93, #94 — Rate Limiting, Busy-Logic-Refactor, 401-Handling, Footprint-Messung, automatisiertes Testing, Jellyfin-Theater. #95

Merged
kevin merged 5 commits from stability/core into main 2026-05-20 21:31:18 +00:00
Owner
No description provided.
- heroes.py: _build_busy_states() Hilfsfunktion zentralisiert alle
  Beschäftigungszustände (travel, roam, quest, training, rest_inn, work)
  inkl. Kaserne-Training (vorher fehlend); /sheet-Response gibt jetzt
  busy + states[] zurück statt rohe Felder; /status delegiert an Helper
- teashop.py: Tee trinken während aktiver Quest blockiert
- lib/api.js: apiFetch() Wrapper — bei HTTP 401 Token löschen + Redirect
- api/client.js: axios Response-Interceptor für 401
- Alle 21 Pages: fetch() → apiFetch(), navigate('/login') → navigate('/')

Closes #91
Closes #93

Signed-off-by: kevin mika <mika.kevin@nexus-6.eu>
- slowapi==0.1.9 zu requirements.txt
- app/core/limiter.py: IP-basierter Limiter (get_remote_address)
- main.py: SlowAPIMiddleware + RateLimitExceeded-Handler
- auth.py: /login max. 10/min, /register max. 5/min pro IP

Closes #55

Signed-off-by: kevin mika <mika.kevin@nexus-6.eu>
- app/middleware/timing.py: misst Request-Dauer, setzt X-Response-Time
  Header, loggt Requests >500ms und hält Zähler vor
- main.py: TimingMiddleware eingebunden
- admin.py: GET /admin/metrics — RAM/CPU (psutil) + Slow-Request-Liste
- vite.config.js: rollup-plugin-visualizer erzeugt dist/stats.html
  bei jedem Build
- requirements.txt: psutil==6.1.1

Closes #88

Signed-off-by: kevin mika <mika.kevin@nexus-6.eu>
- tests/conftest.py: in-memory SQLite (StaticPool), client/db-Fixtures,
  Rate-Limiter-Reset zwischen Tests, register_and_login Helper
- tests/test_auth.py: Register, Login, doppelter Username, 401 ohne
  Token, /auth/me
- tests/test_heroes.py: Hero erstellen, Ownership-Checks (403 für
  fremde Helden + Status), Hero-Liste nur eigene Helden
- tests/test_teashop.py: Tee-Session erlaubt wenn idle, geblockt
  während aktiver Quest
- requirements.txt: pytest==8.3.5, pytest-asyncio==0.24.0

Closes #89

Signed-off-by: kevin mika <mika.kevin@nexus-6.eu>
- app/routers/theater.py: GET /heroes/{id}/theater — zufällige Film-
  und Serien-Vorschläge via Jellyfin /Items?SortBy=Random; Deep-Link
  zu Jellyfin pro Item; graceful fallback bei fehlender Konfiguration
- app/core/config.py: JELLYFIN_URL + JELLYFIN_API_KEY
- main.py: theater Router eingebunden
- Theater.jsx + Theater.css: D1-Gothic-Stil, Karten mit Typ-Badge,
  Genres, Rating, "In Jellyfin ansehen"-Link, "Neu würfeln"-Button
- NavSidebar.jsx: 🎭 Theater-Button unter Besondere Orte
- App.jsx: Route /heroes/:id/theater
- Locales: nav.theater in de/en/ro

Closes #94

Signed-off-by: kevin mika <mika.kevin@nexus-6.eu>
kevin merged commit 4c7ef2bea5 into main 2026-05-20 21:31:18 +00:00
kevin deleted branch stability/core 2026-05-20 21:31:18 +00:00
kevin added this to the Stability/Core milestone 2026-05-20 21:32:00 +00:00
kevin self-assigned this 2026-05-20 21:32:07 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kevin/nexus-rpg!95
No description provided.