package server import ( "encoding/json" "net/http" "serv_golang_rest_api/internal/handlers" "serv_golang_rest_api/internal/middleware" "serv_golang_rest_api/internal/repository" "serv_golang_rest_api/internal/service" "github.com/go-chi/chi/v5" "gorm.io/gorm" ) type Server struct { router *chi.Mux db *gorm.DB } func New(db *gorm.DB) *Server { s := &Server{ router: chi.NewRouter(), db: db, } s.configureRouter(db) return s } func (s *Server) configureRouter(db *gorm.DB) { // Общие middleware for _, middleware := range handlers.CommonMiddleware() { s.router.Use(middleware) } // Health check s.router.Get("/health", s.healthCheck) // API routes s.router.Route("/v1", func(r chi.Router) { s.router.Get("/check", s.healthCheck) s.setupUserRoutes(r, db) }) } func (s *Server) setupUserRoutes(r chi.Router, db *gorm.DB) { userRepo := repository.NewUserRepository(s.db) userService := service.NewUserService(userRepo) userHandler := handlers.NewUserHandler(userService) authHandler := &handlers.AuthHandler{DB: db} oauthHandler := &handlers.OAuthHandler{DB: db} // Health check r.Get("/health", s.healthCheck) // Публичные маршруты r.Route("/auth", func(r chi.Router) { r.Post("/register", authHandler.Register) r.Post("/login", authHandler.Login) r.Get("/check", s.healthCheck) // OAuth routes r.Get("/google", oauthHandler.GoogleLogin) r.Get("/google/callback", oauthHandler.GoogleCallback) r.Get("/yandex", oauthHandler.YandexLogin) r.Get("/yandex/callback", oauthHandler.YandexCallback) r.Get("/vk", oauthHandler.VKLogin) r.Get("/vk/callback", oauthHandler.VKCallback) }) // Защищенные маршруты r.Route("/api", func(r chi.Router) { r.Use(middleware.AuthMiddleware) r.Route("/users", func(r chi.Router) { r.Get("/", userHandler.GetAllUsers) r.Post("/", userHandler.CreateUser) r.Get("/{id}", userHandler.GetUser) r.Get("/check", s.healthCheck) }) }) } func (s *Server) healthCheck(w http.ResponseWriter, r *http.Request) { // Проверяем соединение с БД sqlDB, err := s.db.DB() if err != nil { http.Error(w, "Database connection error", http.StatusServiceUnavailable) return } if err := sqlDB.Ping(); err != nil { http.Error(w, "Database ping failed", http.StatusServiceUnavailable) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string]string{ "status": "healthy", "timestamp": http.TimeFormat, }) } func (s *Server) Run(port string) error { return http.ListenAndServe(":"+port, s.router) }