package admin import ( "encoding/json" "fmt" "net/http" "strconv" "strings" "ds2api/internal/config" ) func reverseAccounts(a []config.Account) { for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 { a[i], a[j] = a[j], a[i] } } func intFromQuery(r *http.Request, key string, d int) int { v := r.URL.Query().Get(key) if v == "" { return d } n, err := strconv.Atoi(v) if err != nil { return d } return n } func intFrom(v any) int { switch n := v.(type) { case float64: return int(n) case int: return n case int64: return int(n) default: return 0 } } func nilIfEmpty(s string) any { if s == "" { return nil } return s } func nilIfZero(v int64) any { if v == 0 { return nil } return v } func toStringSlice(v any) ([]string, bool) { arr, ok := v.([]any) if !ok { return nil, false } out := make([]string, 0, len(arr)) for _, item := range arr { out = append(out, strings.TrimSpace(fmt.Sprintf("%v", item))) } return out, true } func toAccount(m map[string]any) config.Account { return config.Account{ Email: fieldString(m, "email"), Mobile: fieldString(m, "mobile"), Password: fieldString(m, "password"), Token: fieldString(m, "token"), } } func fieldString(m map[string]any, key string) string { v, ok := m[key] if !ok || v == nil { return "" } return strings.TrimSpace(fmt.Sprintf("%v", v)) } func statusOr(v int, d int) int { if v == 0 { return d } return v } func writeJSON(w http.ResponseWriter, status int, payload any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(payload) }