/
t3
/
iam-server
Обзор
Документация
Войти
/
t3
/
iam-server
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
internal/api/audit_handler.go
85 строк
2 KB
Ivan Shibkikh
fix P1
20 июл 2026, 18:23
20 июл 2026, 18:23
01d4f4b
Код
Авторство
О чём код?
package api import ( "encoding/json" "net/http" "strconv" "time" "gitverse.ru/t3/iam-server/internal/storage" ) type AuditHandler struct { auditRepo *storage.AuditRepo } func NewAuditHandler(repo *storage.AuditRepo) *AuditHandler { return &AuditHandler{auditRepo: repo} } // List returns audit entries with optional filters via query parameters. // Filters: ?limit=100&offset=0&action=user.create&resource_type=user&resource_id=...&request_id=...&from=...&to=... func (h *AuditHandler) List(w http.ResponseWriter, r *http.Request) { if !requireScope(w, r, "audit.read") { return } q := r.URL.Query() filter := storage.ListFilter{ Action: q.Get("action"), ResourceType: q.Get("resource_type"), ResourceID: q.Get("resource_id"), RequestID: q.Get("request_id"), } if v := q.Get("limit"); v != "" { if n, err := strconv.Atoi(v); err == nil { filter.Limit = n } } if v := q.Get("offset"); v != "" { if n, err := strconv.Atoi(v); err == nil { filter.Offset = n } } if v := q.Get("from"); v != "" { if t, err := time.Parse(time.RFC3339, v); err == nil { filter.From = &t } } if v := q.Get("to"); v != "" { if t, err := time.Parse(time.RFC3339, v); err == nil { filter.To = &t } } entries, err := h.auditRepo.List(r.Context(), filter) if err != nil { writeInternalError(w) return } var resp []AuditEntryResponse for _, e := range entries { resp = append(resp, AuditEntryResponse{ ID: e.ID, Timestamp: e.Timestamp, RequestID: e.RequestID, ActorType: e.ActorType, ActorID: e.ActorID, ActorIP: e.ActorIP, Action: e.Action, ResourceType: e.ResourceType, ResourceID: e.ResourceID, Outcome: e.Outcome, Detail: e.Detail, }) } if resp == nil { resp = []AuditEntryResponse{} } json.NewEncoder(w).Encode(ListAuditResponse{Entries: resp}) }