/
DexScen
/
ProjectPOH
Обзор
Документация
Войти
/
DexScen
/
ProjectPOH
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/internal/httpapi/json.go
91 строка
2 KB
Александр
initial prototype ready
29 апр 2026, 06:02
29 апр 2026, 06:02
7af145a
Код
Авторство
О чём код?
package httpapi import ( "encoding/json" "errors" "fmt" "io" "net/http" "strconv" "strings" ) type ErrorResponse struct { Error string `json:"error"` } func WriteJSON(w http.ResponseWriter, status int, payload any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) if payload == nil { return } _ = json.NewEncoder(w).Encode(payload) } func WriteError(w http.ResponseWriter, status int, err error) { if err == nil { WriteJSON(w, status, ErrorResponse{Error: http.StatusText(status)}) return } WriteJSON(w, status, ErrorResponse{Error: err.Error()}) } func ReadJSON(r *http.Request, dst any) error { defer r.Body.Close() dec := json.NewDecoder(io.LimitReader(r.Body, 1<<20)) dec.DisallowUnknownFields() if err := dec.Decode(dst); err != nil { if errors.Is(err, io.EOF) { return errors.New("request body is required") } return fmt.Errorf("invalid JSON: %w", err) } if dec.More() { return errors.New("request body must contain a single JSON object") } return nil } func ParsePositiveInt64(raw, field string) (int64, error) { raw = strings.TrimSpace(raw) if raw == "" { return 0, fmt.Errorf("%s is required", field) } v, err := strconv.ParseInt(raw, 10, 64) if err != nil || v <= 0 { return 0, fmt.Errorf("%s must be a positive integer", field) } return v, nil } func ParsePagination(r *http.Request, defaultLimit, maxLimit int) (limit int, offset int, err error) { limit = defaultLimit offset = 0 if raw := strings.TrimSpace(r.URL.Query().Get("limit")); raw != "" { v, parseErr := strconv.Atoi(raw) if parseErr != nil || v <= 0 { return 0, 0, errors.New("limit must be a positive integer") } if v > maxLimit { v = maxLimit } limit = v } if raw := strings.TrimSpace(r.URL.Query().Get("offset")); raw != "" { v, parseErr := strconv.Atoi(raw) if parseErr != nil || v < 0 { return 0, 0, errors.New("offset must be a non-negative integer") } offset = v } return limit, offset, nil }