router.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package api
  2. import (
  3. "github.com/gin-gonic/gin"
  4. )
  5. // Handler 请求处理函数
  6. type Handler func(c *Context)
  7. type Router interface {
  8. AddMiddlewares(middlewares ...Handler) Router
  9. RegisterVersionedRouter(version string, middlewares ...Handler) Router
  10. GetVersionedRouter(version string) Router
  11. AddRoute(relativePath string, method string, middlewares ...Handler) Router
  12. }
  13. type RootRouter struct {
  14. engine *gin.Engine
  15. versioned map[string]*PrefixRouter
  16. }
  17. func newRootRouter(engine *gin.Engine) *RootRouter {
  18. return &RootRouter{
  19. engine: engine,
  20. versioned: make(map[string]*PrefixRouter),
  21. }
  22. }
  23. func (r *RootRouter) AddMiddlewares(middlewares ...Handler) Router {
  24. r.engine.Use(transferHandlers(middlewares...)...)
  25. return r
  26. }
  27. func (r *RootRouter) RegisterVersionedRouter(version string, middlewares ...Handler) Router {
  28. versioned := r.engine.Group(version, transferHandlers(middlewares...)...)
  29. r.versioned[version] = newPrefixRouter(versioned)
  30. return r.versioned[version]
  31. }
  32. func (r *RootRouter) GetVersionedRouter(version string) Router {
  33. return r.versioned[version]
  34. }
  35. func (r *RootRouter) AddRoute(method string, relativePath string, middlewares ...Handler) Router {
  36. r.engine.Handle(method, relativePath, transferHandlers(middlewares...)...)
  37. return r
  38. }
  39. type PrefixRouter struct {
  40. groupRouter *gin.RouterGroup
  41. versioned map[string]*PrefixRouter
  42. }
  43. func newPrefixRouter(group *gin.RouterGroup) *PrefixRouter {
  44. return &PrefixRouter{
  45. groupRouter: group,
  46. versioned: make(map[string]*PrefixRouter),
  47. }
  48. }
  49. func (r *PrefixRouter) AddMiddlewares(middlewares ...Handler) Router {
  50. r.groupRouter.Use(transferHandlers(middlewares...)...)
  51. return r
  52. }
  53. func (r *PrefixRouter) RegisterVersionedRouter(version string, middlewares ...Handler) Router {
  54. ginMiddlewares := make([]gin.HandlerFunc, 0)
  55. for _, m := range middlewares {
  56. innerM := m
  57. ginMiddlewares = append(ginMiddlewares, func(c *gin.Context) {
  58. innerM(&Context{Context: c})
  59. })
  60. }
  61. versioned := r.groupRouter.Group(version, ginMiddlewares...)
  62. r.versioned[version] = newPrefixRouter(versioned)
  63. return r.versioned[version]
  64. }
  65. func (r *PrefixRouter) GetVersionedRouter(version string) Router {
  66. return r.versioned[version]
  67. }
  68. func (r *PrefixRouter) AddRoute(method string, relativePath string, middlewares ...Handler) Router {
  69. r.groupRouter.Handle(method, relativePath, transferHandlers(middlewares...)...)
  70. return r
  71. }
  72. func transferHandlers(handlers ...Handler) []gin.HandlerFunc {
  73. ginHandlers := make([]gin.HandlerFunc, 0)
  74. for _, handler := range handlers {
  75. innerHandler := handler
  76. ginHandlers = append(ginHandlers, func(c *gin.Context) {
  77. innerHandler(&Context{Context: c})
  78. })
  79. }
  80. return ginHandlers
  81. }