package server import ( "encoding/json" "net/http" "serv_golang_rest_api/internal/handlers" "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() return s } func (s *Server) configureRouter() { // Общие middleware for _, middleware := range handlers.CommonMiddleware() { s.router.Use(middleware) } // Health check s.router.Get("/health", s.healthCheck) // API routes s.router.Route("/api/v1", func(r chi.Router) { s.setupUserRoutes(r) }) } func (s *Server) setupUserRoutes(r chi.Router) { userRepo := repository.NewUserRepository(s.db) userService := service.NewUserService(userRepo) userHandler := handlers.NewUserHandler(userService) r.Route("/users", func(r chi.Router) { r.Get("/", userHandler.GetAllUsers) r.Post("/", userHandler.CreateUser) r.Get("/{id}", userHandler.GetUser) }) } 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) }