Feat #11: QR-Typen je Gruppe freigeben #17

Merged
florian.wilde merged 2 commits from feat/11-typen-je-gruppe into main 2026-08-21 09:00:09 +00:00
Owner

Die Freigabe eines Typs bekommt eine zweite Ebene. Die Grundeinstellung gilt für die ganze Installation, je Gruppe lässt sich davon abweichen. Fehlt eine Abweichung, folgt die Gruppe der Grundeinstellung.

Zur offenen Frage im Issue: Die globale Abschaltung gewinnt immer — die im Issue selbst als „weniger überraschend“ bezeichnete Lesart. Ein global abgeschalteter Typ lässt sich in keiner Gruppe einschalten; der Schalter steht dort sichtbar still und nennt den Grund. Andersherum wäre „hier abgeschaltet“ keine verlässliche Aussage mehr, und wer den Schalter umlegt, müsste alle Gruppen durchsehen, um zu wissen, was er getan hat.

Abweichung von der Skizze im Issue: Nicht QrTypeSetting um einen zusammengesetzten Schlüssel erweitert, sondern eine eigene Tabelle QrTypeGroupSetting. Der globale Fall bräuchte dort eine leere Gruppe, und PostgreSQL lässt in einem eindeutigen Index beliebig viele NULL nebeneinander zu — die Eindeutigkeit der globalen Zeile wäre also gerade nicht gesichert.

Ein Detail dazu: „an“ für eine Gruppe löscht die Abweichung, statt eine Zeile mit enabled = true zu hinterlassen. Eine solche Zeile würde vortäuschen, sie könnte eine globale Abschaltung überstimmen.

Was sich sonst ändert

  • Startseite: die Vereinigung über die Gruppen des Anmeldenden.
  • Anlegen: die gewählte Gruppe entscheidet, POST /api/codes prüft das mit — mit einer Meldung, die zwischen „für diese Gruppe“ und „in der Verwaltung“ unterscheidet.
  • Typ-Verwaltung: Auswahl Freigabe für mit „Alle Gruppen (Grundeinstellung)“ und je Gruppe.
  • API: GET /api/admin/types?group={id}, PATCH mit optionalem groupId.

Migration: 20260821030000_typen_je_gruppe — neue Tabelle, Fremdschlüssel auf Group mit ON DELETE CASCADE.

Geprüft mit einer eigenen Testreihe: 38 von 38 — Abweichung setzen und zurücknehmen, „global aus gewinnt“ über API und beim Anlegen, Anlegen je Gruppe, Vereinigung auf der Startseite, Oberfläche samt gesperrtem Schalter, Handy-Breite.

Closes #11

Die Freigabe eines Typs bekommt eine zweite Ebene. Die **Grundeinstellung** gilt für die ganze Installation, **je Gruppe** lässt sich davon abweichen. Fehlt eine Abweichung, folgt die Gruppe der Grundeinstellung. **Zur offenen Frage im Issue:** Die globale Abschaltung gewinnt immer — die im Issue selbst als „weniger überraschend“ bezeichnete Lesart. Ein global abgeschalteter Typ lässt sich in keiner Gruppe einschalten; der Schalter steht dort sichtbar still und nennt den Grund. Andersherum wäre „hier abgeschaltet“ keine verlässliche Aussage mehr, und wer den Schalter umlegt, müsste alle Gruppen durchsehen, um zu wissen, was er getan hat. **Abweichung von der Skizze im Issue:** Nicht `QrTypeSetting` um einen zusammengesetzten Schlüssel erweitert, sondern eine eigene Tabelle `QrTypeGroupSetting`. Der globale Fall bräuchte dort eine leere Gruppe, und PostgreSQL lässt in einem eindeutigen Index beliebig viele `NULL` nebeneinander zu — die Eindeutigkeit der globalen Zeile wäre also gerade nicht gesichert. Ein Detail dazu: „an“ für eine Gruppe **löscht** die Abweichung, statt eine Zeile mit `enabled = true` zu hinterlassen. Eine solche Zeile würde vortäuschen, sie könnte eine globale Abschaltung überstimmen. **Was sich sonst ändert** - Startseite: die **Vereinigung** über die Gruppen des Anmeldenden. - Anlegen: die gewählte Gruppe entscheidet, `POST /api/codes` prüft das mit — mit einer Meldung, die zwischen „für diese Gruppe“ und „in der Verwaltung“ unterscheidet. - Typ-Verwaltung: Auswahl **Freigabe für** mit „Alle Gruppen (Grundeinstellung)“ und je Gruppe. - API: `GET /api/admin/types?group={id}`, `PATCH` mit optionalem `groupId`. **Migration**: `20260821030000_typen_je_gruppe` — neue Tabelle, Fremdschlüssel auf `Group` mit `ON DELETE CASCADE`. Geprüft mit einer eigenen Testreihe: 38 von 38 — Abweichung setzen und zurücknehmen, „global aus gewinnt“ über API **und** beim Anlegen, Anlegen je Gruppe, Vereinigung auf der Startseite, Oberfläche samt gesperrtem Schalter, Handy-Breite. Closes #11
florian.wilde added 1 commit 2026-08-21 01:49:02 +00:00
Bisher galt die Freigabe eines Typs fuer die ganze Installation. Bei
mehreren Gruppen ist das zu grob: Die Marketingabteilung braucht Social
Media, die Werkstatt nur Website und PDF.

Die Freigabe bekommt eine zweite Ebene. Die Grundeinstellung bleibt die
Grundlage; je Gruppe laesst sich davon abweichen. Fehlt eine Abweichung,
folgt die Gruppe der Grundeinstellung.

Zur offenen Frage im Issue: Die globale Abschaltung gewinnt immer. Ein
global abgeschalteter Typ laesst sich in keiner Gruppe einschalten — der
Schalter steht dort sichtbar still und nennt den Grund. Andersherum waere
"hier abgeschaltet" keine verlaessliche Aussage mehr.

Eine eigene Tabelle statt eines zusammengesetzten Schluessels in
QrTypeSetting: Der globale Fall braeuchte dort eine leere Gruppe, und
PostgreSQL laesst in einem eindeutigen Index beliebig viele NULL
nebeneinander zu — die Eindeutigkeit der globalen Zeile waere also gerade
nicht gesichert.

Die Startseite zeigt die Vereinigung ueber die eigenen Gruppen; beim
Anlegen entscheidet die gewaehlte Gruppe, und die Route prueft das noch
einmal.

Refs #11
florian.wilde added 1 commit 2026-08-21 08:59:12 +00:00
florian.wilde merged commit c6891f66ff into main 2026-08-21 09:00:09 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/qrcode-generator#17