// 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) }