From c6f7c74c5207cb6b0c8a76cce565fa6e34b7725c Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 09:22:31 +0000 Subject: [PATCH] =?UTF-8?q?=C3=9Cbersicht:=20Routen-Form=20wie=20gebaut=20?= =?UTF-8?q?(path/access/run,=20Fehler=20werfen=20HttpError)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/superpowers/plans/2026-10-17-workers-00-uebersicht.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/superpowers/plans/2026-10-17-workers-00-uebersicht.md b/docs/superpowers/plans/2026-10-17-workers-00-uebersicht.md index 662a031..4b4ce7e 100644 --- a/docs/superpowers/plans/2026-10-17-workers-00-uebersicht.md +++ b/docs/superpowers/plans/2026-10-17-workers-00-uebersicht.md @@ -262,7 +262,7 @@ Basis intern: `http://webklar-workers:8092`. Von WOMS über nginx `https://ticke | `GET /api/workers/prospect/:id` | P3 | Team | Interessent + Faden + Nachrichten + Vorschau | ### 6.3 Verdrahtung (Registries, P3 legt an, P4 und P6 hängen ein) -`createApi({ deps, appwrite, version, fetchImpl, authTtlMs, routes })` (P3 ergänzt `routes`): `routes: [{ method, pattern: RegExp, handler: async (deps, ctx) => ({ status, json }) }]`, `pattern` relativ zu `/api/workers`, `ctx = { user:{ id, name, labels }, params, query, body }`; das Team-Recht ist vor dem Handler geprüft, Fehler laufen als `{ error }`. `src/main.js` exportiert `buildTickJobs()` und `buildRoutes()` (nicht `tickJobs()`/`extraRoutes()`); `start` übergibt `createTick({ deps, jobs: buildTickJobs() })` und `createApi({ …, routes: buildRoutes() })`. Module liefern `tickJobs` und `routes` (P3 `src/anfragen/index.js`, P4 `src/gespraeche/index.js`, P6 `src/ohneWebsite.js`); `buildDeps(config, over)` setzt die Deps aus §6 zusammen. +`createApi({ deps, appwrite, version, fetchImpl, authTtlMs, routes })` (P3 ergänzt `routes`): `routes: [{ method, path: '/pult/:id/reply', access: 'team' | 'admin', run: async ({ deps, user, params, query, body }) => antwortKoerper }]` (gebaut in P1/P3-T15, gilt statt älterer `pattern`/`handler`-Texte in P4/P6), `path` relativ zu `/api/workers` mit `:name`-Platzhaltern (URL-dekodiert in `params.name`), `query` ist `URLSearchParams`, `body()` ist eine **Funktion** (liest den JSON-Body erst beim Aufruf, leerer Body ⇒ `{}`), `user = { id, name, labels }`; das Recht prüft der Kern vor `run`; `run` liefert den Körper (Status 200), Fehler **werfen** `HttpError(status, satz)` aus `src/errors.js` (`PultError` ist einer) ⇒ `{ error: satz }`. `src/main.js` exportiert `buildTickJobs()` und `buildRoutes()` (nicht `tickJobs()`/`extraRoutes()`); `start` übergibt `createTick({ deps, jobs: buildTickJobs() })` und `createApi({ …, routes: buildRoutes() })`. Module liefern `tickJobs` und `routes` (P3 `src/anfragen/index.js`, P4 `src/gespraeche/index.js`, P6 `src/ohneWebsite.js`); `buildDeps(config, over)` setzt die Deps aus §6 zusammen. --- @@ -358,7 +358,7 @@ Stand: Abgleich der Teilpläne P1–P6 am 17.10.2026. Die Teilpläne haben ihre | P3-E3 | P3 | Job-Objekt laut §4.14; `next(deps, {kinds, workerIds?})`; Runner werfen bei Fehlern, Budget-Stopp als `{ skipped:'budget' }` ohne Versuchsverbrauch; Auftragsart `alarm_lesen` bleibt unbenutzt. | | P3-E4 | P3 | P3 bucht nur `gelesen, gefunden, passend, bewertet, entwuerfe, gesendet`; `meta` laut §5. | | P3-E5 | P3 | `src/anfragen/index.js` liefert `tickHandlers`, `jobRunners`, `routes`, `tickJobs`; Tick-Art `anfragen` (2 min); `main.js` bildet `buildTickJobs()`. | -| P3-E6 | P3 | `createApi({…, routes})` mit `routes: [{ method, pattern, handler(deps, ctx) }]` (Name `routes`, nicht `extraRoutes`). | +| P3-E6 | P3 | `createApi({…, routes})` mit `routes: [{ method, path, access, run(ctx) }]` (Name `routes`, nicht `extraRoutes`; Form siehe §6.3, gebaut in P3-T15). | | P3-E7 | P3 | `connectedRooms`: P3 pflegt `netz, kleinanzeigen, portale, foren` automatisch (`syncConnectedRooms`, fremde Räume bleiben erhalten); die Branchen-Räume setzt Kenso per `p6-freischalten.mjs raeume`; der WOMS-Dialog sendet das Feld nie. | | P3-E8 | P3 | `privacyInteressentenLive` (Standard false) ist das einzige Gate für jede Erstnachricht (Clara und Max); Skript `scripts/datenschutz-schalter.mjs`. | | P3-E9 | P3 | Nur **ein** Index auf `workersMessages.threadId`; `GET /pult` nimmt eine Komma-Liste und liefert `prospect`; Funktion `donePult`; `addPult` liefert zusätzlich `created`. | @@ -438,6 +438,7 @@ Stand: Abgleich der Teilpläne P1–P6 am 17.10.2026. Die Teilpläne haben ihre - Register-Listen (Freemail/Verzeichnisse/Baukästen) bleiben Aufzählungen; P6 ergänzt eine Laufzeit-Bremse: ein `dom`-Schlüssel, den mehr als 3 verschiedene Interessenten teilen würden, gilt als Plattform-Domain und wird nicht als harter Treffer gewertet (Hinweis ans Pult). - P2: Roster-Fixture ohne `**` in Maxʼ Rolle (byte-gleich mit `test/fixtures/workers-roster.json` aus dem Dienst); Polling-Takt bleibt unter dem nginx-Limit (20 r/s gemeinsam). - P4: `__bounce` und `__smtpStop` liegen in `countersJson` (16000 Zeichen; Verdichten behält `__smtpStop`). +- Routen (P3-T15, gilt für P4/P6): `{ method, path: '/x/:id', access, run(ctx) }`, `run` liefert den Körper, Fehler werfen `HttpError`/`PultError`; Tests rufen `route.run({ deps, user, params: { id }, query: new URLSearchParams(…), body: async () => ({…}) })`. Wo P4/P6 `pattern`/`handler(deps, ctx) → { status, json }` schreiben, gilt diese Form (Status ≠ 200 ⇒ werfen). Ungültige Id (nicht `^[A-Za-z0-9][A-Za-z0-9._-]{0,35}$`) ⇒ `HttpError(404, …)`. ## 12. Übernommene Ideen (Harvey)