package main import ( "context" "log" "net/http" "os" "gitea.mrixs.me/minecraft-platform/backend/internal/api" "gitea.mrixs.me/minecraft-platform/backend/internal/core" "gitea.mrixs.me/minecraft-platform/backend/internal/database" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" ) func main() { // Инициализируем соединение с БД db := database.Connect() defer db.Close() userRepo := &database.UserRepository{DB: db} serverRepo := &database.ServerRepository{DB: db} serverPoller := &core.ServerPoller{Repo: serverRepo} // Запускаем поллер в фоновой горутине go serverPoller.Start(context.Background()) // Сервисы userService := &core.UserService{Repo: userRepo} authService := &core.AuthService{UserRepo: userRepo} // Новый сервис // Инициализируем сервис профилей, читая путь к ключу и домен из переменных окружения keyPath := os.Getenv("RSA_PRIVATE_KEY_PATH") if keyPath == "" { log.Fatal("RSA_PRIVATE_KEY_PATH environment variable is not set") } domain := os.Getenv("APP_DOMAIN") // Нам нужен домен для генерации URL if domain == "" { log.Fatal("APP_DOMAIN environment variable is not set") } profileService, err := core.NewProfileService(userRepo, keyPath, domain) if err != nil { log.Fatalf("Failed to create profile service: %v", err) } // Хендлеры userHandler := &api.UserHandler{Service: userService} authHandler := &api.AuthHandler{Service: authService} profileHandler := &api.ProfileHandler{Service: profileService} serverHandler := &api.ServerHandler{Repo: serverRepo} // --- Настраиваем роутер --- r := chi.NewRouter() r.Use(middleware.Logger) r.Use(middleware.Recoverer) // --- Публичные роуты --- r.Route("/api", func(r chi.Router) { r.Post("/register", userHandler.Register) r.Post("/login", authHandler.Login) r.Get("/servers", serverHandler.GetServers) }) r.Route("/authserver", func(r chi.Router) { r.Post("/authenticate", authHandler.Authenticate) }) r.Route("/sessionserver/session/minecraft", func(r chi.Router) { r.Post("/join", authHandler.Join) r.Get("/profile/{uuid}", profileHandler.GetProfile) }) // --- Защищенные роуты --- r.Group(func(r chi.Router) { // Применяем нашу middleware ко всем роутам в этой группе r.Use(api.AuthMiddleware) r.Route("/api/user", func(r chi.Router) { r.Post("/skin", profileHandler.UploadSkin) // Здесь будут другие эндпоинты для управления профилем }) }) log.Println("Starting backend server on :8080") if err := http.ListenAndServe(":8080", r); err != nil { log.Fatalf("Failed to start server: %v", err) } }