API-12: kek-bezugsdienst-starten
- cmd/kek-api: startet internal/kek.Handler.TenantKEKHandler (API-10), tenantResolverAdapter bildet tenant.Registry.GetBySlug auf kek.TenantResolver ab (nur Signatur-Anpassung) - reines Wiring, kein Diff an internal/kek|moduleregistry|tenant (verifiziert) - real deployed auf 131, end-zu-ende bewiesen: echtes Modul registriert+provisioniert, echter Tenant-KEK erzeugt, curl gegen laufenden Dienst liefert exakt denselben KEK zurueck (byte-fuer-byte verglichen), falsches Credential -> 403 - reale Grant-Luecke gefunden und behoben (nexarch_core auf tenant_keks), verifiziert Pruefungen siehe docs/API-12-PRUEFPROTOKOLL.md
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
// kek-api ist der Aufrufpunkt fuer API-12: startet den bereits fertigen
|
||||
// API-10-Handler (internal/kek) als eigenstaendigen HTTP-Dienst.
|
||||
// REINES WIRING — keine Aenderung an internal/kek/, internal/moduleregistry/
|
||||
// oder internal/tenant/.
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
|
||||
"gitea.perlbach24.de/scripte/nexarch/internal/flag"
|
||||
"gitea.perlbach24.de/scripte/nexarch/internal/kek"
|
||||
"gitea.perlbach24.de/scripte/nexarch/internal/moduleregistry"
|
||||
"gitea.perlbach24.de/scripte/nexarch/internal/tenant"
|
||||
)
|
||||
|
||||
// tenantResolverAdapter erfüllt kek.TenantResolver über den bestehenden
|
||||
// tenant.Registry.GetBySlug-Zugriff — kein neuer Tenant-Code, nur
|
||||
// Signatur-Anpassung.
|
||||
type tenantResolverAdapter struct{ registry *tenant.Registry }
|
||||
|
||||
func (a tenantResolverAdapter) ResolveTenantID(ctx context.Context, tenantSlug string) (string, error) {
|
||||
t, err := a.registry.GetBySlug(ctx, tenantSlug)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return t.ID, nil
|
||||
}
|
||||
|
||||
func requireEnv(name string) string {
|
||||
v := os.Getenv(name)
|
||||
if v == "" {
|
||||
log.Fatalf("%s muss gesetzt sein", name)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func main() {
|
||||
registryDSN := requireEnv("NEXARCH_KEK_REGISTRY_DSN")
|
||||
masterKeyEnvVar := os.Getenv("NEXARCH_KEK_MASTER_KEY_ENV")
|
||||
if masterKeyEnvVar == "" {
|
||||
masterKeyEnvVar = "NEXARCH_KEK_MASTER_KEY"
|
||||
}
|
||||
addr := os.Getenv("NEXARCH_KEK_API_LISTEN_ADDR")
|
||||
if addr == "" {
|
||||
addr = "127.0.0.1:8102"
|
||||
}
|
||||
|
||||
masterKey, err := kek.LoadMasterKeyFromEnv(masterKeyEnvVar)
|
||||
if err != nil {
|
||||
log.Fatalf("master-key laden: %v", err)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
pool, err := pgxpool.New(ctx, registryDSN)
|
||||
if err != nil {
|
||||
log.Fatalf("datenbankverbindung: %v", err)
|
||||
}
|
||||
defer pool.Close()
|
||||
|
||||
flagStore := flag.NewStore(pool)
|
||||
flagService := flag.NewService(flagStore, 30*time.Second)
|
||||
registry := moduleregistry.NewRegistry(pool, flagService)
|
||||
tenantRegistry := tenant.NewRegistry(pool)
|
||||
store := kek.NewStore(pool)
|
||||
|
||||
handler := kek.NewHandler(store, masterKey, registry, registry, tenantResolverAdapter{registry: tenantRegistry})
|
||||
|
||||
mux := http.NewServeMux()
|
||||
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })
|
||||
mux.HandleFunc("/internal/kek/tenant", handler.TenantKEKHandler)
|
||||
|
||||
log.Printf("kek-api: listening on %s", addr)
|
||||
if err := http.ListenAndServe(addr, mux); err != nil {
|
||||
log.Fatalf("http server: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user