feat: Datenmodell und Umgebung fuer Integrationen

Ein Zustand je Quelle haelt fest, wie weit gelesen wurde und ob es
klappt. Der Merker ist bewusst ein freier Text: Zammad braucht darin
einen Zeitstempel, Telegram den Zaehler der zuletzt geholten Nachricht.

Dazu die gespiegelte Belegung ohne Titel, das Adressbuch der erlaubten
Telegram-Chats und der Einmalcode, mit dem sich ein Chat anmeldet.

Welche Integration eine Instanz darf, entscheidet weiterhin INSTANZ. Ein
Zammad-Token in der Instanz daheim bleibt wirkungslos — das steht in den
Faehigkeiten, nicht in einer Einstellung, die sich verstellen liesse.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-11 23:03:32 +02:00
co-authored by Claude Opus 5
parent ab1b898e44
commit 7f8f505126
5 changed files with 233 additions and 4 deletions
@@ -0,0 +1,62 @@
-- AlterTable
ALTER TABLE "aufgabe" ADD COLUMN "spiegeln" BOOLEAN NOT NULL DEFAULT false;
-- AlterTable
ALTER TABLE "benachrichtigungseinstellung" ADD COLUMN "perTelegram" BOOLEAN NOT NULL DEFAULT false;
-- CreateTable
CREATE TABLE "integrationszustand" (
"id" TEXT NOT NULL,
"quelle" "Quelle" NOT NULL,
"merker" TEXT,
"letzterLauf" TIMESTAMP(3),
"letzterErfolg" TIMESTAMP(3),
"letzterFehler" TEXT,
"fehlversuche" INTEGER NOT NULL DEFAULT 0,
"erstelltAm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"aktualisiertAm" TIMESTAMP(3) NOT NULL,
CONSTRAINT "integrationszustand_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "spiegelbelegung" (
"id" TEXT NOT NULL,
"quelleRef" TEXT NOT NULL,
"beginn" TIMESTAMP(3) NOT NULL,
"ende" TIMESTAMP(3) NOT NULL,
"empfangenAm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "spiegelbelegung_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "telegram_chat" (
"id" TEXT NOT NULL,
"chatId" BIGINT NOT NULL,
"bezeichnung" TEXT,
"benutzerId" TEXT,
"meldungen" BOOLEAN NOT NULL DEFAULT true,
"erstelltAm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"zuletztBenutzt" TIMESTAMP(3),
CONSTRAINT "telegram_chat_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "integrationszustand_quelle_key" ON "integrationszustand"("quelle");
-- CreateIndex
CREATE UNIQUE INDEX "spiegelbelegung_quelleRef_key" ON "spiegelbelegung"("quelleRef");
-- CreateIndex
CREATE INDEX "spiegelbelegung_beginn_idx" ON "spiegelbelegung"("beginn");
-- CreateIndex
CREATE UNIQUE INDEX "telegram_chat_chatId_key" ON "telegram_chat"("chatId");
-- CreateIndex
CREATE INDEX "telegram_chat_benutzerId_idx" ON "telegram_chat"("benutzerId");
-- AddForeignKey
ALTER TABLE "telegram_chat" ADD CONSTRAINT "telegram_chat_benutzerId_fkey" FOREIGN KEY ("benutzerId") REFERENCES "benutzer"("id") ON DELETE SET NULL ON UPDATE CASCADE;