// 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.Route("/api", func(r chi.Router) { r.Get("/health", allHandler.HealthHandler().HealthCheck) r.Get("/check", allHandler.HealthHandler().Check) }) // API v1 routes r.Route("/v1", func(r chi.Router) { // Public auth routes r.Route("/auth", func(r chi.Router) { r.Post("/register", allHandler.AuthHandler().Register) r.Post("/login", allHandler.AuthHandler().Login) r.Post("/logout", allHandler.AuthHandler().Logout) }) // Protected routes r.Route("/user", func(r chi.Router) { r.Use(middleware.AuthMiddleware(jwtService, userRepo)) r.Use(middleware.RequireAuth) // user profile routes r.Get("/profile", allHandler.UserHandler().GetProfile) r.Post("/editProfile", allHandler.UserHandler().UpdateProfile) r.Get("/", allHandler.UserHandler().GetUsers) // Все операции с аватарами теперь через AvatarHandler r.Route("/avatars", func(r chi.Router) { r.Post("/upload", allHandler.AvatarHandler().UploadAvatar) r.Delete("/delete", allHandler.AvatarHandler().DeleteAvatar) r.Get("/{filename}", allHandler.AvatarHandler().GetAvatar) }) // Здесь будут другие защищенные маршруты пользователя }) 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) // News EndPoints r.Post("/", allHandler.NewsHandler().CreateNews) r.Put("/{id}", allHandler.NewsHandler().UpdateNews) r.Delete("/{id}", allHandler.NewsHandler().DeleteNews) r.Get("/my/news", allHandler.NewsHandler().GetUserNews) r.Post("/{id}/comments", allHandler.NewsHandler().CreateComment) r.Delete("/comments/{commentId}", allHandler.NewsHandler().DeleteComment) r.Get("/check", allHandler.HealthHandler().Check) }) }) // Маршруты для отзывов r.Route("/reviews", func(r chi.Router) { // Публичные маршруты r.Get("/", allHandler.ReviewHandler().GetReviews) r.Get("/stats", allHandler.ReviewHandler().GetReviewsStats) r.Get("/{id}", allHandler.ReviewHandler().GetReviewByID) // Защищенные маршруты r.Group(func(r chi.Router) { r.Use(middleware.AuthMiddleware(jwtService, userRepo)) r.Use(middleware.RequireAuth) r.Post("/", allHandler.ReviewHandler().CreateReview) r.Get("/my", allHandler.ReviewHandler().GetMyReviews) r.Put("/{id}", allHandler.ReviewHandler().UpdateReview) r.Delete("/{id}", allHandler.ReviewHandler().DeleteReview) }) }) // Здесь будут добавлены другие маршруты: // r.Mount("/events", eventHandler.Routes()) // r.Mount("/reviews", reviewHandler.Routes()) }) // Логируем все зарегистрированные маршруты routeLogger := logger.NewRouteLogger(baseLogger) routeLogger.LogRoutes(r) return r }