Files
bssapp/svc/routes/activitylogs.go
2026-02-11 17:46:22 +03:00

127 lines
2.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package routes
import (
"bssapp-backend/repository"
"database/sql"
"encoding/json"
"net/http"
"strconv"
"time"
)
type ActivityLogQuery struct {
Username string
RoleCode string
ActionCategory string
ActionType string
ActionTarget string
Success *bool
DateFrom *time.Time
DateTo *time.Time
Page int
Limit int
}
func AdminActivityLogsHandler(pgDB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := repository.ActivityLogQuery{}
// pagination
if v := r.URL.Query().Get("page"); v != "" {
if i, err := strconv.Atoi(v); err == nil {
q.Page = i
}
}
if v := r.URL.Query().Get("limit"); v != "" {
if i, err := strconv.Atoi(v); err == nil {
q.Limit = i
}
} else {
// limit yoksa unlimited
q.Limit = 0
}
// filters
q.Username = r.URL.Query().Get("username")
q.RoleCode = r.URL.Query().Get("role_code")
q.ActionCategory = r.URL.Query().Get("action_category")
q.ActionType = r.URL.Query().Get("action_type")
q.ActionTarget = r.URL.Query().Get("action_target")
// success
if v := r.URL.Query().Get("success"); v != "" {
if v == "true" || v == "1" {
b := true
q.Success = &b
} else if v == "false" || v == "0" {
b := false
q.Success = &b
}
}
// status range
if v := r.URL.Query().Get("status_min"); v != "" {
if i, err := strconv.Atoi(v); err == nil {
q.StatusMin = &i
}
}
if v := r.URL.Query().Get("status_max"); v != "" {
if i, err := strconv.Atoi(v); err == nil {
q.StatusMax = &i
}
}
// date range (ISO: 2026-01-03T00:00:00Z veya 2026-01-03)
parseDate := func(s string) (*time.Time, error) {
if s == "" {
return nil, nil
}
// önce RFC3339 dene
if t, err := time.Parse(time.RFC3339, s); err == nil {
return &t, nil
}
// sonra sadece tarih
if t, err := time.Parse("2006-01-02", s); err == nil {
tt := t
return &tt, nil
}
return nil, http.ErrNotSupported
}
if v := r.URL.Query().Get("date_from"); v != "" {
t, err := parseDate(v)
if err != nil {
http.Error(w, "date_from format hatalı", http.StatusBadRequest)
return
}
q.DateFrom = t
}
if v := r.URL.Query().Get("date_to"); v != "" {
t, err := parseDate(v)
if err != nil {
http.Error(w, "date_to format hatalı", http.StatusBadRequest)
return
}
q.DateTo = t
}
res, err := repository.ListActivityLogs(r.Context(), pgDB, q)
if err != nil {
http.Error(w, "Loglar alınamadı", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]interface{}{
"page": q.Page,
"limit": q.Limit,
"total": res.Total,
"items": res.Items,
})
}
}