axe/internal/handlers/binding.go

47 lines
1.3 KiB
Go
Raw Permalink Normal View History

2026-10-18 19:07:25 +00:00
package handlers
import (
"errors"
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// bindingError отвечает на ошибку разбора тела запроса.
// Сырые тексты gin/validator (имена структур и тегов) наружу не уходят:
// клиенту уходит «поле: причина», написанная понятным языком.
func bindingError(c *gin.Context, err error) {
var ve validator.ValidationErrors
if errors.As(err, &ve) {
msgs := make([]string, 0, len(ve))
for _, fe := range ve {
msgs = append(msgs, fe.Field()+" "+fieldMessage(fe))
}
c.JSON(http.StatusBadRequest, gin.H{"error": strings.Join(msgs, "; ")})
return
}
// Невалидный JSON, не тот тип поля и прочее.
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request body"})
}
func fieldMessage(fe validator.FieldError) string {
switch fe.Tag() {
case "required":
return "is required"
case "email":
return "must be a valid email"
case "min":
return "must be at least " + fe.Param() + " characters"
case "max":
return "must be at most " + fe.Param() + " characters"
case "oneof":
return "must be one of: " + fe.Param()
case "uuid":
return "must be a valid UUID"
default:
return "is invalid"
}
}