// Package tenant implements Core TEN-01: die Control-Plane-Registry und die // Provisioning-Routine fuer physisch getrennte Mandanten-Datenbanken (Modell C). package tenant import ( "errors" "regexp" "time" ) type Status string const ( StatusActive Status = "active" // Lebenszyklus-Zustaende aus TEN-04 (siehe internal/tenant/lifecycle.go). StatusSuspended Status = "suspended" StatusPendingDeletion Status = "pending_deletion" StatusDeleted Status = "deleted" ) type Tenant struct { ID string Slug string Name string DBName string DBDSN string Status Status CreatedAt time.Time // PreviousStatus und DeletionScheduledAt sind nur waehrend // StatusPendingDeletion gesetzt (TEN-04) — sie halten fest, in welchen // Zustand CancelDeletion zurueckkehrt und wann die Karenzzeit ablaeuft. PreviousStatus *string DeletionScheduledAt *time.Time } // slugPattern erzwingt sichere, als SQL-Identifier verwendbare Slugs, damit // der Datenbankname niemals aus unkontrolliertem Nutzereingabe-Text gebaut wird. var slugPattern = regexp.MustCompile(`^[a-z][a-z0-9_]{1,48}$`) var ErrInvalidSlug = errors.New("tenant: slug muss mit Kleinbuchstaben beginnen und darf nur [a-z0-9_] enthalten (2-49 Zeichen)") func ValidateSlug(slug string) error { if !slugPattern.MatchString(slug) { return ErrInvalidSlug } return nil } func dbNameForSlug(slug string) string { return "tenant_" + slug }