62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package common
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"one-api/types"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/go-playground/validator/v10"
|
|
)
|
|
|
|
func UnmarshalBodyReusable(c *gin.Context, v any) error {
|
|
requestBody, err := io.ReadAll(c.Request.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = c.Request.Body.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
|
|
err = c.ShouldBind(v)
|
|
if err != nil {
|
|
if errs, ok := err.(validator.ValidationErrors); ok {
|
|
// 返回第一个错误字段的名称
|
|
return fmt.Errorf("field %s is required", errs[0].Field())
|
|
}
|
|
return err
|
|
}
|
|
|
|
c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
|
|
return nil
|
|
}
|
|
|
|
func ErrorWrapper(err error, code string, statusCode int) *types.OpenAIErrorWithStatusCode {
|
|
return StringErrorWrapper(err.Error(), code, statusCode)
|
|
}
|
|
|
|
func StringErrorWrapper(err string, code string, statusCode int) *types.OpenAIErrorWithStatusCode {
|
|
openAIError := types.OpenAIError{
|
|
Message: err,
|
|
Type: "one_api_error",
|
|
Code: code,
|
|
}
|
|
return &types.OpenAIErrorWithStatusCode{
|
|
OpenAIError: openAIError,
|
|
StatusCode: statusCode,
|
|
}
|
|
}
|
|
|
|
func AbortWithMessage(c *gin.Context, statusCode int, message string) {
|
|
c.JSON(statusCode, gin.H{
|
|
"error": gin.H{
|
|
"message": message,
|
|
"type": "one_api_error",
|
|
},
|
|
})
|
|
c.Abort()
|
|
LogError(c.Request.Context(), message)
|
|
}
|