package main import ( "context" "log" "net/http" "gitea.perlbach24.de/scripte/nexarch/internal/config" "gitea.perlbach24.de/scripte/nexarch/internal/db" "gitea.perlbach24.de/scripte/nexarch/internal/tenant" "gitea.perlbach24.de/scripte/nexarch/internal/user" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("config: %v", err) } ctx := context.Background() registryPool, err := db.Connect(ctx, cfg.RegistryDSN) if err != nil { log.Fatalf("registry db: %v", err) } defer registryPool.Close() adminPool, err := db.Connect(ctx, cfg.AdminDSN) if err != nil { log.Fatalf("admin db: %v", err) } defer adminPool.Close() registry := tenant.NewRegistry(registryPool) provisioner := tenant.NewProvisioner(adminPool, registry, cfg.TenantDSNTemplate) tenantHandler := tenant.NewHandler(provisioner) onboardingService := tenant.NewOnboardingService(provisioner, cfg.TenantSchemaPath) onboardingHandler := tenant.NewOnboardingHandler(onboardingService) // Superadmin-Konten leben mandantenuebergreifend in der Registry-DB. // Tenant-User-CRUD (user.TenantUserStore) braucht Connection-Routing pro // Mandant (TEN-06, noch nicht gebaut) und wird hier bewusst noch nicht // verdrahtet — Package ist bereits eigenstaendig nutzbar/testbar. superadmins := user.NewSuperadminStore(registryPool) userHandler := user.NewHandler(nil, superadmins) mux := http.NewServeMux() mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) // Vorlaeufige Pfade ohne Versionierung/Auth — werden mit API-01/IAM-02 abgeloest. mux.HandleFunc("/internal/tenants", tenantHandler.CreateTenant) mux.HandleFunc("/internal/tenants/onboard", onboardingHandler.Onboard) mux.HandleFunc("/internal/superadmins", userHandler.CreateSuperadmin) log.Printf("nexarch-core listening on %s", cfg.ListenAddr) if err := http.ListenAndServe(cfg.ListenAddr, mux); err != nil { log.Fatalf("server: %v", err) } }