// retention-api ist der Aufrufpunkt fuer RET-06-API: Backend-HTTP-Dienst // fuer die Aufbewahrungsfristen-Konfiguration (CRUD + Vorschauliste). // Getrennt vom scrub-metrics-/restoretest-metrics-Muster, weil dies KEIN // Prometheus-/OPS-03-Endpunkt ist, sondern ein echter Admin-API-Dienst // (Next.js-Frontend als eigenes Folgeticket). package main import ( "context" "log" "net/http" "os" "github.com/jackc/pgx/v5/pgxpool" "gitea.perlbach24.de/scripte/nexarch/archive/internal/rbacclient" "gitea.perlbach24.de/scripte/nexarch/archive/internal/retentionapi" ) func main() { dsn := os.Getenv("NEXARCH_RETENTION_TENANT_DSN") if dsn == "" { log.Fatal("NEXARCH_RETENTION_TENANT_DSN muss gesetzt sein") } addr := os.Getenv("NEXARCH_RETENTION_API_LISTEN_ADDR") if addr == "" { addr = "127.0.0.1:8092" } rbacBaseURL := os.Getenv("NEXARCH_RETENTION_RBAC_BASE_URL") if rbacBaseURL == "" { log.Fatal("NEXARCH_RETENTION_RBAC_BASE_URL muss gesetzt sein (RBAC-06, z. B. http://127.0.0.1:8093)") } rbacServiceToken := os.Getenv("NEXARCH_RETENTION_RBAC_SERVICE_TOKEN") if rbacServiceToken == "" { log.Fatal("NEXARCH_RETENTION_RBAC_SERVICE_TOKEN muss gesetzt sein") } // RET-10: erlaubter Frontend-Origin fuer CORS, KEIN Wildcard. corsOrigin := os.Getenv("NEXARCH_RETENTION_CORS_ALLOWED_ORIGIN") if corsOrigin == "" { log.Fatal("NEXARCH_RETENTION_CORS_ALLOWED_ORIGIN muss gesetzt sein (Origin des RET-06-Frontends)") } ctx := context.Background() pool, err := pgxpool.New(ctx, dsn) if err != nil { log.Fatalf("datenbankverbindung: %v", err) } defer pool.Close() rbac := rbacclient.New(rbacBaseURL, rbacServiceToken) mux := http.NewServeMux() retentionapi.Mount(mux, pool, rbac) mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) handler := retentionapi.CORS(corsOrigin, mux) log.Printf("retention-api: listening on %s (cors origin: %s)", addr, corsOrigin) if err := http.ListenAndServe(addr, handler); err != nil { log.Fatalf("http server: %v", err) } }