router.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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(method string, relativePath string, middlewares ...Handler) Router
  12. Static(relativePath string, root string)
  13. StaticFile(relativePath string, filepath string)
  14. BasePath() string
  15. }
  16. type RootRouter struct {
  17. engine *gin.Engine
  18. versioned map[string]*PrefixRouter
  19. }
  20. func newRootRouter(engine *gin.Engine) *RootRouter {
  21. return &RootRouter{
  22. engine: engine,
  23. versioned: make(map[string]*PrefixRouter),
  24. }
  25. }
  26. func (r *RootRouter) AddMiddlewares(middlewares ...Handler) Router {
  27. r.engine.Use(transferHandlers(middlewares...)...)
  28. return r
  29. }
  30. func (r *RootRouter) RegisterVersionedRouter(version string, middlewares ...Handler) Router {
  31. versioned := r.engine.Group(version, transferHandlers(middlewares...)...)
  32. r.versioned[version] = newPrefixRouter(versioned)
  33. return r.versioned[version]
  34. }
  35. func (r *RootRouter) Static(relativePath string, root string) {
  36. r.engine.Static(relativePath, root)
  37. }
  38. func (r *RootRouter) StaticFile(relativePath string, filepath string) {
  39. r.engine.StaticFile(relativePath, filepath)
  40. }
  41. func (r *RootRouter) BasePath() string {
  42. return r.engine.BasePath()
  43. }
  44. func (r *RootRouter) GetVersionedRouter(version string) Router {
  45. return r.versioned[version]
  46. }
  47. func (r *RootRouter) AddRoute(method string, relativePath string, middlewares ...Handler) Router {
  48. r.engine.Handle(method, relativePath, transferHandlers(middlewares...)...)
  49. return r
  50. }
  51. type PrefixRouter struct {
  52. groupRouter *gin.RouterGroup
  53. versioned map[string]*PrefixRouter
  54. }
  55. func newPrefixRouter(group *gin.RouterGroup) *PrefixRouter {
  56. return &PrefixRouter{
  57. groupRouter: group,
  58. versioned: make(map[string]*PrefixRouter),
  59. }
  60. }
  61. func (r *PrefixRouter) AddMiddlewares(middlewares ...Handler) Router {
  62. r.groupRouter.Use(transferHandlers(middlewares...)...)
  63. return r
  64. }
  65. func (r *PrefixRouter) RegisterVersionedRouter(version string, middlewares ...Handler) Router {
  66. ginMiddlewares := make([]gin.HandlerFunc, 0)
  67. for _, m := range middlewares {
  68. innerM := m
  69. ginMiddlewares = append(ginMiddlewares, func(c *gin.Context) {
  70. innerM(&Context{Context: c})
  71. })
  72. }
  73. versioned := r.groupRouter.Group(version, ginMiddlewares...)
  74. r.versioned[version] = newPrefixRouter(versioned)
  75. return r.versioned[version]
  76. }
  77. func (r *PrefixRouter) GetVersionedRouter(version string) Router {
  78. return r.versioned[version]
  79. }
  80. func (r *PrefixRouter) AddRoute(method string, relativePath string, middlewares ...Handler) Router {
  81. r.groupRouter.Handle(method, relativePath, transferHandlers(middlewares...)...)
  82. return r
  83. }
  84. func (r *PrefixRouter) Static(relativePath string, root string) {
  85. r.groupRouter.Static(relativePath, root)
  86. }
  87. func (r *PrefixRouter) StaticFile(relativePath string, filepath string) {
  88. r.groupRouter.StaticFile(relativePath, filepath)
  89. }
  90. func (r *PrefixRouter) BasePath() string {
  91. return r.groupRouter.BasePath()
  92. }
  93. func transferHandlers(handlers ...Handler) []gin.HandlerFunc {
  94. ginHandlers := make([]gin.HandlerFunc, 0)
  95. for _, handler := range handlers {
  96. innerHandler := handler
  97. ginHandlers = append(ginHandlers, func(c *gin.Context) {
  98. innerHandler(&Context{Context: c})
  99. })
  100. }
  101. return ginHandlers
  102. }