# 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.go` — `Client.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.