Ein Zeitblock ist eine Aufgabe, die zu einer bestimmten Zeit in einem Kalender steht. Er lebt an zwei Orten — hier und beim Anbieter — und beide Seiten dürfen ihn verschieben. Daraus entsteht die Gefahr einer Endlosschleife: Die App schreibt, der Abgleich liest die eigene Änderung, hält sie für fremd, schreibt zurück, der Abgleich liest wieder. Der Ausweg ist ein Fingerabdruck über den Zeitraum, sha256(startISO|endeISO). Beim Schreiben merkt sich der Zeitblock, was er in den Kalender gelegt hat; kommt derselbe Fingerabdruck zurück, war es die eigene Änderung. Weicht er ab, hat jemand anderes verschoben — und dann gewinnt der Kalender. Bewusst nur über Beginn und Ende: Titel und Beschreibung ändern sich auch aus harmlosen Gründen, und für die Planung zählt allein, wann der Block liegt. 30 Tests, darunter zwei, die den eigentlichen Zweck prüfen: dass es sich über mehrere Runden nicht hochschaukelt und nach einer übernommenen fremden Verschiebung wieder zur Ruhe kommt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
32 lines
1.1 KiB
SQL
32 lines
1.1 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "zeitblock" (
|
|
"id" TEXT NOT NULL,
|
|
"aufgabeId" TEXT NOT NULL,
|
|
"kalenderkontoId" TEXT NOT NULL,
|
|
"beginn" TIMESTAMP(3) NOT NULL,
|
|
"ende" TIMESTAMP(3) NOT NULL,
|
|
"extId" TEXT,
|
|
"etag" TEXT,
|
|
"hash" TEXT,
|
|
"letzterFehler" TEXT,
|
|
"erstelltAm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"aktualisiertAm" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "zeitblock_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "zeitblock_beginn_ende_idx" ON "zeitblock"("beginn", "ende");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "zeitblock_aufgabeId_idx" ON "zeitblock"("aufgabeId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "zeitblock_kalenderkontoId_extId_key" ON "zeitblock"("kalenderkontoId", "extId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "zeitblock" ADD CONSTRAINT "zeitblock_aufgabeId_fkey" FOREIGN KEY ("aufgabeId") REFERENCES "aufgabe"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "zeitblock" ADD CONSTRAINT "zeitblock_kalenderkontoId_fkey" FOREIGN KEY ("kalenderkontoId") REFERENCES "kalenderkonto"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|