From e4b08b4c30fce2001463e71e108597ccbf4dc524 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Thu, 10 Sep 2026 18:34:51 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20DEVLOG-Eintrag=20f=C3=BCr=20M3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ziel, Erledigtes, die Entscheidungen mit Begründung, die Probleme samt Lösung und die offenen Punkte — allen voran, dass der Abgleich nicht gegen die echten APIs getestet werden konnte. Dauer laut zeiten.csv: 41 Minuten. Gesamt bislang 246 Minuten. Co-Authored-By: Claude Opus 5 --- devlog/DEVLOG.md | 93 ++++++++++++++++++++++++++++++++++++++++++++++- devlog/zeiten.csv | 1 + 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/devlog/DEVLOG.md b/devlog/DEVLOG.md index 5656970..2b0c402 100644 --- a/devlog/DEVLOG.md +++ b/devlog/DEVLOG.md @@ -9,7 +9,98 @@ die Übersicht aus `scripts/zeit.sh summe`. | ----------- | ------ | ------- | -------- | | M1 | claude | 161 | 2,68 | | M2 | claude | 44 | 0,73 | -| **Gesamt** | | **205** | **3,42** | +| M3 | claude | 41 | 0,68 | +| **Gesamt** | | **246** | **4,10** | + +--- + +## 2026-09-10 – M3: Kalender lesen + +**Dauer:** 41 Minuten (17:48–18:29), Art `claude`. + +**Ziel der Sitzung:** Termine aus Microsoft 365 und Google lesen, damit der +Planer weiß, wann überhaupt Platz ist. + +### Erledigt + +- `Kalenderkonto` und `Termin` samt Migration; Bereich bekommt sein + Standard-Kalenderkonto für M4 +- Tokenverschlüsselung mit AES-256-GCM +- Antworten beider Anbieter mit zod geprüft und in eine gemeinsame Form + gebracht, geprüft gegen anonymisierte Beispielantworten +- Belegungsrechnung: Kapazität gegen Termine, freie Fenster für M4 +- OAuth-Verbinden, Tokenerneuerung, seitenweiser Abgleich mit Rückfall auf + einen vollständigen Durchlauf +- Seite für die Kalenderkonten, Belegung des Tages auf der Startseite +- Hintergrundjobs für Abgleich und nächtliches Aufräumen +- 68 neue Unit-Tests, 10 neue Integrationsprüfungen +- Handbuchseite und Einrichtungsanleitung für Entra ID und Google + +### Entscheidungen mit Begründung + +**Tokens verschlüsselt, Schlüssel aus AUTH_SECRET abgeleitet.** Wer die +Datenbank oder eine Sicherung bekommt, hätte sonst direkten Zugriff auf +fremde Kalender — das wiegt schwerer als bei den OIDC-Tokens aus M1, die +nur die Anmeldung betreffen. Eine eigene Pflichtvariable wäre eine weitere +Stelle, an der die Einrichtung scheitert; die Ableitung über HKDF kostet +nichts und hat die richtige Nebenwirkung: wer AUTH_SECRET wechselt, muss +die Konten neu verbinden — dann sind ohnehin alle Sitzungen ungültig. + +**Bei fremder Zeitzone abbrechen statt raten.** Graph liefert Datum und +Zeitzone getrennt, ohne Versatz im Text. Wir fragen ausdrücklich UTC an; +kommt etwas anderes zurück, wäre jede Umrechnung geraten und würde Termine +um Stunden verschieben. Ein Abbruch mit klarer Meldung ist besser als ein +Kalender, der leise falsch liegt. + +**Unbekanntes showAs zählt als belegt.** Lieber eine Stunde zu viel +blockiert als eine Doppelbuchung. + +**Schreibrechte schon jetzt anfragen.** M3 liest nur, aber M4 schreibt. +Später erneut zuzustimmen ist genau der Schritt, an dem Einrichtung +scheitert — einmal breiter fragen ist das kleinere Übel. + +**Ganztägige Termine zählen nicht zur Belegung.** Ein Urlaubstag oder +Geburtstag blockiert sonst den ganzen Tag, obwohl er keine Arbeitszeit +kostet. + +**Alle Kalender zählen gegen jeden Bereich.** Ein Termin blockiert die Zeit +ohnehin, gleich zu welchem Lebensbereich er gehört. + +**Kein SDK für Graph und Google.** Es geht um drei Aufrufe je Anbieter, und +die Antworten werden ohnehin mit zod geprüft. Ein SDK brächte vor allem +Abhängigkeiten und blinde Flecken. + +### Probleme und Lösungen + +| Problem | Lösung | +| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | +| Prisma lässt in einem zusammengesetzten Unique-Schlüssel kein null zu | `kalenderId` ist nicht optional, sondern trägt den sprechenden Wert `"standard"` für den Standardkalender. | +| Googles `syncToken` verträgt sich nicht mit `timeMin`/`timeMax` | Folgeabgleiche liefern auch Änderungen außerhalb des Fensters. Was daneben liegt, wird beim Spiegeln verworfen — sonst wüchse der Spiegel unbegrenzt. | +| Der Verweis für die nächste Runde kann ablaufen (HTTP 410) | Verweis verwerfen, Spiegel leeren, von vorn lesen. Der Ablauf ist so gebaut, dass ein vollständiger Durchlauf jederzeit möglich ist. | +| Die Shell zerlegte in mehreren Anläufen Template-Literale und Backticks | Auf `node - <<'SKRIPT'` umgestellt; damit geht der Text unverändert durch. | + +### Offene Punkte + +- **Nicht gegen die echten APIs getestet.** Ich habe keine Zugangsdaten für + Entra ID oder Google. Provider und Abgleich sind gegen anonymisierte + Beispielantworten geprüft; den ersten echten Verbindungsversuch muss + Florian machen. Die Anleitung dafür steht in der README. +- Nur der Standardkalender je Konto. Mehrere Kalender desselben Kontos sind + im Datenmodell vorgesehen, es fehlt die Auswahl in der Oberfläche. +- Der Abgleich läuft in einer Schleife über alle Konten. Bei vielen Konten + wäre das nacheinander zu langsam; bei der erwarteten Zahl ist es das + einfachere Verhalten. + +### Commits + +- 79e6c0d feat(kalender): Datenmodell für Kalenderkonten und Termine +- 6fda2a5 feat(kalender): Antworten von Graph und Google lesen, Belegung rechnen +- 9946e7c feat(kalender): OAuth und Abgleich für Graph und Google +- 0c67b73 feat(kalender): Seite für die Kalenderkonten +- 42c98c8 feat(kalender): Hintergrundjobs für Abgleich und Aufräumen +- d8d3227 feat(kalender): Belegung des Tages auf der Startseite +- df50627 test: Verschlüsselung und Kalendermodelle absichern +- a8b2ff0 docs: Handbuchseite und Einrichtung der Kalenderanbieter --- diff --git a/devlog/zeiten.csv b/devlog/zeiten.csv index 198eb51..0a5c029 100644 --- a/devlog/zeiten.csv +++ b/devlog/zeiten.csv @@ -1,3 +1,4 @@ datum;start;ende;minuten;meilenstein;art;notiz 2026-09-10;12:06;14:47;161;M1;claude;M1 Fundament fertiggestellt 2026-09-10;15:57;16:41;44;M2;claude;M2 Aufgaben und Projekte fertig +2026-09-10;17:48;18:29;41;M3;claude;M3 Kalender lesen fertig