// routes/routes.go package routes import ( "net/http" "github.com/go-chi/chi/v5" "gorm.io/gorm" "api_bb/internal/config" "api_bb/internal/handlers" "api_bb/internal/repository" "api_bb/internal/service" "api_bb/pkg/logger" "api_bb/pkg/middleware" ) func SetupRouter(db *gorm.DB, config *config.Config) http.Handler { r := chi.NewRouter() // Apply common middleware for _, m := range middleware.CommonMiddleware() { r.Use(m) } // handler allHandler := handlers.NewHandler(db, config) // Serve static files (avatars) - ДОБАВЬТЕ ЭТО r.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads")))) // Initialize repositories userRepo := repository.NewUserRepository(db) // Initialize logger baseLogger := logger.NewWrapper(logger.Get()) // Создаем базовый логгер // Initialize services with logger jwtService := service.NewJWTService(config.JWTSecret) // Initialize handlers // Health routes r.Mount("/api", allHandler.HealthHandler().Routes()) // API v1 routes r.Route("/v1", func(r chi.Router) { r.Get("/check", allHandler.HealthHandler().Check) // Public auth routes r.Mount("/auth", allHandler.AuthHandler().Routes()) // Protected routes r.Route("/user", func(r chi.Router) { r.Use(middleware.AuthMiddleware(jwtService, userRepo)) r.Use(middleware.RequireAuth) r.Mount("/", allHandler.UserHandler().Routes()) r.Mount("/avatars", allHandler.AvatarHandler().Routes()) // Здесь будут другие защищенные маршруты пользователя }) r.Route("/news", func(r chi.Router) { // Публичные маршруты r.Get("/", allHandler.NewsHandler().GetNews) r.Get("/{id}", allHandler.NewsHandler().GetNewsByID) r.Get("/{id}/comments", allHandler.NewsHandler().GetComments) r.Get("/check", allHandler.HealthHandler().Check) // Защищенные маршруты r.Group(func(r chi.Router) { r.Use(middleware.AuthMiddleware(jwtService, userRepo)) r.Use(middleware.RequireAuth) r.Post("/", allHandler.NewsHandler().CreateNews) r.Put("/{id}", allHandler.NewsHandler().UpdateNews) r.Delete("/{id}", allHandler.NewsHandler().DeleteNews) r.Post("/{id}/comments", allHandler.NewsHandler().CreateComment) r.Delete("/comments/{commentId}", allHandler.NewsHandler().DeleteComment) r.Get("/my/news", allHandler.NewsHandler().GetUserNews) r.Get("/check", allHandler.HealthHandler().Check) }) }) // Здесь будут добавлены другие маршруты: // r.Mount("/events", eventHandler.Routes()) // r.Mount("/reviews", reviewHandler.Routes()) }) // Логируем все зарегистрированные маршруты routeLogger := logger.NewRouteLogger(baseLogger) routeLogger.LogRoutes(r) return r }