71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
// Path: Backend/internal/httpx/router.go
|
|
|
|
package httpx
|
|
|
|
import (
|
|
"log/slog"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
chimiddleware "github.com/go-chi/chi/v5/middleware"
|
|
|
|
"moku-backend/internal/buildinfo"
|
|
"moku-backend/internal/cache"
|
|
"moku-backend/internal/config"
|
|
"moku-backend/internal/database"
|
|
)
|
|
|
|
type RouterConfig struct {
|
|
ServiceName string
|
|
Config *config.Config
|
|
Logger *slog.Logger
|
|
BuildInfo buildinfo.Info
|
|
Database *database.DB
|
|
Cache *cache.Client
|
|
}
|
|
|
|
type routeRegistrar interface {
|
|
Register(chi.Router)
|
|
}
|
|
|
|
func NewRouter(cfg RouterConfig) http.Handler {
|
|
router := chi.NewRouter()
|
|
|
|
registerMiddleware(router, cfg)
|
|
registerRoutes(router, routesForService(cfg)...)
|
|
router.NotFound(notFoundHandler)
|
|
|
|
return router
|
|
}
|
|
|
|
func registerMiddleware(router chi.Router, cfg RouterConfig) {
|
|
router.Use(chimiddleware.RealIP)
|
|
router.Use(RequestID)
|
|
router.Use(Recoverer(cfg.Logger))
|
|
router.Use(RequestLogger(cfg.Logger))
|
|
}
|
|
|
|
func registerRoutes(router chi.Router, registrars ...routeRegistrar) {
|
|
for _, registrar := range registrars {
|
|
registrar.Register(router)
|
|
}
|
|
}
|
|
|
|
func routesForService(cfg RouterConfig) []routeRegistrar {
|
|
registrars := []routeRegistrar{newSharedRoutes(cfg)}
|
|
|
|
switch strings.ToLower(cfg.ServiceName) {
|
|
case "web":
|
|
registrars = append(registrars, newWebRoutes(cfg))
|
|
case "api":
|
|
registrars = append(registrars, newAPIRoutes(cfg))
|
|
}
|
|
|
|
return registrars
|
|
}
|
|
|
|
func notFoundHandler(w http.ResponseWriter, r *http.Request) {
|
|
WriteError(w, http.StatusNotFound, RequestIDFromContext(r.Context()), "not_found", "The requested endpoint does not exist.")
|
|
}
|