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() { dbPool := database.Connect() defer dbPool.Close() // --- Инициализация репозиториев --- userRepo := &database.UserRepository{DB: dbPool} serverRepo := &database.ServerRepository{DB: dbPool} modpackRepo := &database.ModpackRepository{DB: dbPool} // --- Инициализация сервисов --- userService := &core.UserService{Repo: userRepo} authService := &core.AuthService{UserRepo: userRepo} serverPoller := &core.ServerPoller{Repo: serverRepo} 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") 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) } modpacksStoragePath := os.Getenv("MODPACKS_STORAGE_PATH") if modpacksStoragePath == "" { log.Fatal("MODPACKS_STORAGE_PATH environment variable is not set") } janitorService := core.NewFileJanitorService(modpackRepo, modpacksStoragePath) // --- Запуск фоновых задач --- go serverPoller.Start(context.Background()) // --- Инициализация хендлеров --- userHandler := &api.UserHandler{Service: userService} authHandler := &api.AuthHandler{Service: authService} profileHandler := &api.ProfileHandler{Service: profileService} serverHandler := &api.ServerHandler{Repo: serverRepo} launcherHandler := &api.LauncherHandler{ModpackRepo: modpackRepo} modpackHandler := &api.ModpackHandler{ ModpackRepo: modpackRepo, JanitorService: janitorService, } adminUserHandler := &api.AdminUserHandler{UserRepo: userRepo} // Этот хендлер мы создали для админских функций // --- Настройка роутера --- 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("/launcher", func(r chi.Router) { r.Get("/modpacks/{name}/manifest", launcherHandler.GetModpackManifest) }) }) 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) { r.Use(api.AuthMiddleware) r.Route("/api/user", func(r chi.Router) { r.Post("/skin", profileHandler.UploadSkin) }) r.Route("/api/admin", func(r chi.Router) { r.Use(api.AdminMiddleware) r.Route("/modpacks", func(r chi.Router) { r.Post("/import", modpackHandler.ImportModpack) }) r.Route("/users", func(r chi.Router) { // ИСПРАВЛЕНО: Используем adminUserHandler r.Get("/", adminUserHandler.GetAllUsers) r.Patch("/{id}/role", adminUserHandler.UpdateUserRole) }) }) }) log.Println("Starting backend server on :8080") if err := http.ListenAndServe(":8080", r); err != nil { log.Fatalf("Failed to start server: %v", err) } }