feat: rebuild rss-news backend, admin ui, and legal extraction pipeline

This commit is contained in:
Oliver 2026-02-18 09:46:44 +01:00
parent d65c55d315
commit 2c331d683b
No known key found for this signature in database
43 changed files with 3463 additions and 73 deletions

82
backend/README.md Normal file
View file

@ -0,0 +1,82 @@
# Backend Skeleton (FastAPI)
Dieses Verzeichnis enthaelt das technische Grundgeruest fuer den Rebuild von `rss-news`.
## Start (lokal)
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r backend/requirements.txt
uvicorn backend.app.main:app --reload --port 8501
```
## Admin UI
- Login: `http://127.0.0.1:8501/admin/login`
- Dashboard: `http://127.0.0.1:8501/admin/dashboard`
## Environment
- Datei: `backend/.env`
- Vorlage: `backend/.env.example`
## Endpoints
- `GET /health` - Healthcheck
- `POST /auth/login` - Login mit Admin-User
- `POST /auth/logout` - Logout
- `GET /auth/me` - Aktiver User
- `GET /api/protected` - Geschuetzter Test-Endpoint
- `GET /api/pipeline/status` - Basisstatus inkl. Datensatzzaehler
- `GET /api/sources` - Quellenliste
- `POST /api/sources` - Quelle anlegen
- `GET /api/sources/{source_id}/policy-check` - Policy-Pruefung fuer Quelle
- `GET /api/feeds` - Feedliste
- `POST /api/feeds` - Feed anlegen
- `GET /api/feeds/{feed_id}/policy-check` - Policy-Pruefung fuer Feed
- `GET /api/runs` - Import-/Job-Runs anzeigen
- `GET /api/runs/{run_id}` - Detailansicht eines Runs
- `POST /api/runs` - Run starten
- `POST /api/runs/{run_id}/finish` - Run abschliessen
- `GET /api/articles` - Artikel anzeigen
- `GET /api/articles/{article_id}` - Artikeldetail
- `POST /api/articles/upsert` - Artikel idempotent anlegen/aktualisieren
- `POST /api/articles/{article_id}/transition` - Statuswechsel nach Workflow-Regeln
- `POST /api/articles/{article_id}/review` - Review-Entscheidung (approve/reject)
- `POST /api/ingestion/run` - Feed-Ingestion starten (optional pro Feed)
## Datenbank
- SQLite-Datei unter `backend/data/rss_news.db`
- Tabellen werden beim App-Start initialisiert.
- Tabellen: `sources`, `feeds`, `runs`, `articles`
- Dedupe-Strategie Artikel: `source_url` -> `(feed_id, source_article_id)` -> `source_hash`
## Policy-Enforcement
- Ingestion blockiert Feeds automatisch, wenn die zugeordnete Quelle nicht policy-konform ist.
- Mindestanforderungen: `risk_level=green`, `terms_url`, `license_name`, `last_reviewed_at`, `is_enabled=1`.
- Pro importiertem Artikel wird ein `attribution`-Block in `meta_json` gespeichert.
## Review-Workflow
- Statuskette: `new -> review -> approved -> published`
- Ablehnung im Review setzt auf `rewrite`
- Ungueltige Statuswechsel werden per API blockiert
## Verifikation
```bash
python -m unittest backend.tests.test_db_repositories
python -m unittest backend.tests.test_ingestion
python -m unittest backend.tests.test_api_auth
```
## CI / Online-Auswertung
- GitHub Actions Workflow: `.github/workflows/test.yml`
- Fuehrt Tests inkl. Coverage auf Push/PR gegen `main` aus.
## Hetzner Smoketest
```bash
BASE_URL="https://news.vanityontour.de" \
APP_ADMIN_USERNAME="admin" \
APP_ADMIN_PASSWORD="..." \
bash scripts/smoke_backend.sh
```
## Hinweis
Passwort-Hashing und CSRF/Rate-Limit sind als naechste Ausbaustufe vorgesehen.