Legacy-API-Paritaet S1+S2: connektar-Flow verhaltensgleich + KI-Schalter
Eigene Compat-Controller (Api/Legacy) fuer die 5 real genutzten
/service-Endpoints (Prod-Log-Beleg): Company-/Kontakt-Create (liefen
410!), PM-Create, Bild-Upload, published-only-GET — verschachtelte
Alt-Params, 201+Location+{}, Alt-Fehlerformat, Hit-Zaehlung,
Legacy-Land-Mapping.
- Anlegen = Einreichen (Alt-Verhalten); Sofort-Publish via neuer
Permission api:immediate-publication (WS-7: connektar zuweisen)
- Admin-Schalter 'KI-Pruefung Legacy-API' (app_settings-Tabelle,
Toggle auf /admin/press-releases): an = review + KI-Routing
- Admin-PM-Liste: KI-Spalte (Ampel-Badge) + manueller Pruef-Button
ohne Routing fuer ungepruefte PMs
- Mails bei API-Einlieferern an Pressekontakt, sonst Firmen-Mail,
Fallback Einlieferer (User-Entscheidung 10.07.)
- Tests: LegacyServiceParityTest (connektar-Flow end-to-end);
Suite 1182 gruen
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
fef45733df
commit
a3fd361ece
15 changed files with 906 additions and 24 deletions
|
|
@ -108,16 +108,16 @@ Strukturierte Aktivitäts-Logs beider Portale (Mai–Juli 2026, `b24_activity` +
|
|||
|
||||
Scope nach Log-Auswertung (§3a): **die 5 connektar-Endpoints**, verhaltensgleich.
|
||||
|
||||
- [ ] **S1 — Legacy-Compat-Controller `/service/…`** (ersetzt die direkten v1-Aliasse):
|
||||
- [ ] `POST /service/users/me/companies` — Felder `company[name|address|country_id|phone|fax|email|website]` (+ `logo`-Datei); legacy `country_id` → neuer `country_code`; Response `201` + `Location` + `{}`; Alt-Fehlerformat.
|
||||
- [ ] `POST /service/users/me/companies/{id}/contacts` — Felder `contact[salutation_id|title|first_name|last_name|responsibility|phone|fax|email]`; Zugriff nur eigene Firma (403-Wortlaut s. §1); Response wie oben.
|
||||
- [ ] `POST /service/pressreleases` — Felder `press_release[company_id|contacts_list[]|category_id|language|title|text|backlink_url|…]`; Statusverhalten s. S2; KI-Deklarations-Default none (erledigt 10.07.); Response `201` + `Location` + `{}`.
|
||||
- [ ] `POST /service/pressreleases/{id}/images` — Multipart `press_release_image[image|title|description|copyright]`; Eigentümer-Check (403 „You are not the creator of this press release"); ai_declaration-Default original (erledigt 10.07.); Response `201` + `Location` + `{}`.
|
||||
- [ ] `GET /service/pressreleases/{id}` — nur `published` (sonst 404 — connektars Polling-Kontrolle!), Hit-Zählung, flaches Alt-Objekt `{id,title,text,teaser_end,language,category_id,view_url,company:{viewUrl,name}}`.
|
||||
- [ ] Alt-Fehlerformat überall: `{"global_errors":[…],"field_errors":{…}}` (422) bzw. `{"global_errors":[…]}`.
|
||||
- [ ] Pest-Paritäts-Tests je Endpoint gegen den §1-Vertrag (inkl. connektar-Flow end-to-end: Firma → Kontakt → PM → Bild → GET).
|
||||
- [x] **S1 — Legacy-Compat-Controller `/service/…`** (ersetzt die direkten v1-Aliasse):
|
||||
- [x] `POST /service/users/me/companies` — Felder `company[name|address|country_id|phone|fax|email|website]` (+ `logo`-Datei); legacy `country_id` → neuer `country_code`; Response `201` + `Location` + `{}`; Alt-Fehlerformat.
|
||||
- [x] `POST /service/users/me/companies/{id}/contacts` — Felder `contact[salutation_id|title|first_name|last_name|responsibility|phone|fax|email]`; Zugriff nur eigene Firma (403-Wortlaut s. §1); Response wie oben.
|
||||
- [x] `POST /service/pressreleases` — Felder `press_release[company_id|contacts_list[]|category_id|language|title|text|backlink_url|…]`; Statusverhalten s. S2; KI-Deklarations-Default none (erledigt 10.07.); Response `201` + `Location` + `{}`.
|
||||
- [x] `POST /service/pressreleases/{id}/images` — Multipart `press_release_image[image|title|description|copyright]`; Eigentümer-Check (403 „You are not the creator of this press release"); ai_declaration-Default original (erledigt 10.07.); Response `201` + `Location` + `{}`.
|
||||
- [x] `GET /service/pressreleases/{id}` — nur `published` (sonst 404 — connektars Polling-Kontrolle!), Hit-Zählung, flaches Alt-Objekt `{id,title,text,teaser_end,language,category_id,view_url,company:{viewUrl,name}}`.
|
||||
- [x] Alt-Fehlerformat überall: `{"global_errors":[…],"field_errors":{…}}` (422) bzw. `{"global_errors":[…]}`.
|
||||
- [x] Pest-Paritäts-Tests (`LegacyServiceParityTest`) — je Endpoint gegen den §1-Vertrag (inkl. connektar-Flow end-to-end: Firma → Kontakt → PM → Bild → GET).
|
||||
- Nicht nachgebaut (real ungenutzt, bleiben 410): GET-Index-Routen, Einzelbild-GET, Company-GET/Show, Kontakt-GET, `.json`-Suffix-Formen. GET users/me/companies + Show bleiben als vorhandene Aliasse bestehen (real nur von der toten Integration gecallt, schadet nicht).
|
||||
- [ ] **S2 — Statusverhalten create (Entscheidung 10.07., §3b):** Default **Sofort-Publish** (Alt-Verhalten, per Log belegt); **Admin-Schalter** „KI-Prüfung für Legacy-API" → Status review + KI-Routing (Gelb/Grün auto-publish, Rot Ablehnung + Mail). Umsetzung: Setting (config + Admin-UI-Toggle), Legacy-Create wertet es aus. Blacklist/Slot-Verbrauch laufen in beiden Wegen über `PressReleaseService::publish()`.
|
||||
- [x] **S2 — Statusverhalten create (Entscheidung 10.07., §3b):** Default **Sofort-Publish** (Alt-Verhalten, per Log belegt); **Admin-Schalter** „KI-Prüfung für Legacy-API" → Status review + KI-Routing (Gelb/Grün auto-publish, Rot Ablehnung + Mail). Umsetzung: Setting (config + Admin-UI-Toggle), Legacy-Create wertet es aus. Blacklist/Slot-Verbrauch laufen in beiden Wegen über `PressReleaseService::publish()`.
|
||||
- [x] **S3 — Endpoint-Scope entschieden (10.07.):** per Log-Auswertung (§3a) — nur die 5 echten connektar-Endpoints nachbauen, Rest bleibt 410. (User hat Logs in `dev/api/` geliefert; ersetzt das frühere [EXTERN] Log-Beschaffen.)
|
||||
- [ ] **S4 — Testdaten** (User liefert Vorgaben, s. Abschnitt unten): Vorschlag: Artisan-Command `legacy:seed-api-testdata` — legt API-Testkunden nach connektar-Muster an (aktiv, grandfathered, Legacy-Key) inkl. Firma, Kategorie, Beispiel-PMs und gibt Key + curl-Sammlung aus; nur `local`/`staging`.
|
||||
- [ ] **S5 — Paritäts-Smoke auf Staging:** curl-Sammlung des connektar-Flows (X-ApiKey, verschachtelte Params) gegen Staging; Vergleich gegen Alt-System-Responses.
|
||||
|
|
@ -143,3 +143,17 @@ Scope nach Log-Auswertung (§3a): **die 5 connektar-Endpoints**, verhaltensgleic
|
|||
(Sofort-Publish + Admin-Schalter KI-Prüfung, zwei getrennte APIs,
|
||||
Rückkanal später). Schrittplan S1–S7 auf den echten Scope zugeschnitten;
|
||||
S3 damit entschieden. **Nächster Schritt: S1 + S2 implementieren.**
|
||||
- **10.07.2026 (3): S1 + S2 UMGESETZT** — eigene Legacy-Controller
|
||||
(`app/Http/Controllers/Api/Legacy/`) für die 5 connektar-Endpoints,
|
||||
verhaltensgleich (verschachtelte Params, 201+Location+{}, Alt-Fehlerformat,
|
||||
published-only-GET mit Hit-Zählung, Legacy-Land-Mapping). Anlegen =
|
||||
Einreichen; Sofort-Publish über neue Permission `api:immediate-publication`
|
||||
(Seeder; **connektar-User beim Go-Live zuweisen, WS-7!**) — übersteuerbar
|
||||
durch den neuen Admin-Schalter „KI-Prüfung Legacy-API" (`app_settings`,
|
||||
Toggle auf /admin/press-releases). Dazu: KI-Spalte + manueller Prüf-Button
|
||||
(ohne Routing) in der Admin-PM-Liste; Benachrichtigungs-Mails bei
|
||||
API-Einlieferern an Pressekontakt, sonst Firmen-Mail, Fallback Einlieferer
|
||||
(Entscheidung 10.07.). Tests: `LegacyServiceParityTest` (5, inkl.
|
||||
connektar-Flow end-to-end) + Bestands-Tests nachgezogen.
|
||||
- **Offen:** S4 Testdaten (User-Vorgaben ausstehend) · S5 Staging-Smoke ·
|
||||
S6 Rückkanal (v1, nachgelagert) · S7 Mailing · WS-7 Permission connektar.
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G
|
|||
|
||||
**10.07. nachmittags — R2.5 + QA-Nachpruefung + R4.3 + KI-Queue-Fix + API-KI-Deklaration (Suite: 1165 gruen):** R2.5 erledigt (legal-request-Texte aus freigegebenem Meldeverfahren, s. R2.5) · QA-Checkliste B–G vertieft (s. R6.1) · R4.3 erledigt (Karten-Helper am Model, s. R4.3). **Befund KI-Pruefung:** Auto-Routing (Rot → Ablehnung, Gelb/Gruen → Auto-Publish) war laengst gebaut, lief lokal aber nie — `composer run dev` startete den Worker ohne `--queue=default,classification`; gefixt, Backlog abgearbeitet (Pipeline live verifiziert; Prod-Runbook war korrekt). **Befund + Fix API (Entscheidung User 10.07.):** v1-API hatte keine KI-Deklarationsfelder → Submit lief seit 09.07. immer auf 422 (haette alle 406 Legacy-API-Kunden blockiert; Suite uebersah es, weil die Factory deklariert). Jetzt: `ai_text_declaration` Pflicht im v1-Submit (Call gilt dokumentiert als verbindliche Bestaetigung + Archiv-Kenntnisnahme AGB § 13), `ai_declaration` Pflicht je Bild-Upload; Legacy-/service-Pfade defaulten auf none/original (Mailing R6.4 weist darauf hin, dass die weitere Nutzung diese Erklaerung darstellt); OpenAPI + /api-Seite aktualisiert. Tests: Submit-/Image-/Legacy-API-Tests erweitert. **Beobachtung fuer QA/Launch:** Test-Kauderwelsch („asdas dsada…") wurde Gruen klassifiziert und auto-publiziert — vor Go-Live Prompt/Schwelle pruefen bzw. `CLASSIFICATION_GREEN_DELAY` als Sicherheitsfenster setzen [USER-ENTSCHEIDUNG].
|
||||
|
||||
**10.07. abends — API-Legacy-Paritaet (neues Arbeitsdokument `dev/release/api-legacy-paritaet.md`):** User-Vorgabe: /service-API muss beim Cutover verhaltensgleich zum Altsystem laufen. Alt-Vertrag vollstaendig aus dem Symfony-Code (`_businessportal24.com/`) extrahiert; Prod-Aktivitaets-Logs (User, `dev/api/` — enttrackt via .gitignore, Kundendaten!) ausgewertet: **ein echter Client (connektar), 5 Endpoints, Sofort-Publish beim POST belegt; 2 der 5 Endpoints (Company-/Kontakt-Create) laufen heute auf 410.** Entscheidungen: Sofort-Publish nachbilden + Admin-Schalter fuer KI-Pruefung der Legacy-Einlieferungen; Legacy-API und v1 bleiben getrennt; Ablehnungs-Rueckkanal spaeter in v1. **Naechster Schritt: S1+S2 aus der Paritaets-Doku implementieren (Compat-Controller + Statusverhalten), dann S4 Testdaten (User-Vorgaben folgen).**
|
||||
**10.07. abends — API-Legacy-Paritaet (neues Arbeitsdokument `dev/release/api-legacy-paritaet.md`):** User-Vorgabe: /service-API muss beim Cutover verhaltensgleich zum Altsystem laufen. Alt-Vertrag vollstaendig aus dem Symfony-Code (`_businessportal24.com/`) extrahiert; Prod-Aktivitaets-Logs (User, `dev/api/` — enttrackt via .gitignore, Kundendaten!) ausgewertet: **ein echter Client (connektar), 5 Endpoints, Sofort-Publish beim POST belegt; 2 der 5 Endpoints (Company-/Kontakt-Create) laufen heute auf 410.** Entscheidungen: Sofort-Publish nachbilden + Admin-Schalter fuer KI-Pruefung der Legacy-Einlieferungen; Legacy-API und v1 bleiben getrennt; Ablehnungs-Rueckkanal spaeter in v1. S1+S2 noch am 10.07. umgesetzt: Legacy-Compat-Controller fuer die 5 connektar-Endpoints (inkl. Company-/Kontakt-Create, die vorher 410 liefen), Anlegen = Einreichen mit Sofort-Publish via Permission `api:immediate-publication` (WS-7: connektar zuweisen!), Admin-Schalter "KI-Pruefung Legacy-API" (neue app_settings-Tabelle, Toggle auf /admin/press-releases) + KI-Spalte/Pruef-Button in der Admin-PM-Liste; API-Einlieferer-Mails gehen an Pressekontakt/Firmen-Mail statt an den Einlieferer (User-Entscheidung). Tests: LegacyServiceParityTest. **Offen: S4 Testdaten (User-Vorgaben ausstehend), S5 Staging-Smoke, S7 Mailing.**
|
||||
|
||||
**Wiedereinstieg / naechste Schritte:**
|
||||
1. ~~Klaerungsliste Rechtstexte~~ **erledigt 06.07.**; ~~R3.1-Restbacklog~~ **erledigt 06.07.** (siehe oben).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue