Deklarix soll ein buchbarer Service werden — dafür muss jede Entität im
Datenmodell über das Frontend steuerbar sein, nicht nur einsehbar.
Schließt drei konkrete Lücken:
- Abteilungen (GET /verwaltung/abteilungen, anlegen/löschen) — ohne
diese Seite blieb die Abteilung-Auswahl im Antrag-Fragebogen leer
und unbenutzbar, das war ein Funktionsdefizit, kein Komfortfehler.
- Eigene Werkzeug-Sperrungen (GET /verwaltung/werkzeuge) — ein Mandant
kann einen zentralen Katalogeintrag jetzt für sich sperren/entsperren,
ohne den zentralen Katalog selbst zu verändern.
- Nutzer-Deaktivierung (POST /verwaltung/nutzer/{id}/deaktivieren bzw.
.../aktivieren, neue Spalte app_user.active, Migration 0012). Nutzer
werden nicht gelöscht (Fremdschlüssel auf antrag/entscheidung/
audit_log würden das verhindern und die Historie zerstören) —
deaktivierte Logins können sich nicht mehr anmelden und verlieren
eine laufende Sitzung sofort. Ein Admin kann sich nicht selbst
deaktivieren.
Zusätzlich: store.ListAktiveGenehmigungenForAccount als Grundlage für
die Wiedervorlage (Schritt 7, Web-Layer folgt).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
76 lines
2.8 KiB
Go
76 lines
2.8 KiB
Go
// Ebene 4 — "eigene Werkzeug-Freigaben/-Sperrungen" (siehe CLAUDE.md,
|
|
// Fünf Ebenen): ein Mandant kann einen zentralen Katalogeintrag für
|
|
// sich sperren, ohne den zentralen Katalog selbst zu verändern (das
|
|
// bleibt Sache der Plattform, siehe betreiber_werkzeug_handlers.go).
|
|
package web
|
|
|
|
import "net/http"
|
|
|
|
type mandantWerkzeugItem struct {
|
|
ID string
|
|
Name string
|
|
Anbieter string
|
|
Gesperrt bool
|
|
}
|
|
|
|
type mandantWerkzeugListeData struct {
|
|
Title string
|
|
Nav navData
|
|
Werkzeuge []mandantWerkzeugItem
|
|
}
|
|
|
|
// handleMandantWerkzeugListe zeigt den zentralen Katalog aus Sicht des
|
|
// eigenen Mandanten mit Sperren/Entsperren-Aktion je Eintrag.
|
|
func (s *Server) handleMandantWerkzeugListe(w http.ResponseWriter, r *http.Request) {
|
|
accountID := currentUser(r).AccountID
|
|
zentral, err := s.store.ListZentraleWerkzeuge(r.Context())
|
|
if err != nil {
|
|
http.Error(w, "Werkzeugkatalog konnte nicht geladen werden: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
sperren, err := s.store.ListWerkzeugSperrenForAccount(r.Context(), accountID)
|
|
if err != nil {
|
|
http.Error(w, "Sperrungen konnten nicht geladen werden: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
gesperrt := make(map[string]bool, len(sperren))
|
|
for _, sp := range sperren {
|
|
gesperrt[sp.WerkzeugID] = true
|
|
}
|
|
|
|
data := mandantWerkzeugListeData{Title: "Werkzeugkatalog", Nav: navFor(r)}
|
|
for _, wz := range zentral {
|
|
data.Werkzeuge = append(data.Werkzeuge, mandantWerkzeugItem{
|
|
ID: wz.ID, Name: wz.Name, Anbieter: wz.Anbieter, Gesperrt: gesperrt[wz.ID],
|
|
})
|
|
}
|
|
if err := s.templates.ExecuteTemplate(w, "mandant-werkzeuge", data); err != nil {
|
|
http.Error(w, "Seite konnte nicht gerendert werden", http.StatusInternalServerError)
|
|
}
|
|
}
|
|
|
|
// handleMandantWerkzeugSperren sperrt einen zentralen Katalogeintrag
|
|
// für den eigenen Mandanten — der zentrale Eintrag selbst bleibt
|
|
// unverändert, er verschwindet nur aus ListWerkzeugeForAccount für
|
|
// diesen einen Mandanten.
|
|
func (s *Server) handleMandantWerkzeugSperren(w http.ResponseWriter, r *http.Request) {
|
|
if err := r.ParseForm(); err != nil {
|
|
http.Error(w, "ungültiges Formular", http.StatusBadRequest)
|
|
return
|
|
}
|
|
grund := r.FormValue("grund")
|
|
if _, err := s.store.CreateWerkzeugSperre(r.Context(), currentUser(r).AccountID, r.PathValue("id"), grund); err != nil {
|
|
http.Error(w, "Werkzeug konnte nicht gesperrt werden: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
http.Redirect(w, r, "/verwaltung/werkzeuge", http.StatusSeeOther)
|
|
}
|
|
|
|
func (s *Server) handleMandantWerkzeugEntsperren(w http.ResponseWriter, r *http.Request) {
|
|
if err := s.store.DeleteWerkzeugSperre(r.Context(), currentUser(r).AccountID, r.PathValue("id")); err != nil {
|
|
http.Error(w, "Sperrung konnte nicht aufgehoben werden: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
http.Redirect(w, r, "/verwaltung/werkzeuge", http.StatusSeeOther)
|
|
}
|