feat: docs api design
This commit is contained in:
60
pkg/middlewares/uniform/uniform.go
Normal file
60
pkg/middlewares/uniform/uniform.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package uniform
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/tidwall/gjson"
|
||||
"github.com/tidwall/sjson"
|
||||
)
|
||||
|
||||
// 调整JSON结果返回为公司要求的统一格式
|
||||
|
||||
// New creates a new middleware handler
|
||||
func New(cfgs ...Config) fiber.Handler {
|
||||
// Set default config
|
||||
cfg := configDefault(cfgs...)
|
||||
|
||||
// Return new handler
|
||||
return func(ctx *fiber.Ctx) error {
|
||||
// Don't execute middleware if Next returns true
|
||||
if cfg.Next != nil && cfg.Next(ctx) {
|
||||
return ctx.Next()
|
||||
}
|
||||
|
||||
uniformedResp := []byte{}
|
||||
_ = ctx.Next()
|
||||
code := ctx.Response().StatusCode()
|
||||
if code >= 200 && code < 300 {
|
||||
if string(ctx.Response().Header.ContentType()) == "application/json" {
|
||||
uniformedResp, _ = sjson.SetBytes(uniformedResp, "code", 0)
|
||||
uniformedResp, _ = sjson.SetRawBytes(uniformedResp, "data", ctx.Response().Body())
|
||||
ctx.Response().SetBodyRaw(uniformedResp)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if code == 422 {
|
||||
uniformedResp, _ = sjson.SetBytes(uniformedResp, "code", 422)
|
||||
uniformedResp, _ = sjson.SetBytes(uniformedResp, "message", "参数校验失败")
|
||||
uniformedResp, _ = sjson.SetRawBytes(uniformedResp, "details", ctx.Response().Body())
|
||||
ctx.Response().SetBodyRaw(uniformedResp)
|
||||
return nil
|
||||
}
|
||||
if code >= 400 {
|
||||
log.Ctx(ctx.UserContext()).Error().
|
||||
Int("status", code).
|
||||
Str("request", ctx.String()).
|
||||
Bytes("body", uniformedResp).
|
||||
Msg("error occurred")
|
||||
uniformedResp, _ = sjson.SetBytes(uniformedResp, "code", code)
|
||||
|
||||
resp := ctx.Context().Response.Body()
|
||||
if msg := gjson.GetBytes(resp, "message"); msg.Exists() {
|
||||
uniformedResp, _ = sjson.SetBytes(uniformedResp, "message", msg.String())
|
||||
} else {
|
||||
uniformedResp, _ = sjson.SetBytes(uniformedResp, "message", resp)
|
||||
}
|
||||
ctx.Response().SetBodyRaw(uniformedResp)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
29
pkg/middlewares/uniform/uniform_config.go
Normal file
29
pkg/middlewares/uniform/uniform_config.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package uniform
|
||||
|
||||
import "github.com/gofiber/fiber/v2"
|
||||
|
||||
// Config defines the config for middleware.
|
||||
type Config struct {
|
||||
// Next defines a function to skip this middleware when returned true.
|
||||
//
|
||||
// Optional. Default: nil
|
||||
Next func(c *fiber.Ctx) bool
|
||||
}
|
||||
|
||||
// ConfigDefault is the default config
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
}
|
||||
|
||||
// Helper function to set default values
|
||||
func configDefault(config ...Config) Config {
|
||||
// Return default config if nothing provided
|
||||
if len(config) < 1 {
|
||||
return ConfigDefault
|
||||
}
|
||||
|
||||
// Override default config
|
||||
cfg := config[0]
|
||||
|
||||
return cfg
|
||||
}
|
||||
Reference in New Issue
Block a user