// Dieses File implementiert die Admin-Ansicht des Audit-Logs unter /admin/audit. package handler import ( "html/template" "io/fs" "net/http" ) // auditPageTemplateData bündelt die Daten für das audit.html-Template. type auditPageTemplateData struct { Events []AuditEvent } // AuditPageHandler zeigt die letzten Audit-Log-Einträge als Tabelle an. type AuditPageHandler struct { logger *AuditLogger template *template.Template } // NewAuditPageHandler lädt das Template und erstellt einen neuen AuditPageHandler. func NewAuditPageHandler(templatesFS fs.FS, logger *AuditLogger) (*AuditPageHandler, error) { tmpl, err := template.ParseFS(templatesFS, "templates/audit.html") if err != nil { return nil, err } return &AuditPageHandler{logger: logger, template: tmpl}, nil } // maxAuditEventsShown begrenzt wie viele Einträge auf der Seite angezeigt werden. const maxAuditEventsShown = 200 // HandleAuditPage verarbeitet GET /admin/audit. Nur mit dem globalen Admin-Zugang // erreichbar — Teams sehen ihr eigenes Audit-Log (noch) nicht im Web. func (h *AuditPageHandler) HandleAuditPage(w http.ResponseWriter, r *http.Request) { if !IsAdminFromContext(r.Context()) { http.Error(w, "Nur für den Admin-Zugang verfügbar", http.StatusForbidden) return } events, err := h.logger.Tail(maxAuditEventsShown) if err != nil { http.Error(w, "Audit-Log konnte nicht gelesen werden", http.StatusInternalServerError) return } h.template.Execute(w, auditPageTemplateData{Events: events}) }