route_register.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. // RouteRegister allows you to add routes and macaron.Handlers
  11. // that the web server should serve.
  12. type RouteRegister interface {
  13. Get(string, ...macaron.Handler)
  14. Post(string, ...macaron.Handler)
  15. Delete(string, ...macaron.Handler)
  16. Put(string, ...macaron.Handler)
  17. Patch(string, ...macaron.Handler)
  18. Any(string, ...macaron.Handler)
  19. Group(string, func(RouteRegister), ...macaron.Handler)
  20. Register(Router) *macaron.Router
  21. }
  22. type RegisterNamedMiddleware func(name string) macaron.Handler
  23. // NewRouteRegister creates a new RouteRegister with all middlewares sent as params
  24. func NewRouteRegister(namedMiddleware ...RegisterNamedMiddleware) RouteRegister {
  25. return &routeRegister{
  26. prefix: "",
  27. routes: []route{},
  28. subfixHandlers: []macaron.Handler{},
  29. namedMiddleware: namedMiddleware,
  30. }
  31. }
  32. type route struct {
  33. method string
  34. pattern string
  35. handlers []macaron.Handler
  36. }
  37. type routeRegister struct {
  38. prefix string
  39. subfixHandlers []macaron.Handler
  40. namedMiddleware []RegisterNamedMiddleware
  41. routes []route
  42. groups []*routeRegister
  43. }
  44. func (rr *routeRegister) Group(pattern string, fn func(rr RouteRegister), handlers ...macaron.Handler) {
  45. group := &routeRegister{
  46. prefix: rr.prefix + pattern,
  47. subfixHandlers: append(rr.subfixHandlers, handlers...),
  48. routes: []route{},
  49. namedMiddleware: rr.namedMiddleware,
  50. }
  51. fn(group)
  52. rr.groups = append(rr.groups, group)
  53. }
  54. func (rr *routeRegister) Register(router Router) *macaron.Router {
  55. for _, r := range rr.routes {
  56. // GET requests have to be added to macaron routing using Get()
  57. // Otherwise HEAD requests will not be allowed.
  58. // https://github.com/go-macaron/macaron/blob/a325110f8b392bce3e5cdeb8c44bf98078ada3be/router.go#L198
  59. if r.method == http.MethodGet {
  60. router.Get(r.pattern, r.handlers...)
  61. } else {
  62. router.Handle(r.method, r.pattern, r.handlers)
  63. }
  64. }
  65. for _, g := range rr.groups {
  66. g.Register(router)
  67. }
  68. return &macaron.Router{}
  69. }
  70. func (rr *routeRegister) route(pattern, method string, handlers ...macaron.Handler) {
  71. h := make([]macaron.Handler, 0)
  72. for _, fn := range rr.namedMiddleware {
  73. h = append(h, fn(pattern))
  74. }
  75. h = append(h, rr.subfixHandlers...)
  76. h = append(h, handlers...)
  77. rr.routes = append(rr.routes, route{
  78. method: method,
  79. pattern: rr.prefix + pattern,
  80. handlers: h,
  81. })
  82. }
  83. func (rr *routeRegister) Get(pattern string, handlers ...macaron.Handler) {
  84. rr.route(pattern, http.MethodGet, handlers...)
  85. }
  86. func (rr *routeRegister) Post(pattern string, handlers ...macaron.Handler) {
  87. rr.route(pattern, http.MethodPost, handlers...)
  88. }
  89. func (rr *routeRegister) Delete(pattern string, handlers ...macaron.Handler) {
  90. rr.route(pattern, http.MethodDelete, handlers...)
  91. }
  92. func (rr *routeRegister) Put(pattern string, handlers ...macaron.Handler) {
  93. rr.route(pattern, http.MethodPut, handlers...)
  94. }
  95. func (rr *routeRegister) Patch(pattern string, handlers ...macaron.Handler) {
  96. rr.route(pattern, http.MethodPatch, handlers...)
  97. }
  98. func (rr *routeRegister) Any(pattern string, handlers ...macaron.Handler) {
  99. rr.route(pattern, "*", handlers...)
  100. }