diff --git a/docs/alicia-aufgaben-phase3.md b/docs/alicia-aufgaben-phase3.md index f6b7f17..75b6394 100644 --- a/docs/alicia-aufgaben-phase3.md +++ b/docs/alicia-aufgaben-phase3.md @@ -1,124 +1,113 @@ -# Alicia — Aufgaben 16–20: BSN-Livesystem Phase 3 (Live-Vorbereitung) +# Alicia — Aufgaben 21–25: Integration & Pipeline -> **Repo:** `git@git.datenhimmel.work:danielkrause/BSN-Livesystem.git` -> **Stand:** 15 Aufgaben fertig. Phase 2 abgeschlossen. -> **Ziel:** Projekt live-fähig machen — Config, DB, Error-Handling, Service-Dateien. +> **Repo:** git@git.datenhimmel.work:danielkrause/BSN-Livesystem.git +> **Branch:** main +> **Qualität:** `ruff check . && ruff format . && mypy --config-file pyproject.toml . && pytest -v` vor JEDEM Commit +> **Fehler?** Korrigieren, erneut prüfen. Nicht aufgeben. --- -## Aufgabe 16 — Konfigurations-Management (pydantic-settings) - -Ersetze hartcodierte Werte durch eine zentrale Config-Klasse. - -### Datei 1: `src/config.py` - +## Aufgabe 21 — WhatsApp-Webhook Queue-Integration +### Datei: `src/routes/whatsapp.py` ```python -from __future__ import annotations -from pydantic_settings import BaseSettings - - -class Settings(BaseSettings): - """Zentrale Anwendungskonfiguration. Werte aus .env oder Environment.""" - - REDIS_HOST: str = "localhost" - REDIS_PORT: int = 6379 - WHATSAPP_APP_SECRET: str = "" - WHATSAPP_VERIFY_TOKEN: str = "bsn_verify_token" - TELEGRAM_BOT_TOKEN: str = "" - APP_HOST: str = "0.0.0.0" - APP_PORT: int = 5002 - APP_DEBUG: bool = False - - class Config: - env_file = ".env" - env_file_encoding = "utf-8" - - -settings = Settings() +# Aktuell ist nur ein Platzhalter: +# # Hier würde die Submission in die Queue eingereiht werden +# return jsonify({"status": "accepted"}), 200 +# +# → Muss wie Telegram-Webhook funktionieren: +# 1. WhatsApp-Payload parsen (entry[0].changes[0].value.messages[0]) +# 2. Submission bauen (message_id, plattform="whatsapp", absender, text) +# 3. current_app.queue_handler.enqueue(submission) ``` -### Datei 2: `.env.template` +### Test-Datei: `tests/routes/test_whatsapp_queue.py` +3 Tests: Enqueue, Invalid Body→400, Missing Text→400 -``` -REDIS_HOST=localhost -REDIS_PORT=6379 -WHATSAPP_APP_SECRET=dein_secret_hier -WHATSAPP_VERIFY_TOKEN=bsn_verify_token -TELEGRAM_BOT_TOKEN=dein_bot_token_hier -APP_DEBUG=false +**Commit:** `feat: WhatsApp-Webhook reiht Submissions in Queue ein` + +--- + +## Aufgabe 22 — Intake-Kommando-Engine ausbauen +### Datei: `src/services/intake.py` +```python +# erkenne_kommando() erweitern: +# "suche/finde " → SPIEL_SUCHEN +# "bewerte mit " → SPIEL_BEWERTEN +# "neuheiten", "/neu" → SPIEL_NEUHEITEN +# "hilfe", "/help", "/start" → HILFE +# sonst → UNBEKANNT + +# NEU: extrahiere_spielname(text) → str | None +# NEU: extrahiere_bewertung(text) → int | None (1–10) ``` -### Integration: `src/app.py` umbauen +### Test-Datei: `tests/services/test_intake_extended.py` +6 Tests: Kommando-Varianten, Spielname-Extraktion, Bewertungsextraktion -`from src.config import settings` — ersetze alle Hart-Konfigurationen. - -### Test: `tests/test_config.py` — 4 Tests - -**Commit:** `feat: Pydantic-Settings Konfiguration mit .env-Support` +**Commit:** `feat: Intake-Engine mit Regex-Patterns und Spielnamen-Extraktion` --- -## Aufgabe 17 — Einheitliche Fehlerbehandlung +## Aufgabe 23 — Worker mit Intake-Pipeline verbinden +### Datei: `src/queue/worker.py` +```python +# verarbeite_submission() ersetzen: +# 1. erkenne_kommando(submission.text) +# 2. Je nach Kommando: Spielname/Bewertung extrahieren +# 3. Game-Service aufrufen (game_service.suche_spiel / bewerte_spiel) +# 4. Ergebnis in submission.ergebnis speichern +# 5. Status auf "erledigt" oder bei Fehler "fehler" -Zentrale JSON-Error-Responses via Flask errorhandler. +# Submission-Modell: +ergebnis: dict | None +``` -### Datei: `src/error_handler.py` +### Test-Datei: `tests/queue/test_worker_pipeline.py` +4 Tests: Suche, Hilfe, Unbekannt, Fehlerfall -Handler für 400, 401, 404, 422 (ValidationError), 500. -Alle Responses im Format: `{"error": "...", "message": "...", "status": N}` - -### Integration: `register_error_handlers(app)` in `create_app()` - -### Test: `tests/test_error_handler.py` — 5 Tests - -**Commit:** `feat: Einheitliche JSON-Error-Responses` +**Commit:** `feat: Worker durchläuft Intake-Pipeline mit Kommando-Erkennung` --- -## Aufgabe 18 — systemd Service-Dateien +## Aufgabe 24 — Admin-Stats mit echten Daten +### Datei: `src/routes/admin.py` +```python +# queue_status(): +processed_total, +processed_errors, +oldest_pending +# stats(): +echte uptime (startzeit in app.config), +version, +error_rate +``` -### Dateien: -- `deploy/bsn-chatbot.service` — Flask-App als systemd-Service -- `deploy/bsn-worker.service` — Queue-Worker als systemd-Service -- `deploy/README.md` — Installationsanleitung +### Datei: `src/queue/handler.py` +```python +# +processed_total Property +# +processed_errors Property +# +oldest_pending() → datetime | None +``` -### Kein Test nötig (Konfigurationsdateien) +### Datei: `src/config.py` +```python +# VERSION: str = "0.2.0" # In Settings-Klasse +``` -**Commit:** `feat: systemd-Service-Dateien für Chatbot + Queue-Worker` +### Test-Datei: `tests/routes/test_admin_stats.py` +3 Tests: Metriken, Uptime/Version, Error-Rate + +**Commit:** `feat: Admin-Stats mit Uptime, Error-Rate und Worker-Status` --- -## Aufgabe 19 — Health-Check erweitern +## Aufgabe 25 — E2E-Integrationstest +### Datei: `tests/integration/test_e2e_whatsapp_pipeline.py` +```python +# 1. Flask-Test-Client (App-Factory) +# 2. WhatsApp-POST → Queue → Worker (eine Submission) → erledigt +# 3. Admin-Stats prüfen (processed_total=1) +``` -### Datei: `src/routes/health.py` +### Refactoring: `src/queue/worker.py` +```python +# verarbeite_eine_submission(qh) extrahieren (KEIN Loop) +# worker_loop() ruft dann verarbeite_eine_submission() auf +``` -Blueprint mit: -- `GET /health` — Status, queue_size, python_version, platform -- `GET /health/ready` — Readiness-Check (Redis-Verbindung) +3 Tests: Suche-Catan, Hilfe, Admin-Stats nach Verarbeitung -### Integration: `app.py`: inline `/health` entfernen, `health_bp` registrieren - -### Test: `tests/test_health.py` — 4 Tests - -**Commit:** `feat: Erweiterter Health-Check mit Readiness-Endpunkt` - ---- - -## Aufgabe 20 — SQLAlchemy-Persistenz - -### Dateien: -- `src/database.py` — Engine, Session, Base -- `src/models/spiel.py` — SpielDB (SQLAlchemy-Modell) -- `src/services/game_service.py` — Umbau auf DB-Sessions - -### Test: `tests/test_database.py` — 5 Tests - -**Commit:** `feat: SQLAlchemy-Datenbank mit SQLite-Persistenz` - ---- - -## ⚠️ Wichtig - -- `pip install pydantic-settings sqlalchemy` -- **Qualität:** `ruff check . && ruff format . && mypy --config-file pyproject.toml . && pytest -v` -- **Reihenfolge:** 16 → 17 → 18 → 19 → 20 +**Commit:** `test: E2E-Integrationstest WhatsApp→Queue→Worker→Intake`