Files
nexarch/mail/docs/IMP-05-PRUEFPROTOKOLL.md
T
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

58 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 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.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 `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.