diff --git a/templates/project/app/errorx/error.go.tpl b/templates/project/app/errorx/error.go.tpl index 8361dd2..e7489cc 100644 --- a/templates/project/app/errorx/error.go.tpl +++ b/templates/project/app/errorx/error.go.tpl @@ -1,31 +1,116 @@ package errorx import ( + "errors" "fmt" "net/http" + "runtime" + "github.com/go-jet/jet/v2/qrm" "github.com/gofiber/fiber/v3" + "github.com/gofiber/fiber/v3/binder" + "github.com/gofiber/utils/v2" + log "github.com/sirupsen/logrus" ) +func Middleware(c fiber.Ctx) error { + err := c.Next() + if err != nil { + return Wrap(err).Response(c) + } + return err +} + type Response struct { - StatusCode int `json:"-"` - Code int `json:"code"` - Message string `json:"message"` + isFormat bool + err error + params []any + sql string + file string + + StatusCode int `json:"-" xml:"-"` + Code int `json:"code" xml:"code"` + Message string `json:"message" xml:"message"` } -func Wrap(err error) Response { - return Response{http.StatusInternalServerError, http.StatusInternalServerError, err.Error()} +func New(code, statusCode int, message string) *Response { + return &Response{ + isFormat: true, + StatusCode: statusCode, + Code: code, + Message: message, + } } -func (r Response) Error() string { +func (r *Response) Sql(sql string) *Response { + r.sql = sql + return r +} + +func (r *Response) Params(params ...any) *Response { + r.params = params + if _, file, line, ok := runtime.Caller(1); ok { + r.file = fmt.Sprintf("%s:%d", file, line) + } + return r +} + +func Wrap(err error) *Response { + if e, ok := err.(*Response); ok { + return e + } + return &Response{err: err} +} + +func (r *Response) format() { + r.isFormat = true + if errors.Is(r.err, qrm.ErrNoRows) { + r.Code = RecordNotExists.Code + r.Message = RecordNotExists.Message + r.StatusCode = RecordNotExists.StatusCode + return + } + + if e, ok := r.err.(*fiber.Error); ok { + r.Code = e.Code + r.Message = e.Message + r.StatusCode = e.Code + return + } +} + +func (r *Response) Error() string { + if !r.isFormat { + r.format() + } + return fmt.Sprintf("[%d] %s", r.Code, r.Message) } -func (r Response) Response(ctx fiber.Ctx) error { - return ctx.Status(r.StatusCode).JSON(r) +func (r *Response) Response(ctx fiber.Ctx) error { + if !r.isFormat { + r.format() + } + + contentType := utils.ToLower(utils.UnsafeString(ctx.Context().Request.Header.ContentType())) + contentType = binder.FilterFlags(utils.ParseVendorSpecificContentType(contentType)) + + log.WithError(r.err).WithField("file", r.file).WithField("params", r.params).Errorf("response error: %+v", r) + + // Parse body accordingly + switch contentType { + case fiber.MIMETextXML, fiber.MIMEApplicationXML: + return ctx.Status(r.StatusCode).XML(r) + case fiber.MIMETextHTML, fiber.MIMETextPlain: + return ctx.Status(r.StatusCode).SendString(r.Message) + default: + return ctx.Status(r.StatusCode).JSON(r.Message) + } } var ( - RequestParseError = Response{http.StatusBadRequest, http.StatusBadRequest, "请求解析错误"} - InternalError = Response{http.StatusInternalServerError, http.StatusInternalServerError, "内部错误"} + RecordNotExists = New(http.StatusNotFound, http.StatusNotFound, "记录不存在") + BadRequest = New(http.StatusBadRequest, http.StatusBadRequest, "请求错误") + Unauthorized = New(http.StatusUnauthorized, http.StatusUnauthorized, "未授权") + InternalErr = New(http.StatusInternalServerError, http.StatusInternalServerError, "内部错误") ) diff --git a/templates/project/app/middlewares/mid_response.go.tpl b/templates/project/app/middlewares/mid_response.go.tpl deleted file mode 100644 index 16573b5..0000000 --- a/templates/project/app/middlewares/mid_response.go.tpl +++ /dev/null @@ -1,31 +0,0 @@ -package middlewares - -import ( - "{{.ModuleName}}/app/errorx" - - "github.com/gofiber/fiber/v3" - log "github.com/sirupsen/logrus" -) - -func (f *Middlewares) ProcessResponse(c fiber.Ctx) error { - err := c.Next() - if err != nil { - log.WithError(err).Error("process response error") - - if e, ok := err.(errorx.Response); ok { - return e.Response(c) - } - - if e, ok := err.(*fiber.Error); ok { - return errorx.Response{ - StatusCode: e.Code, - Code: e.Code, - Message: e.Message, - }.Response(c) - } - - return errorx.Wrap(err).Response(c) - - } - return err -} diff --git a/templates/project/pkg/f/func.go.tpl b/templates/project/pkg/f/func.go.tpl index 02a34b7..88bd1e2 100644 --- a/templates/project/pkg/f/func.go.tpl +++ b/templates/project/pkg/f/func.go.tpl @@ -51,16 +51,16 @@ func Func3[P1 any, P2 any, P3 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3) } @@ -76,22 +76,22 @@ func Func4[P1 any, P2 any, P3 any, P4 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3, p4) @@ -109,23 +109,23 @@ func Func5[P1 any, P2 any, P3 any, P4 any, P5 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3, p4, p5) } @@ -143,27 +143,27 @@ func Func6[P1 any, P2 any, P3 any, P4 any, P5 any, P6 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3, p4, p5, p6) } @@ -182,31 +182,31 @@ func Func7[P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3, p4, p5, p6, p7) } @@ -226,35 +226,35 @@ func Func8[P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any, P8 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } p8, err := pf8(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3, p4, p5, p6, p7, p8) } @@ -275,39 +275,39 @@ func Func9[P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any, P8 any, P9 an return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } p8, err := pf8(ctx) if err != nil { - return nil + return err } p9, err := pf9(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3, p4, p5, p6, p7, p8, p9) } @@ -329,45 +329,44 @@ func Func10[P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any, P8 any, P9 a return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } p8, err := pf8(ctx) if err != nil { - return nil + return err } p9, err := pf9(ctx) if err != nil { - return nil + return err } p10, err := pf10(ctx) if err != nil { - return nil + return err } return f(ctx, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) } } - diff --git a/templates/project/pkg/f/func_data.go.tpl b/templates/project/pkg/f/func_data.go.tpl index 8eeb68a..64735bc 100644 --- a/templates/project/pkg/f/func_data.go.tpl +++ b/templates/project/pkg/f/func_data.go.tpl @@ -10,7 +10,7 @@ func DataFunc[T any]( return func(ctx fiber.Ctx) error { data, err := f(ctx) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -23,12 +23,12 @@ func DataFunc1[T any, P1 any]( return func(ctx fiber.Ctx) error { p, err := pf1(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -42,15 +42,15 @@ func DataFunc2[T any, P1 any, P2 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -65,19 +65,19 @@ func DataFunc3[T any, P1 any, P2 any, P3 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -93,23 +93,23 @@ func DataFunc4[T any, P1 any, P2 any, P3 any, P4 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3, p4) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -126,27 +126,27 @@ func DataFunc5[T any, P1 any, P2 any, P3 any, P4 any, P5 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3, p4, p5) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -164,31 +164,31 @@ func DataFunc6[T any, P1 any, P2 any, P3 any, P4 any, P5 any, P6 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3, p4, p5, p6) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -207,35 +207,35 @@ func DataFunc7[T any, P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any]( return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3, p4, p5, p6, p7) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -255,39 +255,39 @@ func DataFunc8[T any, P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any, P8 return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } p8, err := pf8(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3, p4, p5, p6, p7, p8) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -308,43 +308,43 @@ func DataFunc9[T any, P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any, P8 return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } p8, err := pf8(ctx) if err != nil { - return nil + return err } p9, err := pf9(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3, p4, p5, p6, p7, p8, p9) if err != nil { - return nil + return err } return ctx.JSON(data) } @@ -366,47 +366,47 @@ func DataFunc10[T any, P1 any, P2 any, P3 any, P4 any, P5 any, P6 any, P7 any, P return func(ctx fiber.Ctx) error { p1, err := pf1(ctx) if err != nil { - return nil + return err } p2, err := pf2(ctx) if err != nil { - return nil + return err } p3, err := pf3(ctx) if err != nil { - return nil + return err } p4, err := pf4(ctx) if err != nil { - return nil + return err } p5, err := pf5(ctx) if err != nil { - return nil + return err } p6, err := pf6(ctx) if err != nil { - return nil + return err } p7, err := pf7(ctx) if err != nil { - return nil + return err } p8, err := pf8(ctx) if err != nil { - return nil + return err } p9, err := pf9(ctx) if err != nil { - return nil + return err } p10, err := pf10(ctx) if err != nil { - return nil + return err } data, err := f(ctx, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) if err != nil { - return nil + return err } return ctx.JSON(data) } diff --git a/templates/project/pkg/service/http/http.go.tpl b/templates/project/pkg/service/http/http.go.tpl index cf9b03e..e1960f1 100644 --- a/templates/project/pkg/service/http/http.go.tpl +++ b/templates/project/pkg/service/http/http.go.tpl @@ -1,6 +1,7 @@ package http import ( + "{{.ModuleName}}/app/errorx" _ "{{.ModuleName}}/docs" "{{.ModuleName}}/pkg/service" "{{.ModuleName}}/providers/app" @@ -48,18 +49,19 @@ type Http struct { func Serve(cmd *cobra.Command, args []string) error { return container.Container.Invoke(func(http Http) error { + log.SetFormatter(&log.JSONFormatter{}) + if http.App.Mode == app.AppModeDevelopment { log.SetLevel(log.DebugLevel) http.Service.Engine.Get("/swagger/*", swagger.HandlerDefault) } - + http.Service.Engine.Use(errorx.Middleware) http.Service.Engine.Use(favicon.New(favicon.Config{ Data: []byte{}, })) - group := http.Service.Engine.Group("/v1") - + group := http.Service.Engine.Group("") for _, route := range http.Routes { route.Register(group) } diff --git a/templates/project/providers/http/engine.go.tpl b/templates/project/providers/http/engine.go.tpl index a5763aa..19a4996 100644 --- a/templates/project/providers/http/engine.go.tpl +++ b/templates/project/providers/http/engine.go.tpl @@ -70,7 +70,7 @@ func Provide(opts ...opt.Option) error { engine.Use(recover.New(recover.Config{ EnableStackTrace: true, StackTraceHandler: func(c fiber.Ctx, e any) { - log.WithError(e.(error)).Error(fmt.Sprintf("panic: %v\n%s\n", e, debug.Stack())) + log.Error(fmt.Sprintf("panic: %v\n%s\n", e, debug.Stack())) }, }))