Files
backend/cmd/server/main.go

117 lines
3.6 KiB
Go

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.Get("/me", userHandler.GetMe)
})
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)
}
}