From ba83b245101d88624bdcec9769fe743fe1513a86 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 11:11:49 +0100 Subject: [PATCH] chore: finalize current state and prepare next wordpress-focused roadmap --- backend/data/rss_news.db | Bin 94208 -> 204800 bytes docs/PROJECT_PLAN.md | 26 +++++++++++++++++++++++++- docs/TODO.md | 25 +++++++++++++++---------- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/backend/data/rss_news.db b/backend/data/rss_news.db index 1b1c3900225265e8b460abed889fc85eda838c00..792930712d0b6bc67bf4176b67dc08588b62428c 100644 GIT binary patch literal 204800 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 delta 4052 zcmeHKU2GKB8QnX(UUt{s9RmhTO_Z?%#3XokW_Etp#@HC+Rv1D;t14{`zB6;jyJ9_S zX4b4i(l}Os^3yhwWSZ0+Ld;6XTCe%-0$4;oip>)8+A|py5>OB!f+rESVsP{KlGzgyc#CQXk;7tYVkE*e#4jXf=u~2WK1Givz8mjNEQ^1Q+`J|})*Bj+14Cv7frn5} zD+X(_Mq1Kj(-c`*GzG+Jf*>J9V_BrDiVj(o=Q&O?bWIi0CR9XCiuqYgLzQG+OY4SC zMk>?=k_QQC0qK&Uq!meL6@_P6T{a~{OlxV);1@wdft<*yqN3vCe&TArKRkD5-%7Q2xoTw>+tU)ual9D9yCpABc(uh2RlT=w^QP@wTD-fy%hZK%1 zUWF>bOOzx=!>iUtc+UNa3=(+!Pd1zl22!4%~*R7oW&uL~+dBBwxsGYnOLq9F$TEN)Ee3R4@& zMn>JYvt1KMBK7~@@c*F=UlAjX9;1&3=)V$Cn4z!GZ_yX%Y5GliiauU$W)9J@Sa3P8 z(ViSCl~11QC+b2^1<1?`^c2yhAJFcz*XqmD*OdCj(O4i{vn~*SA>I=^8LyAF*Q|TF z0bCE3>Cp91DBd36%8BUj!}vN4qAThm7X$P;dRyXZqBg!G4(h&Nx3%_i?5*hK$VH+q zKaNaZYy|9r2n9|DB8S0ga_yBlxoUR5o?TEECu^s`jzDA#>>%++z~qi@5DDQM8$cN_ z?trldf7kszsn}XS2ls4;a~A!HGbn5Xh~$4 z4am;tET*+kbk^Xp<3Po0`#^Mz$-*Mzpqzy)Mng`)GLTJ%kD%OMri~f348|#?vWwz_tdrz%L{`s++>E;FTZ+-~+=CMs=gq}$paq{d0HNW(Zc;aS6u$N@DBu$YIe1)b=-$}flVP@;dCel5Jxj)GSHWkn zXo44Fl|A+*d0U+H*Kl7;=T=m5>_TC1mOh@|j9YxVD~qQ>C$SHLR2 zNfob2Yk(icrFU5^pb+_(2Id&MZ zpwg$iKLG3^(x)(oY|;_dEIbeW1w4pfa>2>^3Ot`J*hOZwM-%+|A@D#2seAqm5-UFr zs5_^dgUY+vJ!hr}!5IA0KZ1vSsJg3Ak?5!AkxN#2;T9>Yk}EJBhj7P z_$}prd)LE3R!-ybjbID@P6xFL|6wE5>OPH{um(W}AInhp;BRT5Ddd+krGe)Fg9mgV zyXVd1Scj3@!{~YFIO|&UBHZZ|3-)6zogHxAMTP_fBCAZ+M&`PfY_T}vWKyY8sgxvQ zMpSKA9@@#`p45nq90#QgRD`*F%8#`<*+Qw!AuAjjXj=r zWsAf4md-6GYcroB+UGEPM;U_#@3DxQN= zAda_Xs1Tl3sGd1wB~H4nZ6k|H3#ulu+&78deVaX#XvGIsQ&BuJ0YY8oUA~TDFaf42 z6nv4U?pxwpg(tnv5cF!SI0jb+DSYG|Otlm9ZD7NF~8&vax%9z35I7PiW%giP%R^V=H=Zdojc6vnJdGO%&#se#3ReXnid{g_#>GEgN6%E`rLnXTI_B#Z> z^AdH{!}orIG_}IBV*AW%*?bk)bxpwy7`;rrSOxa*1huqw)&!W%eZJY@krR~fb~PNQ z@Uj~vX7|gc;H=qwY`!@Z+1IIA17UEcG1%z=ShLxC_nJKD%b_;|@0g+b8a{ewA)d-h zl}5*nk5epN`4kkyBqtNgRq>U_sclQG(R_X_(_$b!=i~}jONQ~T;P;=Pn%(``@Df4X zUy9z5!SSwt=ksj-*BQQ-AvAp60{wU}L0am8SE)^R$>oGQwreEJ&C&SH=KlbV=LGg< Q27eCBQvhC3lv}m+A4wL;uK)l5 diff --git a/docs/PROJECT_PLAN.md b/docs/PROJECT_PLAN.md index c758f5e..3c61216 100644 --- a/docs/PROJECT_PLAN.md +++ b/docs/PROJECT_PLAN.md @@ -13,7 +13,7 @@ Eine modulare News-Pipeline mit klaren Stufen: 2. Inhaltsanalyse und Normalisierung 3. Rewrite/Anreicherung 4. Legal- und Qualitaetschecks -5. WordPress-Publikation (`pending`) +5. WordPress-Publikation (Draft-first, Queue + Retry) 6. Monitoring/Logging ## Grobe Zeitplanung (ohne Fixtermine) @@ -36,12 +36,14 @@ Eine modulare News-Pipeline mit klaren Stufen: - Feed-Import mit Duplikaterkennung - Admin-Login (ein User) - Manuelle Review vor Publish +- Admin-UI fuer Rechtscheck, Bildauswahl, Relevanzbewertung ### Phase 2 - Automation - Job-Queue (asynchron) - Regelbasierte Scheduler - Retry/Dead-Letter-Handling - Robustes Error-Reporting +- WordPress-Publisher (Draft) mit Mapping `article_id -> wp_post_id` ### Phase 3 - Compliance und Skalierung - Source-Whitelisting mit Pflichtfeldern @@ -49,6 +51,28 @@ Eine modulare News-Pipeline mit klaren Stufen: - Qualitaetsmetriken und Audit-Logs - Optional: Passkey/WebAuthn +## Aktueller Stand (Snapshot) +- Backend/API + Admin-UI lauffaehig +- Feed-Ingestion inkl. Originalartikel-Extraktion (Autor, Pressekontakt, Bilder) +- Bildkuration: + - automatische Scoring-Reduktion (u. a. Presseportal `story_big` priorisiert) + - manuelle Auswahl/Ausblendung im UI +- Rechts-/Publish-Gates aktiv: + - `legal_checked` Pflicht + - Hauptbild-Auswahl Pflicht + - Status-Workflow bis `published` +- WordPress-Publishing: + - Queue + Retry + Job-Historie + - Draft-Erstellung/Update erfolgreich getestet +- Exporte: + - JSON/CSV inkl. Datum/Alter/Relevanz + Attribution/Legal-Felder + +## Naechste Iteration (konkret) +1. WordPress `featured_media` Upload aus ausgewaehltem Hauptbild +2. Publish-HTML je Artikel verfeinern (strukturierter Body + konsistenter Quellenblock) +3. Publisher als periodischen Worker (Timer/Cron/Systemd) auf Hetzner betreiben +4. Monitoring/Alerting fuer Queue-Fehler + WP-API Fehlercodes + ## Architekturprinzipien - Idempotente Jobs - Trennung von UI, API, Worker diff --git a/docs/TODO.md b/docs/TODO.md index ad9b549..fee4a67 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1,10 +1,10 @@ # ToDo (Ein-Entwickler Setup) ## Jetzt -- [ ] GitHub Project #3 Felder/Views fuer Neustart vereinheitlichen -- [ ] Alte/obsolet gewordene Issues kennzeichnen (z. B. User-Verwaltung) -- [ ] Redirect `news.vanityontour.de -> vanityontour.de` aktiv halten -- [ ] Wiki-Basis fertigstellen und verlinken +- [ ] WordPress Beitragsbild-Upload implementieren (`featured_media` aus ausgewaehltem Hauptbild) +- [ ] WordPress-HTML-Ausgabe pro Artikel weiter verbessern (sauberes Layout, Quellenblock, Shortcodes falls noetig) +- [ ] Publisher Fehlertexte fuer WP-Auth/Media/API in UI klarer darstellen +- [ ] End-to-end Publish Smoke-Test dokumentieren (lokal + Hetzner) ## MVP - [x] Neues Backend-Skelett (`backend/`) aufsetzen (FastAPI) @@ -12,14 +12,18 @@ - [x] Feed-Ingestion Service bauen (ETag/Last-Modified) - [x] Duplikaterkennung ueber `source_url`, `guid`, Hash - [x] Login mit 1 Admin-Account implementieren -- [ ] Artikel-Review-Maske mit Statusworkflow -- [ ] WordPress-Publisher als separaten Service implementieren +- [x] Artikel-Review-Maske mit Statusworkflow +- [x] WordPress-Publisher als separaten Service implementieren (Queue + Retry + Mapping) +- [x] Bildvorschau + manuelle Bildauswahl im Admin-UI +- [x] Automatische Bildreduktion/Scoring fuer Presseportal-Quellen +- [x] Artikel-Datum + Relevanzscore im UI/Export ## Recht/Qualitaet -- [ ] Source-Policy in DB + Admin-UI abbilden -- [ ] Pflichtfelder je Quelle erzwingen (Autor, URL, Lizenz, Hinweise) -- [ ] Auto-Block bei fehlender Lizenzinfo -- [ ] Pro Artikel Attribution-Block generieren +- [x] Source-Policy in DB + Admin-UI abbilden +- [x] Pflichtfelder je Quelle erzwingen (Autor, URL, Lizenz, Hinweise) +- [x] Auto-Block bei fehlender Lizenzinfo +- [x] Pro Artikel Attribution-Block generieren +- [x] Manuelle Rechtsfreigabe als Publish-Gate ## Betrieb - [ ] Systemd-Service(s) fuer API/Worker erstellen @@ -31,3 +35,4 @@ - [ ] Passkey/WebAuthn evaluieren und optional einfuehren - [ ] Migration auf PostgreSQL bewerten - [ ] Teilautomatische Freigabe-Regeln definieren +- [ ] KI-Rewrite mit Prompt-Versionierung + Qualitaetsmetriken wieder aktivieren