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  }