Files
nexarch/mail/docs/SRC-05-PRUEFPROTOKOLL.md
sysopsandClaude Sonnet 5 db73aab0de SRC-05: facetten-filter-api
Facetten- und Filter-API für Suche (Absender, Zeitraum, Postfach,
Anhangstyp, Tag), mandantengetrennt, mit UND-Verknüpfung mehrerer Filter.

- migrations/0002..0005: vier nummerierte ALTER-Migrationen für die neuen
  Facettenfelder (Manticore erlaubt nur eine Spalte je ALTER-Anweisung),
  EnsureSchema wendet sie idempotent nach.
- fields.go: FacetFields-Whitelist, einzige zulässige Facettendimensionen.
- facets.go: Client.Facets nutzt Manticores strukturierte aggs.terms/
  aggs.range-API, kein dynamischer SQL-Klauselbau. Filter kombinieren als
  zusätzliche equals-Klauseln in derselben bool.must-Liste wie der
  Tenant-Filter. Zeitraum-Facette über feste Buckets via aggs.range.

Prüfungen (alle real durchgeführt, siehe mail/docs/SRC-05-PRUEFPROTOKOLL.md):
1. TestFacets_CountsMatchActualHits: Facettenzahlen stimmen real mit der
   tatsächlichen Treffermenge überein.
2. TestFacets_ThreeFiltersCombineWithAND: 3 kombinierte Filter schränken
   4 Dokumente real auf genau 1 verbleibenden Treffer ein.
3. TestFacets_TenantSeparation: Facetten eines Mandanten enthalten real
   keine Werte eines anderen.

Kein Umbau: Search/Delete/Index-Verhalten aus SRC-01/SRC-03 unverändert,
dedup/indexworker/storage/crypto/encstorage unverändert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
2026-08-31 10:49:52 +02:00

3.0 KiB
Raw Permalink Blame History

SRC-05 Prüfprotokoll: Facetten- & Filter-API

Voraussetzung SRC-03 (Fertig).

Umsetzung

  • mail/internal/search/migrations/0002..0005_*.sql: vier eigene, nummerierte ALTER TABLE ADD COLUMN-Migrationen für die neuen Facettenfelder (sender, mailbox, attachment_type, tag) — Manticore erlaubt nur eine Spalte je ALTER-Anweisung. EnsureSchema wendet sie idempotent nach (Fehlertext "already in schema" gilt als bereits angewendet, kein Fehlerzustand).
  • fields.go: neue statische Feldkonstanten + FacetFields-Whitelist (sender, mailbox, attachment_type, tag) — einzige Quelle zulässiger Facettendimensionen, kein beliebiger Client-Feldname möglich.
  • facets.goClient.Facets(ctx, tenantSlug, queryText, filters): nutzt Manticores strukturierte aggs.terms/aggs.range-API (kein dynamischer SQL-Klauselbau). Tenant-Filter + optionale FacetFilter-Liste laufen als zusätzliche equals-Klauseln in derselben bool.must-Liste (Akzeptanzkriterium 2: UND-Verknüpfung). Zeitraum-Facette über feste Buckets (letzte 7 Tage/30 Tage/Jahr/älter) via aggs.range auf sent_at.
  • Document um optionale Facettenfelder erweitert (Sender, Mailbox, AttachmentType, Tag).
  • Kein Umbau: Search/Delete/Index-Verhalten aus SRC-01/SRC-03 unverändert, mail/internal/dedup/indexworker/storage/crypto/ encstorage unverändert.

Prüfungen

# Prüfung Ergebnis
1 Test: Facettenzahlen stimmen mit tatsächlicher Treffermenge überein bestanden TestFacets_CountsMatchActualHits: 3 reale Dokumente indexiert, Facette sender liefert real alice@example.com→2, bob@example.com→1, Facette attachment_type liefert real pdf→2
2 Test: Kombination von drei Filtern liefert korrekt eingeschränkte Treffer bestanden TestFacets_ThreeFiltersCombineWithAND: 4 Dokumente, von denen 3 je genau einen der drei Filter (Sender/Postfach/Anhangstyp) verletzen — nach Kombination aller drei Filter bleibt real genau 1 Treffer übrig
3 Test: Facetten eines Mandanten enthalten keine Werte eines anderen bestanden TestFacets_TenantSeparation: identische Feldstruktur bei zwei Mandanten, Facette bei Mandant B enthält real keinen Wert von Mandant A

Build/Test-Ergebnis (192.168.1.131)

go build ./...  -> clean
go vet ./...    -> clean
golangci-lint run ./...  -> 0 issues
TEST_TENANT_DSN=postgresql://nexarch_test:***@localhost:5432/tenant_acme?sslmode=disable \
TEST_MANTICORE_URL=http://127.0.0.1:9308 \
  go test ./... -p 1  -> alle Pakete bestanden, inkl. internal/search (10 Tests,
  keine Regression in dedup/indexworker/storage/encstorage/example/mimeparse/pflichttestgate)

Gesamtergebnis

Bestanden. Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen real erfüllt. Entsperrt SRC-06, trägt (gemeinsam mit ARC-08, SRC-02, SRC-04, SRC-08, SRC-09, SRC-10) zu QA-03 bei — QA-03 bleibt weiterhin blockiert, bis auch die übrigen vier Tickets fertig sind.