route_register.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package api
  2. import (
  3. "net/http"
  4. macaron "gopkg.in/macaron.v1"
  5. )
  6. type Router interface {
  7. Handle(method, pattern string, handlers []macaron.Handler) *macaron.Route
  8. Get(pattern string, handlers ...macaron.Handler) *macaron.Route
  9. }
  10. type RouteRegister interface {
  11. Get(string, ...macaron.Handler)
  12. Post(string, ...macaron.Handler)
  13. Delete(string, ...macaron.Handler)
  14. Put(string, ...macaron.Handler)
  15. Patch(string, ...macaron.Handler)
  16. Any(string, ...macaron.Handler)
  17. Group(string, func(RouteRegister), ...macaron.Handler)
  18. Register(Router) *macaron.Router
  19. }
  20. type RegisterNamedMiddleware func(name string) macaron.Handler
  21. func newRouteRegister(namedMiddleware ...RegisterNamedMiddleware) RouteRegister {
  22. return &routeRegister{
  23. prefix: "",
  24. routes: []route{},
  25. subfixHandlers: []macaron.Handler{},
  26. namedMiddleware: namedMiddleware,
  27. }
  28. }
  29. type route struct {
  30. method string
  31. pattern string
  32. handlers []macaron.Handler
  33. }
  34. type routeRegister struct {
  35. prefix string
  36. subfixHandlers []macaron.Handler
  37. namedMiddleware []RegisterNamedMiddleware
  38. routes []route
  39. groups []*routeRegister
  40. }
  41. func (rr *routeRegister) Group(pattern string, fn func(rr RouteRegister), handlers ...macaron.Handler) {
  42. group := &routeRegister{
  43. prefix: rr.prefix + pattern,
  44. subfixHandlers: append(rr.subfixHandlers, handlers...),
  45. routes: []route{},
  46. namedMiddleware: rr.namedMiddleware,
  47. }
  48. fn(group)
  49. rr.groups = append(rr.groups, group)
  50. }
  51. func (rr *routeRegister) Register(router Router) *macaron.Router {
  52. for _, r := range rr.routes {
  53. // GET requests have to be added to macaron routing using Get()
  54. // Otherwise HEAD requests will not be allowed.
  55. // https://github.com/go-macaron/macaron/blob/a325110f8b392bce3e5cdeb8c44bf98078ada3be/router.go#L198
  56. if r.method == http.MethodGet {
  57. router.Get(r.pattern, r.handlers...)
  58. } else {
  59. router.Handle(r.method, r.pattern, r.handlers)
  60. }
  61. }
  62. for _, g := range rr.groups {
  63. g.Register(router)
  64. }
  65. return &macaron.Router{}
  66. }
  67. func (rr *routeRegister) route(pattern, method string, handlers ...macaron.Handler) {
  68. //inject tracing
  69. h := make([]macaron.Handler, 0)
  70. for _, fn := range rr.namedMiddleware {
  71. h = append(h, fn(pattern))
  72. }
  73. h = append(h, rr.subfixHandlers...)
  74. h = append(h, handlers...)
  75. rr.routes = append(rr.routes, route{
  76. method: method,
  77. pattern: rr.prefix + pattern,
  78. handlers: h,
  79. })
  80. }
  81. func (rr *routeRegister) Get(pattern string, handlers ...macaron.Handler) {
  82. rr.route(pattern, http.MethodGet, handlers...)
  83. }
  84. func (rr *routeRegister) Post(pattern string, handlers ...macaron.Handler) {
  85. rr.route(pattern, http.MethodPost, handlers...)
  86. }
  87. func (rr *routeRegister) Delete(pattern string, handlers ...macaron.Handler) {
  88. rr.route(pattern, http.MethodDelete, handlers...)
  89. }
  90. func (rr *routeRegister) Put(pattern string, handlers ...macaron.Handler) {
  91. rr.route(pattern, http.MethodPut, handlers...)
  92. }
  93. func (rr *routeRegister) Patch(pattern string, handlers ...macaron.Handler) {
  94. rr.route(pattern, http.MethodPatch, handlers...)
  95. }
  96. func (rr *routeRegister) Any(pattern string, handlers ...macaron.Handler) {
  97. rr.route(pattern, "*", handlers...)
  98. }