12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package request
-
- import (
- "fmt"
- "net/http"
-
- "github.com/gin-gonic/gin"
- "github.com/sirupsen/logrus"
- )
-
- type Checker interface {
- Check() error
- }
-
- func ParseParamFail(ctx *gin.Context, r interface{}, fs ...func() error) bool {
- if r != nil {
- err := ctx.ShouldBind(r)
- if err != nil {
- err = HTTPError{Status: http.StatusBadRequest, Msg: err.Error()}
-
- return Fail(ctx, err)
- }
-
- if checker, ok := r.(Checker); ok {
- err := checker.Check()
- if err != nil {
- err = HTTPError{Status: http.StatusBadRequest, Msg: err.Error()}
-
- return Fail(ctx, err)
- }
- }
- }
-
- for _, f := range fs {
- err := f()
- if err != nil {
- err = HTTPError{Status: http.StatusBadRequest, Msg: err.Error()}
-
- return Fail(ctx, err)
- }
- }
-
- return false
- }
-
- func Fail(ctx *gin.Context, err error) bool {
- if err == nil {
- return false
- }
-
- status := http.StatusInternalServerError
- if v, ok := err.(HTTPError); ok {
- status = v.Status
- }
-
- if status == http.StatusInternalServerError {
- logrus.Error(err)
- }
-
- ctx.JSON(status, gin.H{"msg": err.Error()})
-
- return true
- }
-
- func Success(ctx *gin.Context, data interface{}) {
- if data == nil {
- ctx.Status(http.StatusNoContent)
- return
- }
-
- switch ctx.Request.Method {
- case http.MethodGet, http.MethodHead, http.MethodOptions, http.MethodDelete:
- ctx.JSON(http.StatusOK, data)
- case http.MethodPost, http.MethodPut, http.MethodPatch:
- ctx.JSON(http.StatusCreated, data)
- default:
- if requestID, found := ctx.Get("request_id"); found {
- ctx.JSON(http.StatusBadRequest, HTTPError{
- Msg: fmt.Sprintf("request_id: %s | unsupported request method %s",
- requestID.(string),
- ctx.Request.Method)})
- return
- }
-
- ctx.JSON(http.StatusBadRequest, HTTPError{Msg: fmt.Sprintf("unsupported request method %s", ctx.Request.Method)})
- }
- }
|