feat: MCP-Tool add_lesson_attachment (Nutzer-Nachtrag)
CI / build-and-test (push) Canceled after 0s

download_lesson_attachment deckte bisher nur die Leserichtung ab, der
Nutzer legt Arbeitsblätter aber tatsächlich über die Anhang-Funktion an
Einzelstunden ab. Neues Write-Tool nimmt Dateiname + Base64-Inhalt
entgegen, validiert vor der Bestätigungsnachfrage (leer/ungültig/zu
groß) und lädt erst nach Bestätigung hoch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-11 23:45:56 +02:00
co-authored by Claude Sonnet 5
parent 55fba2cadb
commit e6c30b0bc7
5 changed files with 119 additions and 3 deletions
+14
View File
@@ -2636,6 +2636,20 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`:
"Out of Scope (v1)". Windows-Installer-Anpassungen und die Runtime-Dedup-Optimierung für
macOS (4.5.27) bleiben offen, sind aber nicht MCP-spezifisch.
- [x] **4.5.30** `add_lesson_attachment`-Tool (2026-09-11, Nutzer-Nachtrag zu 4.5.28): Nutzer nutzt
die bestehende Anhang-Funktion an Einzelstunden (`Lesson.Attachments`) tatsächlich, um
Arbeitsblätter abzulegen — `download_lesson_attachment` (4.5.28) deckte davon nur die
Leserichtung ab. Neues Write-Tool in
[LessonPlanTools.cs](LehrerApp.Desktop/Services/Mcp/Tools/LessonPlanTools.cs) nimmt
Dateiname + Base64-Inhalt entgegen, validiert (leer/ungültiges Base64/über
`IAttachmentStorage.MaxSizeBytes`) **vor** der Bestätigungsnachfrage, lädt erst nach
Bestätigung über `IAttachmentStorage.Upload` hoch und hängt den `DocumentAttachment`-Eintrag
an die Stunde. `DocumentAttachment` hat keine eigene Guid-Id (nur `StorageId`, ein string) —
`WriteResultDto.Id` bleibt deshalb `null`, die `storageId` steht stattdessen in der
Erfolgsmeldung, damit ein Folgeaufruf (z.B. zur Kontrolle per `download_lesson_attachment`)
ohne erneutes `get_lesson_plans` möglich ist. 4 neue Tests in
[McpToolsTests.cs](LehrerApp.Desktop.Tests/McpToolsTests.cs) (jetzt 32).
**Wichtige Abweichung von der ursprünglichen Planung (5.2):** Vor der Umsetzung zeigte sich,
dass 5.2 wie ursprünglich beschrieben eine zweite, parallele Fehlzeiten-Erfassung neben dem
bereits bestehenden Anwesenheits-Tracking aus Kapitel 3 (`ParticipationEntry.Attendance`,