OciServe-thema's: publiceer en haal thema's op, opt-in (nu vult niemand het themaregister) #2429

Closed
opened 2026-10-14 18:40:47 +00:00 by brenno · 2 comments
Owner

Wat wil je bereiken

Een auteur kan een presentatiethema uit OciDeck delen met de organisatie, zodat het in Keiko's themakiezer verschijnt en een cursus naar een thema kan verwijzen. OciServe #360 heeft het register gebouwd met OciDeck als bron; OciDeck vult het niet.

Wat mist er nu (origin/main 5802e9360)

  • Geen enkele aanroep van themes in de OciServe-gateway. Thema's leven alleen lokaal (SharedPreferences, per app), dus het register op de server blijft leeg en Keiko's CourseThemePicker heeft niets te kiezen (brenno/Keiko#402).

Contract (OciServe 560f1ba)

  • POST /organizations/{org}/themes (Idempotency-Key) body {name, definition} → 201 ThemeItem {id, name, definition, is_builtin, created_at, updated_at}. De definition is ondoorzichtige ThemeProfile-JSON van OciDeck; de server controleert alleen dat het een JSON-object is.
  • GET …/themes (cursor), GET …/themes/{id} met ETag.
  • PUT …/themes/{id} {name, definition} met If-Match; DELETE → 204, maar 409 voor een ingebouwd thema of een thema in gebruik.
  • Schrijven vraagt content:create.

Gevraagd

  • Expliciete actie, nooit automatisch: "Thema delen met de organisatie" in het themamenu van een auteur met een OciServe-verbinding. Toon wat er naartoe gaat (naam en volledige definitie) vóór bevestiging.
  • Ophalen: "Thema's van de organisatie" als bron naast de lokale thema's; een opgehaald thema blijft een gewone lokale kopie en werkt ook zonder verbinding.
  • Bij een bijgewerkt thema If-Match gebruiken en bij 412 de keuze geven tussen overschrijven en de serverversie overnemen; geen stille overschrijving.
  • Een thema dat in gebruik is door een cursus kan de server niet verwijderen; toon die 409 als uitleg.
  • De definition bevat geen persoonsgegevens, maar kan een logo bevatten: controleer of afbeeldingen als asset-hash of als ingesloten bytes meegaan en begrens de grootte.

Toets op de kernwaarden

Alleen actief voor wie bewust met een OciServe is verbonden (ongewijzigd); zonder server blijft OciDeck volledig lokaal werken. Geen telemetrie, geen wijziging van het bestandsformaat, geen nieuwe verplichte afhankelijkheid. De route staat al in de gepinde speckopie (test/fixtures/ociserve_openapi.yaml, OciServe 45d9a87), dus de pin hoeft niet omhoog; registreer de nieuwe aanroepen wel in test/ociserve_api_drift_test.dart (de contractpoort, #2042).

Acceptatiecriteria

  • Delen en ophalen werken tegen een echte OciServe; zonder verbinding verandert er niets aan thema's.
  • Ronde-trip: een gedeeld thema komt in Keiko's kiezer en terug in OciDeck zonder veldverlies (de definitie is ondoorzichtig).
  • 412 en 409 krijgen een begrijpelijke zin.

Acceptatiecriteria (algemeen)

  • Nieuwe aanroepen staan in de contractpoort met de velden die OciDeck leest.
  • Nieuwe l10n.d('…')-teksten via make add-l10n (31 talen).
  • make check groen; docs/USER_GUIDE.md, docs/SOURCE_MAP.md en CHANGELOG.md bijgewerkt.

Gerelateerd

Keiko: brenno/Keiko#402. Overzicht: brenno/OciServe#659.


Keten-audit van 2026-10-14, getoetst aan OciServe 560f1ba, Keiko 093f679 en OciDeck 5802e9360. Overzicht: brenno/OciServe#659.

## Wat wil je bereiken Een auteur kan een presentatiethema uit OciDeck delen met de organisatie, zodat het in Keiko's themakiezer verschijnt en een cursus naar een thema kan verwijzen. OciServe #360 heeft het register gebouwd met OciDeck als bron; OciDeck vult het niet. ## Wat mist er nu (origin/main `5802e9360`) - Geen enkele aanroep van `themes` in de OciServe-gateway. Thema's leven alleen lokaal (SharedPreferences, per app), dus het register op de server blijft leeg en Keiko's `CourseThemePicker` heeft niets te kiezen (brenno/Keiko#402). ## Contract (OciServe `560f1ba`) - `POST /organizations/{org}/themes` (`Idempotency-Key`) body `{name, definition}` → 201 `ThemeItem {id, name, definition, is_builtin, created_at, updated_at}`. De `definition` is ondoorzichtige ThemeProfile-JSON van OciDeck; de server controleert alleen dat het een JSON-object is. - `GET …/themes` (cursor), `GET …/themes/{id}` met ETag. - `PUT …/themes/{id}` `{name, definition}` met `If-Match`; `DELETE` → 204, maar 409 voor een ingebouwd thema of een thema in gebruik. - Schrijven vraagt `content:create`. ## Gevraagd - **Expliciete actie**, nooit automatisch: "Thema delen met de organisatie" in het themamenu van een auteur met een OciServe-verbinding. Toon wat er naartoe gaat (naam en volledige definitie) vóór bevestiging. - Ophalen: "Thema's van de organisatie" als bron naast de lokale thema's; een opgehaald thema blijft een gewone lokale kopie en werkt ook zonder verbinding. - Bij een bijgewerkt thema `If-Match` gebruiken en bij 412 de keuze geven tussen overschrijven en de serverversie overnemen; geen stille overschrijving. - Een thema dat in gebruik is door een cursus kan de server niet verwijderen; toon die 409 als uitleg. - De `definition` bevat geen persoonsgegevens, maar kan een logo bevatten: controleer of afbeeldingen als asset-hash of als ingesloten bytes meegaan en begrens de grootte. ## Toets op de kernwaarden Alleen actief voor wie bewust met een OciServe is verbonden (ongewijzigd); zonder server blijft OciDeck volledig lokaal werken. Geen telemetrie, geen wijziging van het bestandsformaat, geen nieuwe verplichte afhankelijkheid. De route staat al in de gepinde speckopie (`test/fixtures/ociserve_openapi.yaml`, OciServe `45d9a87`), dus de pin hoeft niet omhoog; registreer de nieuwe aanroepen wel in `test/ociserve_api_drift_test.dart` (de contractpoort, #2042). ## Acceptatiecriteria - [ ] Delen en ophalen werken tegen een echte OciServe; zonder verbinding verandert er niets aan thema's. - [ ] Ronde-trip: een gedeeld thema komt in Keiko's kiezer en terug in OciDeck zonder veldverlies (de definitie is ondoorzichtig). - [ ] 412 en 409 krijgen een begrijpelijke zin. ## Acceptatiecriteria (algemeen) - [ ] Nieuwe aanroepen staan in de contractpoort met de velden die OciDeck leest. - [ ] Nieuwe `l10n.d('…')`-teksten via `make add-l10n` (31 talen). - [ ] `make check` groen; `docs/USER_GUIDE.md`, `docs/SOURCE_MAP.md` en `CHANGELOG.md` bijgewerkt. ## Gerelateerd Keiko: brenno/Keiko#402. Overzicht: brenno/OciServe#659. --- _Keten-audit van 2026-10-14, getoetst aan OciServe `560f1ba`, Keiko `093f679` en OciDeck `5802e9360`. Overzicht: brenno/OciServe#659._
Author
Owner

Gemerged in #2444 (merge-commit 5446218c72). Na het samenvoegen met main is de per-bestand-dekking van de nieuwe provider-, dialoog- en bewijslagen met tests aangevuld; make check, check-secrets en sast zijn groen. #2424 was al gedekt door me/exam-results.

Gemerged in https://pawprint.vigilis.online/LibreKAT/Ocideck/pulls/2444 (merge-commit 5446218c72). Na het samenvoegen met main is de per-bestand-dekking van de nieuwe provider-, dialoog- en bewijslagen met tests aangevuld; make check, check-secrets en sast zijn groen. #2424 was al gedekt door me/exam-results.
Author
Owner

Nalevering in #d191e3d0d5 (PR #2447, commit 7efde5aaaf). Een ontbrekende ETag of een letterlijke ster is geen If-Match; stil overschrijven gebeurt niet. De gepinde spec gebruikt 409 voor dat conflict, niet 412. Niet live bewezen: de themakiezer in Keiko.

Nalevering in #d191e3d0d569ba220ca640f5f8e08ce58fa99686 (PR https://pawprint.vigilis.online/LibreKAT/Ocideck/pulls/2447, commit 7efde5aaaf9f62622e16b282d1bfd0fd55b4fda4). Een ontbrekende ETag of een letterlijke ster is geen If-Match; stil overschrijven gebeurt niet. De gepinde spec gebruikt 409 voor dat conflict, niet 412. Niet live bewezen: de themakiezer in Keiko.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2429
No description provided.