This commit is contained in:
2026-02-11 17:46:22 +03:00
commit eacfacb13b
266 changed files with 51337 additions and 0 deletions

126
svc/routes/activitylogs.go Normal file
View File

@@ -0,0 +1,126 @@
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,
})
}
}