Files
nexarch/mail/docs/IMP-05-PRUEFPROTOKOLL.md
sysopsandClaude Sonnet 5 6e01cecca7 IMP-05: hot-folder-scanner-anbindung
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
2026-09-01 00:22:56 +02:00

3.0 KiB
Raw Permalink Blame History

IMP-05 Prüfprotokoll: Hot-Folder/Scanner-Anbindung

Voraussetzung IMP-01 (Fertig).

Umsetzung

  • mail/internal/hotfolder/store.goStore (Postgres, mail_hotfolder_processed, gleiches Muster wie dedup/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.goWatcher:
    • 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 Handler erneut 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: echte fsnotify-Anbindung (Technische Grundlage laut Ticket) — initialer ScanOnce beim Start, danach Live-Ereignisse.
  • Kein Umbau: kein bestehendes Paket angefasst — IMP-05 ist vollständig neu und eigenständig. github.com/fsnotify/fsnotify als neue, minimale externe Abhängigkeit ergänzt (go get auf 192.168.1.131, go.mod/go.sum aktualisiert).

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.