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
58 lines
3.0 KiB
Markdown
58 lines
3.0 KiB
Markdown
# 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.
|