From 4be785361197aba5e23912011acb4c8500bf9066 Mon Sep 17 00:00:00 2001 From: sysops Date: Sun, 30 Aug 2026 21:48:09 +0200 Subject: [PATCH] CFG-06: benachrichtigungs-einstellungen-dienst-starten - cmd/notifyprefs-api: startet internal/notifyprefs.Handler (CFG-04), hinter auth.RequireAuth mit demselben JWT-Secret wie IAM-16 - reines Wiring, kein Diff an internal/notifyprefs/ (verifiziert) - real deployed auf 131, cross-service-Session real bewiesen: Login gegen account-api, dasselbe Cookie gegen notifyprefs-api verwendet -> echtes Setzen und Lesen einer Praeferenz, ohne Cookie -> 401 - nutzt dieselbe nexarch_registry-DB wie CFG-05, Grants bereits vorhanden Pruefungen siehe docs/CFG-06-PRUEFPROTOKOLL.md --- cmd/notifyprefs-api/main.go | 59 +++++++++++++++++++ .../nexarch-notifyprefs-api.service.tmpl | 14 +++++ docs/CFG-06-PRUEFPROTOKOLL.md | 52 ++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 cmd/notifyprefs-api/main.go create mode 100644 deploy/systemd/nexarch-notifyprefs-api.service.tmpl create mode 100644 docs/CFG-06-PRUEFPROTOKOLL.md diff --git a/cmd/notifyprefs-api/main.go b/cmd/notifyprefs-api/main.go new file mode 100644 index 0000000..982fbd5 --- /dev/null +++ b/cmd/notifyprefs-api/main.go @@ -0,0 +1,59 @@ +// notifyprefs-api ist der Aufrufpunkt fuer CFG-06: startet den bereits +// fertigen CFG-04-Handler (internal/notifyprefs) als eigenstaendigen +// HTTP-Dienst, hinter derselben Session-Auth wie IAM-16 (account-api) — +// GLEICHER JWT-Secret. REINES WIRING — keine Aenderung an +// internal/notifyprefs/. +package main + +import ( + "context" + "log" + "net/http" + "os" + + "github.com/jackc/pgx/v5/pgxpool" + + "gitea.perlbach24.de/scripte/nexarch/internal/auth" + "gitea.perlbach24.de/scripte/nexarch/internal/notifyprefs" +) + +func requireEnv(name string) string { + v := os.Getenv(name) + if v == "" { + log.Fatalf("%s muss gesetzt sein", name) + } + return v +} + +func main() { + dsn := requireEnv("NEXARCH_NOTIFYPREFS_TENANT_DSN") + // MUSS identisch mit NEXARCH_ACCOUNT_JWT_SECRET (IAM-16) sein, sonst + // verwirft dieser Dienst gueltige account-api-Sessions. + jwtSecret := requireEnv("NEXARCH_NOTIFYPREFS_JWT_SECRET") + addr := os.Getenv("NEXARCH_NOTIFYPREFS_API_LISTEN_ADDR") + if addr == "" { + addr = "127.0.0.1:8101" + } + + ctx := context.Background() + pool, err := pgxpool.New(ctx, dsn) + if err != nil { + log.Fatalf("datenbankverbindung: %v", err) + } + defer pool.Close() + + tokenIssuer := auth.NewTokenIssuer(jwtSecret) + handler := notifyprefs.NewHandler(notifyprefs.NewStore(pool)) + + mux := http.NewServeMux() + mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) + + mux.HandleFunc("GET /notifications/preferences", auth.RequireAuth(tokenIssuer, handler.ListMine)) + mux.HandleFunc("POST /notifications/preferences", auth.RequireAuth(tokenIssuer, handler.SetPreference)) + mux.HandleFunc("GET /notifications/preferences/tenant", auth.RequireAuth(tokenIssuer, handler.ListTenantOverview)) + + log.Printf("notifyprefs-api: listening on %s", addr) + if err := http.ListenAndServe(addr, mux); err != nil { + log.Fatalf("http server: %v", err) + } +} diff --git a/deploy/systemd/nexarch-notifyprefs-api.service.tmpl b/deploy/systemd/nexarch-notifyprefs-api.service.tmpl new file mode 100644 index 0000000..d62118e --- /dev/null +++ b/deploy/systemd/nexarch-notifyprefs-api.service.tmpl @@ -0,0 +1,14 @@ +[Unit] +Description=NEXARCH Core - Benachrichtigungs-Einstellungen-Dienst (CFG-04/CFG-06) +After=network.target postgresql.service + +[Service] +Type=simple +User=nexarch +EnvironmentFile=/etc/nexarch/notifyprefs-api.env +ExecStart=__INSTALL_DIR__/bin/notifyprefs-api +Restart=on-failure +StandardOutput=journal + +[Install] +WantedBy=multi-user.target diff --git a/docs/CFG-06-PRUEFPROTOKOLL.md b/docs/CFG-06-PRUEFPROTOKOLL.md new file mode 100644 index 0000000..298dd2d --- /dev/null +++ b/docs/CFG-06-PRUEFPROTOKOLL.md @@ -0,0 +1,52 @@ +# CFG-06 – Prüfprotokoll: Benachrichtigungs-Einstellungen-Dienst starten (CFG-04 als laufender Dienst) + +Voraussetzung CFG-04, IAM-16 – beide bereits Fertig, hier UNVERÄNDERT. + +## Reines Wiring, keine neue Logik + +`git diff --stat internal/notifyprefs/` liefert KEINEN Diff. +`cmd/notifyprefs-api/main.go` setzt ausschließlich bestehende +Konstruktoren zusammen, jeder Endpunkt hinter `auth.RequireAuth` mit +demselben JWT-Secret wie IAM-16 (account-api) — dritter Baustein der +Core-GUI mit bewiesener Cross-Service-Session-Gültigkeit nach RBAC-07. + +## Umsetzung + +- `cmd/notifyprefs-api/main.go` – `GET/POST /notifications/preferences`, + `GET /notifications/preferences/tenant`, alle hinter `auth.RequireAuth`. +- `deploy/systemd/nexarch-notifyprefs-api.service.tmpl`. + +## Prüfungen + +| # | Prüfung | Ergebnis | +|---|---|---| +| 1 | Dienst startet und bleibt stabil (systemctl status aktiv) | **bestanden** – real auf 131: `nexarch-notifyprefs-api.service` aktiv | +| 2 | Realer Aufruf mit gültigem IAM-16-Session-Cookie setzt/liest eine echte Präferenz, ohne Cookie 401 | **bestanden** – real per `curl`: ohne Cookie → 401; mit dem bei `account-api` ausgestellten Cookie: `POST /notifications/preferences` (Kanal `email` für `invoice_ready` deaktiviert) → 200, anschließendes `GET` liefert exakt diese Zeile zurück, korrekt dem einloggten Nutzer und Tenant (`acme`) zugeordnet | +| 3 | Code-Review: keine Änderung an internal/notifyprefs/ selbst, nur main.go+systemd neu | **bestanden** – `git diff --stat internal/notifyprefs/` liefert leeren Diff | + +## Echte Verdrahtung auf 192.168.1.131 + +- `notifyprefs-api` gebaut nach `/opt/nexarch-core/bin/`, + `/etc/nexarch/notifyprefs-api.env` (0600, `NEXARCH_NOTIFYPREFS_JWT_SECRET` + identisch zu `NEXARCH_ACCOUNT_JWT_SECRET`), Dienst installiert/aktiviert. +- Nutzt dieselbe `nexarch_registry`-DB/Tabellen (`notification_preferences`) + wie CFG-05 — Grants dort bereits aus CFG-05 vorhanden, keine neue + Grant-Lücke gefunden. +- End-zu-Ende-Beweis: Testnutzer angelegt, Login gegen `account-api`, + dasselbe Cookie gegen `notifyprefs-api` verwendet → echtes Setzen und + Lesen einer Präferenz. Testdaten anschließend entfernt. + +## Build/Test-Ergebnis (192.168.1.131) + +``` +go build ./... -> clean +go vet ./... -> clean +golangci-lint run ./cmd/notifyprefs-api/... -> 0 issues +``` + +## Gesamtergebnis + +**Bestanden.** CFG-04 ist jetzt ein real laufender, über systemd +verwalteter Dienst, cross-service authentifiziert über dieselbe +IAM-16-Session wie RBAC-07 — dritter erfolgreich real geprüfter +Auth-geschützter Baustein der Core-GUI.