modified: internal/server/server.go

new file:   internal/utils/oauth_utils.go
add utils oauth state generate
This commit is contained in:
2025-09-30 00:32:14 +05:00
parent f7b09e260c
commit c987e3ec19
2 changed files with 90 additions and 52 deletions
+76 -52
View File
@@ -1,77 +1,101 @@
package server package server
import ( import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"serv_golang_rest_api/internal/handlers" "serv_golang_rest_api/internal/handlers"
"serv_golang_rest_api/internal/repository" "serv_golang_rest_api/internal/middleware"
"serv_golang_rest_api/internal/service" "serv_golang_rest_api/internal/repository"
"serv_golang_rest_api/internal/service"
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"gorm.io/gorm" "gorm.io/gorm"
) )
type Server struct { type Server struct {
router *chi.Mux router *chi.Mux
db *gorm.DB db *gorm.DB
} }
func New(db *gorm.DB) *Server { func New(db *gorm.DB) *Server {
s := &Server{ s := &Server{
router: chi.NewRouter(), router: chi.NewRouter(),
db: db, db: db,
} }
s.configureRouter() s.configureRouter(db)
return s return s
} }
func (s *Server) configureRouter() { func (s *Server) configureRouter(db *gorm.DB) {
// Общие middleware // Общие middleware
for _, middleware := range handlers.CommonMiddleware() { for _, middleware := range handlers.CommonMiddleware() {
s.router.Use(middleware) s.router.Use(middleware)
} }
// Health check // Health check
s.router.Get("/health", s.healthCheck) s.router.Get("/health", s.healthCheck)
// API routes // API routes
s.router.Route("/api/v1", func(r chi.Router) { s.router.Route("/api/v1", func(r chi.Router) {
s.setupUserRoutes(r) s.setupUserRoutes(r, db)
}) })
} }
func (s *Server) setupUserRoutes(r chi.Router) { func (s *Server) setupUserRoutes(r chi.Router, db *gorm.DB) {
userRepo := repository.NewUserRepository(s.db) userRepo := repository.NewUserRepository(s.db)
userService := service.NewUserService(userRepo) userService := service.NewUserService(userRepo)
userHandler := handlers.NewUserHandler(userService) 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.Route("/auth", func(r chi.Router) {
r.Post("/", userHandler.CreateUser) r.Post("/register", authHandler.Register)
r.Get("/{id}", userHandler.GetUser) 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) { func (s *Server) healthCheck(w http.ResponseWriter, r *http.Request) {
// Проверяем соединение с БД // Проверяем соединение с БД
sqlDB, err := s.db.DB() sqlDB, err := s.db.DB()
if err != nil { if err != nil {
http.Error(w, "Database connection error", http.StatusServiceUnavailable) http.Error(w, "Database connection error", http.StatusServiceUnavailable)
return return
} }
if err := sqlDB.Ping(); err != nil { if err := sqlDB.Ping(); err != nil {
http.Error(w, "Database ping failed", http.StatusServiceUnavailable) http.Error(w, "Database ping failed", http.StatusServiceUnavailable)
return return
} }
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{ json.NewEncoder(w).Encode(map[string]string{
"status": "healthy", "status": "healthy",
"timestamp": http.TimeFormat, "timestamp": http.TimeFormat,
}) })
} }
func (s *Server) Run(port string) error { func (s *Server) Run(port string) error {
return http.ListenAndServe(":"+port, s.router) return http.ListenAndServe(":"+port, s.router)
} }
@@ -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)
}