15357fd3c0
yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarba
100 lines
2.5 KiB
Go
100 lines
2.5 KiB
Go
package logger
|
|
|
|
import (
|
|
"net/http"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type RouteLogger struct {
|
|
logger LoggerInterface
|
|
}
|
|
|
|
func NewRouteLogger(log LoggerInterface) *RouteLogger {
|
|
return &RouteLogger{
|
|
logger: log,
|
|
}
|
|
}
|
|
|
|
func (rl *RouteLogger) LogRoutes(router *chi.Mux) {
|
|
routes := rl.extractRoutes(router)
|
|
rl.printFormattedRoutes(routes)
|
|
}
|
|
|
|
func (rl *RouteLogger) extractRoutes(router *chi.Mux) []RouteInfo {
|
|
var routes []RouteInfo
|
|
|
|
walkFunc := func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error {
|
|
if route != "" {
|
|
routes = append(routes, RouteInfo{
|
|
Method: method,
|
|
Path: route,
|
|
})
|
|
}
|
|
return nil
|
|
}
|
|
|
|
if err := chi.Walk(router, walkFunc); err != nil {
|
|
rl.logger.Error("Failed to walk routes", zap.Error(err))
|
|
}
|
|
|
|
return routes
|
|
}
|
|
|
|
func (rl *RouteLogger) printFormattedRoutes(routes []RouteInfo) {
|
|
if len(routes) == 0 {
|
|
rl.logger.Info("No routes found")
|
|
return
|
|
}
|
|
|
|
// Группируем по пути
|
|
routesByPath := make(map[string][]string)
|
|
for _, route := range routes {
|
|
routesByPath[route.Path] = append(routesByPath[route.Path], route.Method)
|
|
}
|
|
|
|
// Сортируем пути
|
|
var paths []string
|
|
for path := range routesByPath {
|
|
paths = append(paths, path)
|
|
}
|
|
sort.Strings(paths)
|
|
|
|
rl.logger.Info("📋 Registered API Routes:")
|
|
rl.logger.Info("┌──────────────────────────────────────────────────────────────┐")
|
|
|
|
for _, path := range paths {
|
|
methods := routesByPath[path]
|
|
sort.Strings(methods)
|
|
methodsStr := strings.Join(methods, ", ")
|
|
|
|
if len(methodsStr) > 12 {
|
|
methodsStr = methodsStr[:9] + "..."
|
|
}
|
|
|
|
methodField := methodsStr
|
|
if len(methodField) < 12 {
|
|
methodField = methodField + strings.Repeat(" ", 12-len(methodField))
|
|
}
|
|
|
|
pathField := path
|
|
if len(pathField) > 45 {
|
|
pathField = pathField[:42] + "..."
|
|
} else {
|
|
pathField = pathField + strings.Repeat(" ", 45-len(pathField))
|
|
}
|
|
|
|
rl.logger.Info("│ " + methodField + " " + pathField + " │")
|
|
}
|
|
|
|
rl.logger.Info("└──────────────────────────────────────────────────────────────┘")
|
|
rl.logger.Info("Total routes registered: %d", zap.Int("count", len(routes)))
|
|
}
|
|
|
|
type RouteInfo struct {
|
|
Method string
|
|
Path string
|
|
} |