# Alicia — Aufgaben 21–25: Integration & Pipeline > **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 21 — WhatsApp-Webhook Queue-Integration ### Datei: `src/routes/whatsapp.py` ```python # 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) ``` ### Test-Datei: `tests/routes/test_whatsapp_queue.py` 3 Tests: Enqueue, Invalid Body→400, Missing Text→400 **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) ``` ### Test-Datei: `tests/services/test_intake_extended.py` 6 Tests: Kommando-Varianten, Spielname-Extraktion, Bewertungsextraktion **Commit:** `feat: Intake-Engine mit Regex-Patterns und Spielnamen-Extraktion` --- ## 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" # Submission-Modell: +ergebnis: dict | None ``` ### Test-Datei: `tests/queue/test_worker_pipeline.py` 4 Tests: Suche, Hilfe, Unbekannt, Fehlerfall **Commit:** `feat: Worker durchläuft Intake-Pipeline mit Kommando-Erkennung` --- ## 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 ``` ### Datei: `src/queue/handler.py` ```python # +processed_total Property # +processed_errors Property # +oldest_pending() → datetime | None ``` ### Datei: `src/config.py` ```python # VERSION: str = "0.2.0" # In Settings-Klasse ``` ### 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 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) ``` ### Refactoring: `src/queue/worker.py` ```python # verarbeite_eine_submission(qh) extrahieren (KEIN Loop) # worker_loop() ruft dann verarbeite_eine_submission() auf ``` 3 Tests: Suche-Catan, Hilfe, Admin-Stats nach Verarbeitung **Commit:** `test: E2E-Integrationstest WhatsApp→Queue→Worker→Intake`