You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.7 KiB
106 lines
2.7 KiB
package controllers
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/go-playground/validator/v10"
|
|
)
|
|
|
|
// ParamErrorMsg 根据Validator返回的错误信息给出错误提示
|
|
func ParamErrorMsg(filed string, tag string) string {
|
|
// 未通过验证的表单域与中文对应
|
|
fieldMap := map[string]string{
|
|
"UserName": "Email",
|
|
"Password": "Password",
|
|
"Path": "Path",
|
|
"SourceID": "Source resource",
|
|
"URL": "URL",
|
|
"Nick": "Nickname",
|
|
}
|
|
// 未通过的规则与中文对应
|
|
tagMap := map[string]string{
|
|
"required": "cannot be empty",
|
|
"min": "too short",
|
|
"max": "too long",
|
|
"email": "format error",
|
|
}
|
|
fieldVal, findField := fieldMap[filed]
|
|
if !findField {
|
|
fieldVal = filed
|
|
}
|
|
tagVal, findTag := tagMap[tag]
|
|
if findTag {
|
|
// 返回拼接出来的错误信息
|
|
return fieldVal + " " + tagVal
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// ErrorResponse 返回错误消息
|
|
func ErrorResponse(err error) serializer.Response {
|
|
// 处理 Validator 产生的错误
|
|
if ve, ok := err.(validator.ValidationErrors); ok {
|
|
for _, e := range ve {
|
|
return serializer.ParamErrDeprecated(
|
|
ParamErrorMsg(e.Field(), e.Tag()),
|
|
err,
|
|
)
|
|
}
|
|
}
|
|
|
|
if _, ok := err.(*json.UnmarshalTypeError); ok {
|
|
return serializer.ParamErrDeprecated("JSON marshall error", err)
|
|
}
|
|
|
|
return serializer.ParamErrDeprecated("Parameter error", err)
|
|
}
|
|
|
|
// FromJSON Parse and validate JSON from request body
|
|
func FromJSON[T any](ctxKey any) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
var service T
|
|
if err := c.ShouldBindJSON(&service); err == nil {
|
|
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), ctxKey, &service))
|
|
c.Next()
|
|
} else {
|
|
c.JSON(200, ErrorResponse(err))
|
|
c.Abort()
|
|
}
|
|
}
|
|
}
|
|
|
|
// FromQuery Parse and validate form from request query
|
|
func FromQuery[T any](ctxKey any) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
var service T
|
|
if err := c.ShouldBindQuery(&service); err == nil {
|
|
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), ctxKey, &service))
|
|
c.Next()
|
|
} else {
|
|
c.JSON(200, ErrorResponse(err))
|
|
c.Abort()
|
|
}
|
|
}
|
|
}
|
|
|
|
// FromUri Parse and validate form from request uri
|
|
func FromUri[T any](ctxKey any) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
var service T
|
|
if err := c.ShouldBindUri(&service); err == nil {
|
|
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), ctxKey, &service))
|
|
c.Next()
|
|
} else {
|
|
c.JSON(200, ErrorResponse(err))
|
|
c.Abort()
|
|
}
|
|
}
|
|
}
|
|
|
|
// ParametersFromContext retrieves request parameters from context
|
|
func ParametersFromContext[T any](c *gin.Context, ctxKey any) T {
|
|
return c.Request.Context().Value(ctxKey).(T)
|
|
}
|