Skip to content

Commit 6696447

Browse files
committed
Som | Add web routing capabilities
1 parent 58ded90 commit 6696447

File tree

2 files changed

+132
-0
lines changed

2 files changed

+132
-0
lines changed

router/web/router.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package web
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/isomnath/belvedere/config"
7+
"github.com/isomnath/belvedere/handlers"
8+
9+
ddTracerMux "gopkg.in/DataDog/dd-trace-go.v1/contrib/gorilla/mux"
10+
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
11+
)
12+
13+
type Route struct {
14+
Name string
15+
Path string
16+
Middlewares []Middleware
17+
HandlerFunction http.HandlerFunc
18+
Method string
19+
}
20+
21+
type Middleware struct {
22+
Function func(http.HandlerFunc) http.HandlerFunc
23+
}
24+
25+
// Initialize - Returns a fully qualified mux router
26+
func Initialize(routes []Route) *ddTracerMux.Router {
27+
router := ddTracerMux.NewRouter()
28+
29+
router.HandleFunc(config.GetAppHealthCheckAPIPath(), baseResponseHeaderMiddleware(handlers.Ping)).Methods(http.MethodGet)
30+
router.NotFoundHandler = baseResponseHeaderMiddleware(handlers.RouteNotFoundHandler)
31+
32+
for _, route := range routes {
33+
composedHandlerFunc := attachMiddlewares(route.Middlewares, route.HandlerFunction)
34+
router.HandleFunc(route.Path, baseResponseHeaderMiddleware(composedHandlerFunc)).Methods(route.Method)
35+
}
36+
37+
return router
38+
}
39+
40+
func attachMiddlewares(middlewares []Middleware, handlerFunc http.HandlerFunc) http.HandlerFunc {
41+
if middlewares == nil || len(middlewares) < 1 {
42+
return handlerFunc
43+
}
44+
composedHandlerFunc := handlerFunc
45+
for _, middleware := range middlewares {
46+
composedHandlerFunc = attachMiddleware(middleware, composedHandlerFunc)
47+
}
48+
return composedHandlerFunc
49+
}
50+
51+
func attachMiddleware(middleware Middleware, handlerFunc http.HandlerFunc) http.HandlerFunc {
52+
composedHandlerFunc := middleware.Function(handlerFunc)
53+
return composedHandlerFunc
54+
}
55+
56+
func baseResponseHeaderMiddleware(next http.HandlerFunc) http.HandlerFunc {
57+
return func(writer http.ResponseWriter, request *http.Request) {
58+
span, ctx := tracer.StartSpanFromContext(request.Context(), "http.request", tracer.ResourceName(request.URL.Path))
59+
request.WithContext(ctx)
60+
user := request.Header.Get("username")
61+
tracer.SetUser(span, user, tracer.WithUserEmail(user))
62+
writer.Header().Set("Content-Type", "application/json")
63+
next(writer, request)
64+
span.Finish()
65+
}
66+
}

router/web/router_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package web
2+
3+
import (
4+
"net/http"
5+
"testing"
6+
7+
"github.com/isomnath/belvedere/config"
8+
"github.com/isomnath/belvedere/instrumentation"
9+
10+
"github.com/stretchr/testify/suite"
11+
)
12+
13+
type WebRouterTestSuite struct {
14+
suite.Suite
15+
}
16+
17+
func (suite *WebRouterTestSuite) SetupSuite() {
18+
config.LoadBaseConfig()
19+
instrumentation.StartDDTracer()
20+
}
21+
22+
func (suite *WebRouterTestSuite) TearDownSuite() {
23+
instrumentation.StopDDTracer()
24+
}
25+
26+
func MyTestHandlerFunc(rw http.ResponseWriter, r *http.Request) {
27+
rw.Write([]byte(`{"success": true, "data": {"message": "successful"}}`))
28+
}
29+
30+
func (suite *WebRouterTestSuite) TestInitialize() {
31+
routesWithoutMiddleware := []Route{{
32+
Name: "Test Route",
33+
Path: "/test_route_1",
34+
Middlewares: nil,
35+
HandlerFunction: MyTestHandlerFunc,
36+
Method: http.MethodGet,
37+
}}
38+
39+
routesWithMiddleware := []Route{{
40+
Name: "Test Route",
41+
Path: "/test_route_2",
42+
Middlewares: []Middleware{{Function: myTestMiddlewareFuncOne}, {Function: myTestMiddlewareFuncTwo}},
43+
HandlerFunction: MyTestHandlerFunc,
44+
Method: http.MethodPut,
45+
}}
46+
47+
suite.NotNil(Initialize(routesWithoutMiddleware))
48+
suite.NotNil(Initialize(routesWithMiddleware))
49+
50+
}
51+
52+
func myTestMiddlewareFuncOne(next http.HandlerFunc) http.HandlerFunc {
53+
return func(rw http.ResponseWriter, r *http.Request) {
54+
next(rw, r)
55+
}
56+
}
57+
58+
func myTestMiddlewareFuncTwo(next http.HandlerFunc) http.HandlerFunc {
59+
return func(rw http.ResponseWriter, r *http.Request) {
60+
next(rw, r)
61+
}
62+
}
63+
64+
func TestWebRouterTestSuite(t *testing.T) {
65+
suite.Run(t, new(WebRouterTestSuite))
66+
}

0 commit comments

Comments
 (0)