QR-Typen je Gruppe freigeben
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
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
-- QR-Typen lassen sich je Gruppe abschalten.
|
||||
--
|
||||
-- Die globale Freigabe in "QrTypeSetting" bleibt die Grundlage. Diese Tabelle
|
||||
-- traegt nur Abweichungen davon: Fehlt eine Zeile, folgt die Gruppe der
|
||||
-- globalen Einstellung. Eine globale Abschaltung laesst sich hierueber nicht
|
||||
-- aufheben — global aus gewinnt immer.
|
||||
--
|
||||
-- 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.
|
||||
CREATE TABLE "QrTypeGroupSetting" (
|
||||
"type" TEXT NOT NULL,
|
||||
"groupId" TEXT NOT NULL,
|
||||
"enabled" BOOLEAN NOT NULL,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QrTypeGroupSetting_pkey" PRIMARY KEY ("type","groupId")
|
||||
);
|
||||
|
||||
CREATE INDEX "QrTypeGroupSetting_groupId_idx" ON "QrTypeGroupSetting"("groupId");
|
||||
|
||||
-- Mit der Gruppe verschwindet auch ihre Abweichung.
|
||||
ALTER TABLE "QrTypeGroupSetting" ADD CONSTRAINT "QrTypeGroupSetting_groupId_fkey"
|
||||
FOREIGN KEY ("groupId") REFERENCES "Group"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@@ -87,6 +87,7 @@ model Group {
|
||||
memberships Membership[]
|
||||
codes QrCode[]
|
||||
domainGrants DomainGrant[]
|
||||
typeSettings QrTypeGroupSetting[]
|
||||
}
|
||||
|
||||
/// Mitgliedschaft eines Benutzers in einer Gruppe, mit Rolle. Ein Benutzer
|
||||
@@ -155,6 +156,31 @@ model QrTypeSetting {
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
/// Abweichung von der globalen Freigabe fuer eine einzelne Gruppe.
|
||||
///
|
||||
/// Bewusst 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.
|
||||
///
|
||||
/// Fehlt eine Zeile, folgt die Gruppe der globalen Einstellung. Eine Zeile
|
||||
/// mit `enabled = false` schaltet den Typ **nur** in dieser Gruppe ab. Eine
|
||||
/// Zeile mit `enabled = true` kann eine globale Abschaltung **nicht**
|
||||
/// aufheben — global aus gewinnt immer.
|
||||
model QrTypeGroupSetting {
|
||||
/// Kennung aus der Typ-Registry, z. B. "website".
|
||||
type String
|
||||
groupId String
|
||||
enabled Boolean
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
group Group @relation(fields: [groupId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@id([type, groupId])
|
||||
@@index([groupId])
|
||||
}
|
||||
|
||||
/// Ein dynamischer QR-Code. Der QR-Code kodiert `{BASE_URL}/r/{slug}` und
|
||||
/// leitet beim Aufruf auf das Ziel weiter, das aus `data` aufgelöst wird.
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user