package config import ( "fmt" "os" ) // Config holds startup configuration for the core module. // RegistryDSN points at the control-plane registry DB (tenant list, // connection info, superadmin accounts) — see nexarch-state.json // multi_tenancy: Modell C (physisch getrennte DB pro Mandant). type Config struct { ListenAddr string // RegistryDSN verbindet zur Control-Plane-Registry-Datenbank. RegistryDSN string // AdminDSN verbindet zur Wartungsdatenbank (z.B. "postgres") und wird nur // fuer CREATE/DROP DATABASE beim Tenant-Provisioning verwendet. AdminDSN string // TenantDSNTemplate enthaelt genau ein "%s" als Platzhalter fuer den // Datenbanknamen einer neu provisionierten Tenant-Datenbank. TenantDSNTemplate string // TenantSchemaPath zeigt auf migrations/tenant/0001_users.up.sql, mit der // TEN-02 eine frisch provisionierte Tenant-Datenbank initialisiert. TenantSchemaPath string } func Load() (Config, error) { dsn := os.Getenv("NEXARCH_REGISTRY_DSN") if dsn == "" { return Config{}, fmt.Errorf("NEXARCH_REGISTRY_DSN not set") } adminDSN := os.Getenv("NEXARCH_ADMIN_DSN") if adminDSN == "" { return Config{}, fmt.Errorf("NEXARCH_ADMIN_DSN not set") } dsnTemplate := os.Getenv("NEXARCH_TENANT_DSN_TEMPLATE") if dsnTemplate == "" { return Config{}, fmt.Errorf("NEXARCH_TENANT_DSN_TEMPLATE not set") } schemaPath := os.Getenv("NEXARCH_TENANT_SCHEMA_PATH") if schemaPath == "" { return Config{}, fmt.Errorf("NEXARCH_TENANT_SCHEMA_PATH not set") } addr := os.Getenv("NEXARCH_LISTEN_ADDR") if addr == "" { addr = ":8080" } return Config{ ListenAddr: addr, RegistryDSN: dsn, AdminDSN: adminDSN, TenantDSNTemplate: dsnTemplate, TenantSchemaPath: schemaPath, }, nil }