package api import ( "context" "fmt" "io" "net/http" "os" "gitea.mrixs.me/minecraft-platform/backend/internal/core" "gitea.mrixs.me/minecraft-platform/backend/internal/core/importer" "gitea.mrixs.me/minecraft-platform/backend/internal/database" "gitea.mrixs.me/minecraft-platform/backend/internal/models" ) type ModpackHandler struct { ModpackRepo *database.ModpackRepository JanitorService *core.FileJanitorService } // ImportModpack обрабатывает загрузку и импорт модпака. func (h *ModpackHandler) ImportModpack(w http.ResponseWriter, r *http.Request) { if err := r.ParseMultipartForm(512 << 20); err != nil { // 512 MB лимит http.Error(w, "File too large", http.StatusBadRequest) return } file, _, err := r.FormFile("file") if err != nil { http.Error(w, "Invalid file upload", http.StatusBadRequest) return } defer file.Close() tempFile, err := os.CreateTemp("", "modpack-*.zip") if err != nil { http.Error(w, "Could not create temp file", http.StatusInternalServerError) return } defer os.Remove(tempFile.Name()) defer tempFile.Close() _, err = io.Copy(tempFile, file) if err != nil { http.Error(w, "Could not save temp file", http.StatusInternalServerError) return } storagePath := os.Getenv("MODPACKS_STORAGE_PATH") imp := &importer.SimpleZipImporter{StoragePath: storagePath} files, err := imp.Import(tempFile.Name()) if err != nil { http.Error(w, fmt.Sprintf("Import failed: %v", err), http.StatusInternalServerError) return } modpack := &models.Modpack{ Name: r.FormValue("name"), DisplayName: r.FormValue("displayName"), MinecraftVersion: r.FormValue("mcVersion"), } err = h.ModpackRepo.CreateModpackTx(r.Context(), modpack, files) if err != nil { http.Error(w, fmt.Sprintf("Database save failed: %v", err), http.StatusInternalServerError) return } w.WriteHeader(http.StatusCreated) fmt.Fprintf(w, "Modpack '%s' imported successfully with %d files.", modpack.DisplayName, len(files)) // Запускаем очистку в фоне, чтобы не блокировать ответ go h.JanitorService.CleanOrphanedFiles(context.Background()) }