49 lines
1.5 KiB
Go
49 lines
1.5 KiB
Go
// 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})
|
|
}
|