gitee.com/woood2/luca@v1.0.4/internal/layer/controller.go (about) 1 package layer 2 3 import ( 4 "fmt" 5 "gitee.com/woood2/luca/internal/conf" 6 "gitee.com/woood2/luca/internal/errcode" 7 "gitee.com/woood2/luca/internal/trace" 8 "github.com/gin-gonic/gin" 9 "go.uber.org/zap" 10 ) 11 12 const GinCtxKeyOptResult = "opt-result" 13 const ( 14 OptResultSucc = "succ" 15 OptResultFail = "fail" 16 ) 17 18 type Controller struct { 19 Env string 20 Logger *zap.Logger 21 innerLogger *zap.Logger 22 } 23 24 func NewController(env string, logger *zap.Logger) Controller { 25 return Controller{ 26 Env: env, 27 Logger: logger, 28 innerLogger: logger.WithOptions(zap.AddCallerSkip(1)), 29 } 30 } 31 32 func (ctr Controller) OK(c *gin.Context, v interface{}) { 33 tid := trace.GinID(c) 34 resp := &errcode.Resp{ 35 ErrCode: "", 36 ErrMsg: "", 37 Data: v, 38 TraceID: tid, 39 } 40 c.JSON(200, resp) 41 c.Set(GinCtxKeyOptResult, OptResultSucc) 42 } 43 44 func (ctr Controller) Error(c *gin.Context, err error) { 45 tid := trace.GinID(c) 46 code := "" 47 msg := "" 48 stack := "" 49 if enum, ok := errcode.RestfulErrCode[err]; ok { 50 code = enum 51 msg = err.Error() 52 } else { 53 ctr.innerLogger.Error("unknown err", 54 zap.String("traceID", trace.GinID(c)), 55 zap.Any("err", err), 56 ) 57 code = errcode.RestfulErrCode[errcode.ServerErr] 58 msg = errcode.ServerErr.Error() 59 if !conf.IsPro(ctr.Env) { 60 //复制这堆字符串,shell下echo "..." 即可看到换行的格式 61 //需要详细堆栈,请在调用类库的最临近位置使用errors.Wrap 62 //gorm相关操作可以免去Wrap,毕竟gorm本身提供了sql error日志 63 stack = fmt.Sprintf("%+v", err) 64 } 65 } 66 resp := &errcode.Resp{ 67 ErrCode: code, 68 ErrMsg: msg, 69 Data: nil, 70 TraceID: tid, 71 Stack: stack, 72 } 73 httpCode := 200 74 if code == errcode.RestfulErrCode[errcode.ServerErr] { 75 httpCode = 500 76 } 77 c.JSON(httpCode, resp) 78 c.Set(GinCtxKeyOptResult, OptResultFail) 79 } 80 81 func (ctr Controller) Bad(c *gin.Context, err error) { 82 c.JSON(400, err.Error()) 83 c.Set(GinCtxKeyOptResult, OptResultFail) 84 }