feat: init

This commit is contained in:
Rogee
2024-12-25 17:49:29 +08:00
parent 77e36d5aaf
commit 28735f506f
6 changed files with 219 additions and 164 deletions

View File

@@ -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, "内部错误")
)

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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()))
},
}))