995c49b783
modified: serv_golang_rest_api/internal/server/server.go new file: serv_golang_rest_api/main new file: serv_golang_rest_api/main.exe change menu into main site begushiybashkir
102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
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("/api/v1", func(r chi.Router) {
|
|
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}
|
|
|
|
// Публичные маршруты
|
|
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
|
|
}
|
|
|
|
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)
|
|
}
|