route_register.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. }
  9. type RouteRegister interface {
  10. Get(string, ...macaron.Handler)
  11. Post(string, ...macaron.Handler)
  12. Delete(string, ...macaron.Handler)
  13. Put(string, ...macaron.Handler)
  14. Patch(string, ...macaron.Handler)
  15. Any(string, ...macaron.Handler)
  16. Group(string, func(RouteRegister), ...macaron.Handler)
  17. Register(Router) *macaron.Router
  18. }
  19. type RegisterNamedMiddleware func(name string) macaron.Handler
  20. func newRouteRegister(namedMiddleware ...RegisterNamedMiddleware) RouteRegister {
  21. return &routeRegister{
  22. prefix: "",
  23. routes: []route{},
  24. subfixHandlers: []macaron.Handler{},
  25. namedMiddleware: namedMiddleware,
  26. }
  27. }
  28. type route struct {
  29. method string
  30. pattern string
  31. handlers []macaron.Handler
  32. }
  33. type routeRegister struct {
  34. prefix string
  35. subfixHandlers []macaron.Handler
  36. namedMiddleware []RegisterNamedMiddleware
  37. routes []route
  38. groups []*routeRegister
  39. }
  40. func (rr *routeRegister) Group(pattern string, fn func(rr RouteRegister), handlers ...macaron.Handler) {
  41. group := &routeRegister{
  42. prefix: rr.prefix + pattern,
  43. subfixHandlers: append(rr.subfixHandlers, handlers...),
  44. routes: []route{},
  45. namedMiddleware: rr.namedMiddleware,
  46. }
  47. fn(group)
  48. rr.groups = append(rr.groups, group)
  49. }
  50. func (rr *routeRegister) Register(router Router) *macaron.Router {
  51. for _, r := range rr.routes {
  52. router.Handle(r.method, r.pattern, r.handlers)
  53. }
  54. for _, g := range rr.groups {
  55. g.Register(router)
  56. }
  57. return &macaron.Router{}
  58. }
  59. func (rr *routeRegister) route(pattern, method string, handlers ...macaron.Handler) {
  60. //inject tracing
  61. h := make([]macaron.Handler, 0)
  62. for _, fn := range rr.namedMiddleware {
  63. h = append(h, fn(pattern))
  64. }
  65. h = append(h, rr.subfixHandlers...)
  66. h = append(h, handlers...)
  67. rr.routes = append(rr.routes, route{
  68. method: method,
  69. pattern: rr.prefix + pattern,
  70. handlers: h,
  71. })
  72. }
  73. func (rr *routeRegister) Get(pattern string, handlers ...macaron.Handler) {
  74. rr.route(pattern, http.MethodGet, handlers...)
  75. }
  76. func (rr *routeRegister) Post(pattern string, handlers ...macaron.Handler) {
  77. rr.route(pattern, http.MethodPost, handlers...)
  78. }
  79. func (rr *routeRegister) Delete(pattern string, handlers ...macaron.Handler) {
  80. rr.route(pattern, http.MethodDelete, handlers...)
  81. }
  82. func (rr *routeRegister) Put(pattern string, handlers ...macaron.Handler) {
  83. rr.route(pattern, http.MethodPut, handlers...)
  84. }
  85. func (rr *routeRegister) Patch(pattern string, handlers ...macaron.Handler) {
  86. rr.route(pattern, http.MethodPatch, handlers...)
  87. }
  88. func (rr *routeRegister) Any(pattern string, handlers ...macaron.Handler) {
  89. rr.route(pattern, "*", handlers...)
  90. }