// 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) } // Serve static files (avatars) - ДОБАВЬТЕ ЭТО r.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("/app/uploads")))) // Initialize repositories userRepo := repository.NewUserRepository(db) newsRepo := repository.NewNewsRepository(db) commentRepo := repository.NewCommentRepository(db) // Initialize logger baseLogger := logger.NewWrapper(logger.Get()) // Создаем базовый логгер // Initialize services with logger jwtService := service.NewJWTService(config.JWTSecret) authService := service.NewAuthService(userRepo, jwtService, baseLogger) // Передаем логгер userService := service.NewUserService(userRepo, jwtService, baseLogger) newsService := service.NewNewsService(newsRepo, commentRepo, baseLogger) avatarService := service.NewAvatarService(userRepo, baseLogger) // Initialize handlers healthHandler := handlers.NewHealthHandler() authHandler := handlers.NewAuthHandler(authService, jwtService) userHandler := handlers.NewUserHandler(&userService) newsHandler := handlers.NewNewsHandler(newsService, baseLogger) avatarHandler := handlers.NewAvatarHandler(avatarService) // Health routes r.Mount("/api", healthHandler.Routes()) // API v1 routes r.Route("/v1", func(r chi.Router) { r.Get("/check", healthHandler.Check) // Public auth routes r.Mount("/auth", authHandler.Routes()) // Protected routes r.Route("/user", func(r chi.Router) { r.Use(middleware.AuthMiddleware(jwtService, userRepo)) r.Use(middleware.RequireAuth) r.Mount("/", userHandler.Routes()) r.Mount("/avatar", avatarHandler.Routes()) // Здесь будут другие защищенные маршруты пользователя }) r.Route("/news", func(r chi.Router) { // Публичные маршруты r.Get("/", newsHandler.GetNews) r.Get("/{id}", newsHandler.GetNewsByID) r.Get("/{id}/comments", newsHandler.GetComments) r.Get("/check", healthHandler.Check) // Защищенные маршруты r.Group(func(r chi.Router) { r.Use(middleware.AuthMiddleware(jwtService, userRepo)) r.Use(middleware.RequireAuth) r.Post("/", newsHandler.CreateNews) r.Put("/{id}", newsHandler.UpdateNews) r.Delete("/{id}", newsHandler.DeleteNews) r.Post("/{id}/comments", newsHandler.CreateComment) r.Delete("/comments/{commentId}", newsHandler.DeleteComment) r.Get("/my/news", newsHandler.GetUserNews) r.Get("/check", healthHandler.Check) }) }) // Здесь будут добавлены другие маршруты: // r.Mount("/events", eventHandler.Routes()) // r.Mount("/reviews", reviewHandler.Routes()) }) // Логируем все зарегистрированные маршруты routeLogger := logger.NewRouteLogger(baseLogger) routeLogger.LogRoutes(r) return r }