Files
crawlab/backend/services/context/context.go
2019-09-04 20:41:37 +08:00

101 lines
2.1 KiB
Go

package context
import (
"crawlab/constants"
"crawlab/errors"
"crawlab/model"
"fmt"
"github.com/apex/log"
"github.com/gin-gonic/gin"
errors2 "github.com/pkg/errors"
"gopkg.in/go-playground/validator.v9"
"net/http"
"runtime/debug"
)
type Context struct {
*gin.Context
}
func (c *Context) User() *model.User {
userIfe, exists := c.Get(constants.ContextUser)
if !exists {
return nil
}
user, ok := userIfe.(*model.User)
if !ok {
return nil
}
return user
}
func (c *Context) Success(data interface{}, metas ...interface{}) {
var meta interface{}
if len(metas) == 0 {
meta = gin.H{}
} else {
meta = metas[0]
}
if data == nil {
data = gin.H{}
}
c.JSON(http.StatusOK, gin.H{
"status": "ok",
"message": "success",
"data": data,
"meta": meta,
"error": "",
})
}
func (c *Context) Failed(err error, variables ...interface{}) {
c.failed(err, http.StatusOK, variables...)
}
func (c *Context) failed(err error, httpCode int, variables ...interface{}) {
errStr := err.Error()
if len(variables) > 0 {
errStr = fmt.Sprintf(errStr, variables...)
}
log.Errorf("handle error:" + errStr)
debug.PrintStack()
causeError := errors2.Cause(err)
switch causeError.(type) {
case errors.OPError:
opError := causeError.(errors.OPError)
c.AbortWithStatusJSON(opError.HttpCode, gin.H{
"status": "ok",
"message": "error",
"error": errStr,
})
break
case validator.ValidationErrors:
validatorErrors := causeError.(validator.ValidationErrors)
//firstError := validatorErrors[0].(validator.FieldError)
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
"status": "ok",
"message": "error",
"error": validatorErrors.Error(),
})
break
default:
fmt.Println("deprecated....")
c.AbortWithStatusJSON(httpCode, gin.H{
"status": "ok",
"message": "error",
"error": errStr,
})
}
}
func (c *Context) FailedWithError(err error, httpCode ...int) {
var code = 200
if len(httpCode) > 0 {
code = httpCode[0]
}
c.failed(err, code)
}
func WithGinContext(context *gin.Context) *Context {
return &Context{Context: context}
}