go 升级 gin/fiber 的控制器
coding
之前用 go 的泛型,写了相关的 collection 操作函数。所以又了对 fiber gin 这类 http lib 升级的想法,使得控制器的编写更加方便。
这里放一个最基础的例子,更多的编写放在了后方。
// ginUpP 支持params 参数
func ginUpP[T any](action func(request T) component.Response) func(c *gin.Context) {
return func(c *gin.Context) {
var params T
_ = c.ShouldBind(¶ms)
err := validate.Struct(params)
if err != nil {
c.JSON(http.StatusBadRequest, component.DataMap{
"msg": err.Error(),
})
}
response := action(params)
c.JSON(response.Code, response.Data)
}
}
这段代码可以使得类似这样的控制器代码很方便的撰写,将大量的重复代码剥离出控制器外。
type GetTwitterUserListParam struct {
Page int `form:"page"`
PageSize int `form:"pageSize"`
Search string `form:"search"`
}
func GetTwitterUserList(param GetTwitterUserListParam) component.Response {
pageData := FTwitterUser.Page(FTwitterUser.PageQuery{
Page: param.Page, PageSize: param.PageSize, Search: param.Search,
})
return component.SuccessResponse(component.DataMap{
"itemList": arms.ArrayMap(func(item FTwitterUser.FTwitterUser) TLink {
return TLink{
ScreenName: item.ScreenName,
Name: item.Name,
Desc: item.Desc,
Url: fmt.Sprintf("https://twitter.com/%v/with_replies", item.ScreenName),
CreateTime: item.CreateTime.Format("2006-01-02 15:05:05"),
}
}, pageData.Data),
"size": pageData.PageSize,
"total": pageData.Total,
"current": param.Page,
})
}
唯一的区别就是路由注册的代码可能会稍微长一点点
apiGroup.GET("/GetTwitterUserList", ginUpP(controllers.GetTwitterUserList))
import (
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
"net/http"
"thh/app/http/controllers/component"
)
var validate = validator.New()
// fiberUpP 支持params 参数
func fiberUpP[T any](action func(request T) component.Response) func(c *fiber.Ctx) error {
return func(c *fiber.Ctx) error {
var params T
_ = c.BodyParser(¶ms)
err := validate.Struct(params)
if err != nil {
return c.Status(http.StatusBadRequest).JSON(fiber.Map{
"msg": err.Error(),
})
}
response := action(params)
return c.Status(response.Code).JSON(response.Data)
}
}
// fiberUpNP 支持空参数
func fiberUpNP(action func() component.Response) func(c *fiber.Ctx) error {
return func(c *fiber.Ctx) error {
response := action()
return c.Status(response.Code).JSON(response.Data)
}
}
// fiberUpAuth 支持获取user 支持参数 在 auth 中间件后使用
func fiberUpAuth[T any](action func(ctx component.RequestContext, request T) component.Response) func(c *fiber.Ctx) error {
return func(c *fiber.Ctx) error {
userId := c.Locals("userId").(uint64)
if userId == 0 {
return c.Status(http.StatusUnauthorized).JSON(fiber.Map{
"message": "un Login",
})
}
var params T
_ = c.BodyParser(¶ms)
err := validate.Struct(params)
if err != nil {
return c.Status(http.StatusBadRequest).JSON(fiber.Map{
"msg": err.Error(),
})
}
response := action(component.RequestContext{
UserId: userId,
}, params)
return c.Status(response.Code).JSON(response.Data)
}
}
// fiberUpNPAuth 支持获取 user 无参数下使用
func fiberUpNPAuth(action func(ctx component.RequestContext) component.Response) func(c *fiber.Ctx) error {
return func(c *fiber.Ctx) error {
userId := c.Locals("userId").(uint64)
if userId == 0 {
return c.Status(http.StatusUnauthorized).JSON(fiber.Map{
"message": "un Login",
})
}
response := action(component.RequestContext{
UserId: userId,
})
return c.Status(response.Code).JSON(response.Data)
}
}
// ginUpP 支持params 参数
func ginUpP[T any](action func(request T) component.Response) func(c *gin.Context) {
return func(c *gin.Context) {
var params T
_ = c.ShouldBind(¶ms)
err := validate.Struct(params)
if err != nil {
c.JSON(http.StatusBadRequest, component.DataMap{
"msg": err.Error(),
})
}
response := action(params)
c.JSON(response.Code, response.Data)
}
}
// ginUpNP 支持空参数
func ginUpNP(action func() component.Response) func(c *gin.Context) {
return func(c *gin.Context) {
response := action()
c.JSON(response.Code, response.Data)
}
}
// ginUpAuth 支持获取user 支持参数 在 auth 中间件后使用
func ginUpAuth[T any](action func(ctx component.RequestContext, request T) component.Response) func(c *gin.Context) {
return func(c *gin.Context) {
userIdData, _ := c.Get("userId")
userId := userIdData.(uint64)
if userId == 0 {
c.JSON(http.StatusUnauthorized, fiber.Map{
"message": "un Login",
})
}
var params T
_ = c.ShouldBind(¶ms)
err := validate.Struct(params)
if err != nil {
c.JSON(http.StatusBadRequest, fiber.Map{
"msg": err.Error(),
})
}
response := action(component.RequestContext{
UserId: userId,
}, params)
c.JSON(response.Code, response.Data)
}
}
// ginUpNPAuth 支持获取 user 无参数下使用
func ginUpNPAuth(action func(ctx component.RequestContext) component.Response) func(c *gin.Context) {
return func(c *gin.Context) {
userIdData, _ := c.Get("userId")
userId := userIdData.(uint64)
if userId == 0 {
c.JSON(http.StatusUnauthorized, fiber.Map{
"message": "un Login",
})
}
response := action(component.RequestContext{
UserId: userId,
})
c.JSON(response.Code, response.Data)
}
}
评论列表