Anbindung eines Hot-Folder/Scanner-Eingangs für E-Mail-Anhänge/ Dokumente außerhalb des IMAP-Postfachs, analog zum Ingestion-Pfad. - store.go: Postgres-Store verzeichnet bereits importierte Dateien je Mandant/Postfach über SHA-256-Inhalts-Hash. - watcher.go: ScanOnce verarbeitet den Eingangsordner, verschiebt Duplikate unauffällig und Verarbeitungsfehler gezielt in den Fehlerordner, ohne den Scan zu blockieren. Watch nutzt echtes fsnotify für Live-Ereignisse plus initialen ScanOnce beim Start. - Neue minimale Abhängigkeit github.com/fsnotify/fsnotify ergänzt. Prüfungen (alle real durchgeführt, siehe mail/docs/IMP-05-PRUEFPROTOKOLL.md): 1. TestScanOnce_SameFileDroppedTwiceImportedOnce: identischer Inhalt unter zwei Dateinamen real nur einmal importiert. 2. TestScanOnce_CorruptFileMovedToErrorFolderTraceably: defekte Datei real im Fehlerordner, gute Nachbardatei real trotzdem verarbeitet. 3. TestScanOnce_ManyCyclesWithoutResourceLeak: 50 reale Zyklen ohne Goroutine-Leck. Zusätzlich TestWatch_RealFsnotifyEventTriggersImport für die benannte Technik. Kein Umbau: kein bestehendes Paket angefasst. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
3.0 KiB
3.0 KiB
IMP-05 – Prüfprotokoll: Hot-Folder/Scanner-Anbindung
Voraussetzung IMP-01 (Fertig).
Umsetzung
mail/internal/hotfolder/store.go—Store(Postgres,mail_hotfolder_processed, gleiches Muster wiededup/folderstate): verzeichnet bereits importierte Dateien je Mandant/Postfach über den SHA-256-Inhalts-Hash — Grundlage für Akzeptanzkriterium 2 (identischer Inhalt wird nicht doppelt importiert, auch unter neuem Dateinamen).mail/internal/hotfolder/watcher.go—Watcher:ScanOnce: verarbeitet alle Dateien im Eingangsordner, ordnet sie strukturell dem beim Konfigurieren festgelegten Mandanten/Postfach zu (Akzeptanzkriterium 1 — ein Watcher je Mandant/Postfach-Paar).- Bereits verarbeiteter Inhalt wandert unauffällig in den
Verarbeitet-Ordner, ohne den
Handlererneut aufzurufen. - Ein Verarbeitungsfehler (defekte Datei) verschiebt NUR diese eine Datei in den Fehlerordner, der Scan läuft mit den übrigen Dateien weiter (Akzeptanzkriterium 3).
Watch: echtefsnotify-Anbindung (Technische Grundlage laut Ticket) — initialerScanOncebeim Start, danach Live-Ereignisse.
- Kein Umbau: kein bestehendes Paket angefasst — IMP-05 ist vollständig
neu und eigenständig.
github.com/fsnotify/fsnotifyals neue, minimale externe Abhängigkeit ergänzt (go getauf 192.168.1.131,go.mod/go.sumaktualisiert).
Prüfungen
| # | Prüfung | Ergebnis |
|---|---|---|
| 1 | Test: gleiche Datei zweimal abgelegt wird nur einmal importiert | bestanden – TestScanOnce_SameFileDroppedTwiceImportedOnce: identischer Inhalt unter zwei verschiedenen Dateinamen abgelegt, zweiter Scan meldet real 0 Importe/1 Duplikat, Handler real nur 1x aufgerufen |
| 2 | Test: fehlerhafte Datei landet nachvollziehbar im Fehlerordner | bestanden – TestScanOnce_CorruptFileMovedToErrorFolderTraceably: defekte Datei real im Fehlerordner, real aus dem Eingang entfernt, die GUTE Nachbardatei wurde real trotzdem verarbeitet |
| 3 | Dauertest über mehrere Scan-Zyklen ohne Ressourcenleck | bestanden – TestScanOnce_ManyCyclesWithoutResourceLeak: 50 reale Scan-Zyklen, Goroutine-Anzahl real stabil (Toleranz eingehalten), Verarbeitet-Ordner real konsistent |
Zusätzlich (benannte Technik fsnotify real geprüft):
TestWatch_RealFsnotifyEventTriggersImport — eine neu abgelegte Datei
wird real über ein echtes Dateisystem-Ereignis erkannt und importiert,
ohne manuellen ScanOnce-Aufruf.
Build/Test-Ergebnis (192.168.1.131)
go build ./... -> clean
go vet ./... -> clean
golangci-lint run ./... -> 0 issues
TEST_TENANT_DSN=... go test ./internal/hotfolder/... -v -timeout 60s -> 4/4 bestanden
TEST_TENANT_DSN=... TEST_MANTICORE_URL=... go test ./... -p 1
-> alle 20 Pakete bestanden, keine Regression
Gesamtergebnis
Bestanden. Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen real erfüllt. Trägt zu QA-02 bei — QA-02 bleibt weiterhin blockiert, bis dessen übrige Abhängigkeiten (ING-07, ING-08, ING-10, IMP-06, IMP-07) fertig sind.