Update-System: /api/version + /api/release-notes + RELEASES.json

Frontend kann jetzt erkennen, wann eine neue Version live ist, und dem Nutzer
einen passenden Hinweis sowie die Release-Notes anzeigen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Claude Code
2026-04-26 20:28:10 +00:00
Ursprung 5473ba3ed7
Commit 2df37cb617
4 geänderte Dateien mit 68 neuen und 0 gelöschten Zeilen

54
src/routes/version_router.py Normale Datei
Datei anzeigen

@@ -0,0 +1,54 @@
"""Version + Release-Notes-Endpoints fuer das Frontend-Update-System."""
import json
import subprocess
from datetime import datetime, timezone
from pathlib import Path
from fastapi import APIRouter
REPO_ROOT = Path(__file__).resolve().parent.parent.parent
RELEASES_FILE = REPO_ROOT / 'RELEASES.json'
# Version-Hash beim Boot einmalig auslesen.
try:
COMMIT_HASH = subprocess.check_output(
['git', 'rev-parse', '--short=10', 'HEAD'],
cwd=str(REPO_ROOT), text=True, timeout=5
).strip()
except Exception:
COMMIT_HASH = 'unknown'
DEPLOYED_AT = datetime.now(timezone.utc).isoformat()
router = APIRouter(tags=['version'])
@router.get('/api/version')
def version():
return {'commit': COMMIT_HASH, 'deployed_at': DEPLOYED_AT}
@router.get('/api/release-notes')
def release_notes(since: str = '', limit: int = 5):
"""Liefert Release-Notes seit der gegebenen Version.
'since' = letzte vom User gesehene Version. Liefert alle Eintraege NEUER
als diese Version. Ohne 'since' werden die letzten 'limit' Eintraege
geliefert.
"""
if not RELEASES_FILE.exists():
return {'entries': [], 'current': COMMIT_HASH}
try:
with open(RELEASES_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
except Exception as e:
return {'entries': [], 'error': f'parse-failed: {e}'}
if since:
result = []
for entry in data:
if entry.get('version') == since:
break
result.append(entry)
return {'entries': result[:limit], 'current': COMMIT_HASH}
return {'entries': data[:limit], 'current': COMMIT_HASH}