Files
nexarch/internal/migration/verify/report.go
T
patrickandClaude Sonnet 5.5 5b8c20777d refactor: Pruefgate-Pakete nach Funktion benannt, migration* gruppiert
- dms/ai/workflow: qa0x-Pakete nach internal/gates/<thema> verschoben, Paketname = Thema
- internal/migration{acl,audit,...} -> internal/migration/{acl,audit,...}
- Importpfade, Gate-Skripte und zwei relative Migrationspfade angepasst
- keine Logikaenderung; mail-Gates bewusst unveraendert (pfadabhaengig)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 12:44:21 +01:00

55 lines
1.5 KiB
Go

// Package migrationverify implementiert VAL-01: den Zeilenzahl-Abgleich je
// Kerntabelle (Benutzer, Dokumente, Nachrichten) zwischen Quelle und
// migriertem Ziel, je Tenant. Reines Lese-/Zaehlwerkzeug, kein
// Migrationsschritt.
package migrationverify
import "fmt"
type TableName string
const (
TableUsers TableName = "users"
TableDocuments TableName = "documents"
TableMessages TableName = "messages"
)
// Explanation deckt eine bewusst nicht migrierte Kategorie ab (z.B.
// abgelaufene Freigabelinks, abgeschlossene Workflow-Instanzen).
type Explanation struct {
TenantSlug string
Table TableName
Count int64
Reason string
}
// TableReport ist der Zeilenzahl-Abgleich einer Kerntabelle fuer genau
// einen Tenant (Akzeptanzkriterium 1).
type TableReport struct {
TenantSlug string
Table TableName
SourceCount int64
TargetCount int64
ExplainedCount int64
ExplainedReasons []string
}
func (r TableReport) Diff() int64 {
return r.SourceCount - r.TargetCount
}
// OffenerBefund ist true, wenn die Differenz nicht vollstaendig durch
// bewusst nicht migrierte Kategorien erklaert ist (Akzeptanzkriterium 2).
func (r TableReport) OffenerBefund() bool {
return r.Diff() != r.ExplainedCount
}
func (r TableReport) String() string {
status := "OK"
if r.OffenerBefund() {
status = "OFFENER BEFUND"
}
return fmt.Sprintf("%s/%s: quelle=%d ziel=%d differenz=%d erklaert=%d status=%s",
r.TenantSlug, r.Table, r.SourceCount, r.TargetCount, r.Diff(), r.ExplainedCount, status)
}