mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
add custom route register
This commit is contained in:
parent
bf138d1845
commit
f842265388
@ -6,18 +6,26 @@ import (
|
|||||||
macaron "gopkg.in/macaron.v1"
|
macaron "gopkg.in/macaron.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Router interface {
|
||||||
|
Route(pattern, method string, handlers ...macaron.Handler)
|
||||||
|
}
|
||||||
|
|
||||||
type RouteRegister interface {
|
type RouteRegister interface {
|
||||||
Get(string, ...macaron.Handler)
|
Get(string, ...macaron.Handler)
|
||||||
Post(string, ...macaron.Handler)
|
Post(string, ...macaron.Handler)
|
||||||
Delete(string, ...macaron.Handler)
|
Delete(string, ...macaron.Handler)
|
||||||
Put(string, ...macaron.Handler)
|
Put(string, ...macaron.Handler)
|
||||||
|
|
||||||
Group(string, func(RouteRegister), ...macaron.Handler)
|
Group(string, func(RouteRegister), ...macaron.Handler)
|
||||||
|
|
||||||
|
Register(Router)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newRouteRegister(rr *macaron.Router) RouteRegister {
|
func newRouteRegister() RouteRegister {
|
||||||
return &routeRegister{
|
return &routeRegister{
|
||||||
prefix: "",
|
prefix: "",
|
||||||
routes: []route{},
|
routes: []route{},
|
||||||
|
subfixHandlers: []macaron.Handler{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,56 +39,50 @@ type routeRegister struct {
|
|||||||
prefix string
|
prefix string
|
||||||
subfixHandlers []macaron.Handler
|
subfixHandlers []macaron.Handler
|
||||||
routes []route
|
routes []route
|
||||||
|
groups []*routeRegister
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *routeRegister) Group(pattern string, fn func(rr RouteRegister), handlers ...macaron.Handler) {
|
func (rr *routeRegister) Group(pattern string, fn func(rr RouteRegister), handlers ...macaron.Handler) {
|
||||||
group := &routeRegister{
|
group := &routeRegister{
|
||||||
prefix: rr.prefix + pattern,
|
prefix: rr.prefix + pattern,
|
||||||
subfixHandlers: handlers,
|
subfixHandlers: append(rr.subfixHandlers, handlers...),
|
||||||
routes: rr.routes,
|
routes: []route{},
|
||||||
}
|
}
|
||||||
|
|
||||||
fn(group)
|
fn(group)
|
||||||
|
rr.groups = append(rr.groups, group)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rr *routeRegister) Register(router Router) {
|
||||||
|
for _, r := range rr.routes {
|
||||||
|
router.Route(r.pattern, r.method, r.handlers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, g := range rr.groups {
|
||||||
|
g.Register(router)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rr *routeRegister) route(pattern, method string, handlers ...macaron.Handler) {
|
||||||
|
rr.routes = append(rr.routes, route{
|
||||||
|
method: method,
|
||||||
|
pattern: rr.prefix + pattern,
|
||||||
|
handlers: append(rr.subfixHandlers, handlers...),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *routeRegister) Get(pattern string, handlers ...macaron.Handler) {
|
func (rr *routeRegister) Get(pattern string, handlers ...macaron.Handler) {
|
||||||
rr.routes = append(rr.routes, route{
|
rr.route(pattern, http.MethodGet, handlers...)
|
||||||
method: http.MethodGet,
|
|
||||||
pattern: rr.prefix + pattern,
|
|
||||||
handlers: handlers,
|
|
||||||
})
|
|
||||||
println("get: get ", len(rr.routes))
|
|
||||||
rr.routes = rr.routes[:len(rr.routes)-1]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *routeRegister) Post(pattern string, handlers ...macaron.Handler) {
|
func (rr *routeRegister) Post(pattern string, handlers ...macaron.Handler) {
|
||||||
rr.routes = append(rr.routes, route{
|
rr.route(pattern, http.MethodPost, handlers...)
|
||||||
method: http.MethodPost,
|
|
||||||
pattern: rr.prefix + pattern,
|
|
||||||
handlers: handlers,
|
|
||||||
})
|
|
||||||
println("get: post ", len(rr.routes))
|
|
||||||
|
|
||||||
rr.routes = rr.routes[:len(rr.routes)-1]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *routeRegister) Delete(pattern string, handlers ...macaron.Handler) {
|
func (rr *routeRegister) Delete(pattern string, handlers ...macaron.Handler) {
|
||||||
rr.routes = append(rr.routes, route{
|
rr.route(pattern, http.MethodDelete, handlers...)
|
||||||
method: http.MethodDelete,
|
|
||||||
pattern: rr.prefix + pattern,
|
|
||||||
handlers: handlers,
|
|
||||||
})
|
|
||||||
println("get: delete ", len(rr.routes))
|
|
||||||
|
|
||||||
rr.routes = rr.routes[:len(rr.routes)-1]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *routeRegister) Put(pattern string, handlers ...macaron.Handler) {
|
func (rr *routeRegister) Put(pattern string, handlers ...macaron.Handler) {
|
||||||
rr.routes = append(rr.routes, route{
|
rr.route(pattern, http.MethodPut, handlers...)
|
||||||
method: http.MethodPut,
|
|
||||||
pattern: rr.prefix + pattern,
|
|
||||||
handlers: handlers,
|
|
||||||
})
|
|
||||||
|
|
||||||
rr.routes = rr.routes[:len(rr.routes)-1]
|
|
||||||
}
|
}
|
||||||
|
@ -1,39 +1,86 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
macaron "gopkg.in/macaron.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
type fakeRouter struct {
|
||||||
|
route []route
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fr *fakeRouter) Route(pattern, method string, handlers ...macaron.Handler) {
|
||||||
|
fr.route = append(fr.route, route{
|
||||||
|
pattern: pattern,
|
||||||
|
method: method,
|
||||||
|
handlers: handlers,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func emptyHandlers(n int) []macaron.Handler {
|
||||||
|
res := []macaron.Handler{}
|
||||||
|
for i := 1; n >= i; i++ {
|
||||||
|
res = append(res, emptyHandler(strconv.Itoa(i)))
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func emptyHandler(name string) macaron.Handler {
|
||||||
|
return struct{ name string }{name: name}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRouteRegister(t *testing.T) {
|
func TestRouteRegister(t *testing.T) {
|
||||||
|
testTable := []route{
|
||||||
rr := &routeRegister{
|
{method: "DELETE", pattern: "/admin", handlers: emptyHandlers(1)},
|
||||||
prefix: "",
|
{method: "GET", pattern: "/down", handlers: emptyHandlers(2)},
|
||||||
routes: []route{},
|
{method: "POST", pattern: "/user", handlers: emptyHandlers(1)},
|
||||||
|
{method: "PUT", pattern: "/user/friends", handlers: emptyHandlers(1)},
|
||||||
|
{method: "DELETE", pattern: "/user/admin", handlers: emptyHandlers(2)},
|
||||||
|
{method: "GET", pattern: "/user/admin/all", handlers: emptyHandlers(4)},
|
||||||
}
|
}
|
||||||
|
|
||||||
rr.Delete("/admin")
|
// Setup
|
||||||
rr.Get("/down")
|
rr := newRouteRegister()
|
||||||
|
|
||||||
rr.Group("/user", func(innerRR RouteRegister) {
|
rr.Delete("/admin", emptyHandler("1"))
|
||||||
innerRR.Delete("")
|
rr.Get("/down", emptyHandler("1"), emptyHandler("2"))
|
||||||
innerRR.Get("/friends")
|
|
||||||
|
rr.Group("/user", func(user RouteRegister) {
|
||||||
|
user.Post("", emptyHandler("1"))
|
||||||
|
user.Put("/friends", emptyHandler("2"))
|
||||||
|
|
||||||
|
user.Group("/admin", func(admin RouteRegister) {
|
||||||
|
admin.Delete("", emptyHandler("3"))
|
||||||
|
admin.Get("/all", emptyHandler("3"), emptyHandler("4"), emptyHandler("5"))
|
||||||
|
|
||||||
|
}, emptyHandler("3"))
|
||||||
})
|
})
|
||||||
|
|
||||||
println("len", len(rr.routes))
|
fr := &fakeRouter{}
|
||||||
|
rr.Register(fr)
|
||||||
|
|
||||||
if rr.routes[0].pattern != "/admin" && rr.routes[0].method != "DELETE" {
|
// Validation
|
||||||
t.Errorf("expected first route to be DELETE /admin")
|
if len(fr.route) != len(testTable) {
|
||||||
|
t.Errorf("want %v routes, got %v", len(testTable), len(fr.route))
|
||||||
}
|
}
|
||||||
|
|
||||||
if rr.routes[1].pattern != "/down" && rr.routes[1].method != "GET" {
|
for i, _ := range testTable {
|
||||||
t.Errorf("expected first route to be GET /down")
|
if testTable[i].method != fr.route[i].method {
|
||||||
}
|
t.Errorf("want %s got %v", testTable[i].method, fr.route[i].method)
|
||||||
|
}
|
||||||
|
|
||||||
println("len", len(rr.routes))
|
if testTable[i].pattern != fr.route[i].pattern {
|
||||||
|
t.Errorf("want %s got %v", testTable[i].pattern, fr.route[i].pattern)
|
||||||
|
}
|
||||||
|
|
||||||
if rr.routes[2].pattern != "/user" && rr.routes[2].method != "DELETE" {
|
if len(testTable[i].handlers) != len(fr.route[i].handlers) {
|
||||||
t.Errorf("expected first route to be DELETE /admin")
|
t.Errorf("want %d handlers got %d handlers \ntestcase: %v\nroute: %v\n",
|
||||||
}
|
len(testTable[i].handlers),
|
||||||
|
len(fr.route[i].handlers),
|
||||||
if rr.routes[3].pattern != "/user/friends" && rr.routes[3].method != "GET" {
|
testTable[i],
|
||||||
t.Errorf("expected first route to be GET /down")
|
fr.route[i])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user