diff --git a/serv_golang_rest_api/internal/server/server.go b/serv_golang_rest_api/internal/server/server.go index a71fa8c..ec80177 100644 --- a/serv_golang_rest_api/internal/server/server.go +++ b/serv_golang_rest_api/internal/server/server.go @@ -1,77 +1,101 @@ 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" + "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" + "github.com/go-chi/chi/v5" + "gorm.io/gorm" ) type Server struct { - router *chi.Mux - db *gorm.DB + router *chi.Mux + db *gorm.DB } func New(db *gorm.DB) *Server { - s := &Server{ - router: chi.NewRouter(), - db: db, - } - s.configureRouter() - return s + s := &Server{ + router: chi.NewRouter(), + db: db, + } + s.configureRouter(db) + return s } -func (s *Server) configureRouter() { - // Общие middleware - for _, middleware := range handlers.CommonMiddleware() { - s.router.Use(middleware) - } +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) + // Health check + s.router.Get("/health", s.healthCheck) - // API routes - s.router.Route("/api/v1", func(r chi.Router) { - s.setupUserRoutes(r) - }) + // API routes + s.router.Route("/api/v1", func(r chi.Router) { + s.setupUserRoutes(r, db) + }) } -func (s *Server) setupUserRoutes(r chi.Router) { - userRepo := repository.NewUserRepository(s.db) - userService := service.NewUserService(userRepo) - userHandler := handlers.NewUserHandler(userService) +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} - r.Route("/users", func(r chi.Router) { - r.Get("/", userHandler.GetAllUsers) - r.Post("/", userHandler.CreateUser) - r.Get("/{id}", userHandler.GetUser) - }) + // Публичные маршруты + r.Route("/auth", func(r chi.Router) { + r.Post("/register", authHandler.Register) + r.Post("/login", authHandler.Login) + + // 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) + }) + + }) } 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 - } + // Проверяем соединение с БД + 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 - } + 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, - }) + 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) -} \ No newline at end of file + return http.ListenAndServe(":"+port, s.router) +} diff --git a/serv_golang_rest_api/internal/utils/oauth_utils.go b/serv_golang_rest_api/internal/utils/oauth_utils.go new file mode 100644 index 0000000..205a0be --- /dev/null +++ b/serv_golang_rest_api/internal/utils/oauth_utils.go @@ -0,0 +1,14 @@ +// utils/oauth_utils.go +package utils + +import ( + "crypto/rand" + "fmt" +) + +// GenerateState generates a random state string for OAuth +func GenerateState() string { + b := make([]byte, 16) + rand.Read(b) + return fmt.Sprintf("%x", b) +} \ No newline at end of file