openreplay/backend/pkg/server/api/router.go

81 lines
1.8 KiB
Go

package api
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"openreplay/backend/internal/config/common"
"openreplay/backend/pkg/logger"
)
type Router interface {
AddHandlers(prefix string, handlers ...Handlers)
Get() http.Handler
}
type endpoint struct {
Permissions []string
TrackName string
}
type routerImpl struct {
log logger.Logger
cfg *common.HTTP
router *mux.Router
endpoints map[string]*endpoint // map[method+path]endpoint
}
func NewRouter(cfg *common.HTTP, log logger.Logger, rateLimiter, authenticator, permissions, tracer RouterMiddleware) (Router, error) {
switch {
case cfg == nil:
return nil, fmt.Errorf("config is empty")
case log == nil:
return nil, fmt.Errorf("logger is empty")
}
e := &routerImpl{
log: log,
cfg: cfg,
router: mux.NewRouter(),
endpoints: make(map[string]*endpoint),
}
e.router.HandleFunc("/", e.health)
// Add all middlewares
e.router.Use(e.healthMiddleware)
e.router.Use(e.corsMiddleware)
if rateLimiter != nil {
e.router.Use(rateLimiter.Middleware)
}
if authenticator != nil {
e.router.Use(authenticator.Middleware)
}
if permissions != nil {
e.router.Use(permissions.Middleware)
}
if tracer != nil {
e.router.Use(tracer.Middleware)
}
return e, nil
}
const NoPrefix = ""
func (e *routerImpl) AddHandlers(prefix string, handlers ...Handlers) {
for _, handlersSet := range handlers {
for _, handler := range handlersSet.GetAll() {
e.router.HandleFunc(handler.Path, handler.Handler).Methods(handler.Method, "OPTIONS")
if prefix != NoPrefix {
e.router.HandleFunc(prefix+handler.Path, handler.Handler).Methods(handler.Method, "OPTIONS")
}
e.endpoints[handler.Method+handler.Path] = &endpoint{
Permissions: handler.Permissions,
TrackName: handler.TrackName,
}
}
}
}
func (e *routerImpl) Get() http.Handler {
return e.router
}