Übersicht: Routen-Form wie gebaut (path/access/run, Fehler werfen HttpError)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-18 09:22:31 +00:00
1 parent d732494eee
commit c6f7c74c52
1 file changed
+3 -2
@@ -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 | | `GET /api/workers/prospect/:id` | P3 | Team | Interessent + Faden + Nachrichten + Vorschau |
### 6.3 Verdrahtung (Registries, P3 legt an, P4 und P6 hängen ein) ### 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-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-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-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-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-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`. | | 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). - 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). - 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`). - 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) ## 12. Übernommene Ideen (Harvey)