Kalenderkonto mit Tokens und Abgleichverweis, Termin als örtlicher Spiegel mit genau so viel, wie die Belegungsrechnung und die Wochenansicht brauchen. Bereich bekommt sein Standard-Kalenderkonto für M4. Die Tokens liegen verschlüsselt (AES-256-GCM). Wer die Datenbank oder eine Sicherung in die Hände bekommt, hätte sonst direkten Zugriff auf fremde Kalender — das wiegt schwerer als bei den OIDC-Tokens aus M1, die nur die Anmeldung betreffen. Der Schlüssel wird aus AUTH_SECRET abgeleitet statt separat konfiguriert: eine weitere Pflichtvariable wäre eine weitere Stelle, an der die Einrichtung scheitert. kalenderId ist nicht optional, sondern trägt den Wert "standard" für den Standardkalender — Prisma lässt in einem zusammengesetzten Unique-Schlüssel kein null zu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
71 lines
2.5 KiB
SQL
71 lines
2.5 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "KalenderAnbieter" AS ENUM ('GRAPH', 'GOOGLE');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ZeigtAls" AS ENUM ('FREI', 'GEBUCHT', 'MIT_VORBEHALT', 'ABWESEND', 'WOANDERS', 'UNBEKANNT');
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "bereich" ADD COLUMN "standardKalenderkontoId" TEXT;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "kalenderkonto" (
|
|
"id" TEXT NOT NULL,
|
|
"benutzerId" TEXT NOT NULL,
|
|
"anbieter" "KalenderAnbieter" NOT NULL,
|
|
"anzeigename" TEXT NOT NULL,
|
|
"extKontoId" TEXT NOT NULL,
|
|
"kalenderId" TEXT,
|
|
"zugriffstoken" TEXT,
|
|
"aktualisierungstoken" TEXT,
|
|
"tokenGueltigBis" TIMESTAMP(3),
|
|
"bereiche" TEXT,
|
|
"deltaVerweis" TEXT,
|
|
"letzterAbgleich" TIMESTAMP(3),
|
|
"letzterFehler" TEXT,
|
|
"aktiv" BOOLEAN NOT NULL DEFAULT true,
|
|
"erstelltAm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"aktualisiertAm" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "kalenderkonto_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "termin" (
|
|
"id" TEXT NOT NULL,
|
|
"kalenderkontoId" TEXT NOT NULL,
|
|
"extId" TEXT NOT NULL,
|
|
"etag" TEXT,
|
|
"betreff" TEXT,
|
|
"beginn" TIMESTAMP(3) NOT NULL,
|
|
"ende" TIMESTAMP(3) NOT NULL,
|
|
"ganztaegig" BOOLEAN NOT NULL DEFAULT false,
|
|
"zeigtAls" "ZeigtAls" NOT NULL DEFAULT 'GEBUCHT',
|
|
"aktualisiertAm" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "termin_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "kalenderkonto_benutzerId_aktiv_idx" ON "kalenderkonto"("benutzerId", "aktiv");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "kalenderkonto_benutzerId_anbieter_extKontoId_kalenderId_key" ON "kalenderkonto"("benutzerId", "anbieter", "extKontoId", "kalenderId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "termin_kalenderkontoId_beginn_idx" ON "termin"("kalenderkontoId", "beginn");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "termin_beginn_ende_idx" ON "termin"("beginn", "ende");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "termin_kalenderkontoId_extId_key" ON "termin"("kalenderkontoId", "extId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "bereich" ADD CONSTRAINT "bereich_standardKalenderkontoId_fkey" FOREIGN KEY ("standardKalenderkontoId") REFERENCES "kalenderkonto"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "kalenderkonto" ADD CONSTRAINT "kalenderkonto_benutzerId_fkey" FOREIGN KEY ("benutzerId") REFERENCES "benutzer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "termin" ADD CONSTRAINT "termin_kalenderkontoId_fkey" FOREIGN KEY ("kalenderkontoId") REFERENCES "kalenderkonto"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|