-- Kalender an andere Konten freigeben. -- -- **Keine zweite Rechtetabelle.** acl_entries beantwortet fuer Ordner und -- Dateien bereits genau diese Frage -- wer darf was, direkt oder ueber eine -- Gruppe. Ein eigenes cal_shares daneben waere ein zweites Rechtesystem mit -- eigener Gruppenaufloesung, eigenem Widerrufen, eigenem Pruefpfad; zwei -- Systeme fuer dieselbe Frage laufen auseinander, und die Luecke faellt erst -- auf, wenn jemand sieht, was er nicht sehen soll. -- -- Nebeneffekt, der die Entscheidung traegt: Das Freigeben an eine **Gruppe** -- kommt damit ohne eine einzige Zeile zusaetzlichen Code. ALTER TABLE acl_entries ADD COLUMN IF NOT EXISTS resource_calendar_id UUID REFERENCES cal_calendars(id) ON DELETE CASCADE; -- Genau eine Ressource je Eintrag -- jetzt zu dritt. ALTER TABLE acl_entries DROP CONSTRAINT IF EXISTS acl_one_resource; ALTER TABLE acl_entries ADD CONSTRAINT acl_one_resource CHECK (num_nonnulls(resource_folder_id, resource_file_id, resource_calendar_id) = 1); -- Zwei Freigaben derselben Ressource an denselben Empfaenger waeren -- mehrdeutig: welches Recht gilt dann? CREATE UNIQUE INDEX IF NOT EXISTS idx_acl_user_calendar ON acl_entries (subject_user_id, resource_calendar_id) WHERE subject_user_id IS NOT NULL AND resource_calendar_id IS NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS idx_acl_group_calendar ON acl_entries (subject_group_id, resource_calendar_id) WHERE subject_group_id IS NOT NULL AND resource_calendar_id IS NOT NULL; -- Die Zugriffspruefung laeuft bei jedem CalDAV-Durchgang. CREATE INDEX IF NOT EXISTS idx_acl_calendar ON acl_entries (resource_calendar_id) WHERE resource_calendar_id IS NOT NULL;