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

55 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.
# 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.