feat(modpack): added curseforge import by url

This commit is contained in:
2025-06-19 16:55:45 +03:00
parent 22d54dea63
commit 29e85570f8
3 changed files with 178 additions and 31 deletions

View File

@@ -25,40 +25,14 @@ func (h *ModpackHandler) ImportModpack(w http.ResponseWriter, r *http.Request) {
return
}
// Получаем тип импортера и метод из формы
importerType := r.FormValue("importerType")
importMethod := r.FormValue("importMethod")
// sourceURL := r.FormValue("sourceUrl")
sourceURL := r.FormValue("sourceUrl")
// --- Получаем zip-файл ---
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()
var tempZipPath string
var err error
if importMethod == "file" {
file, _, err := r.FormFile("file")
if err != nil {
http.Error(w, "Invalid file upload", http.StatusBadRequest)
return
}
defer file.Close()
if _, err := io.Copy(tempFile, file); err != nil {
http.Error(w, "Could not save temp file", http.StatusInternalServerError)
return
}
} else if importMethod == "url" {
http.Error(w, "Import by URL is not implemented yet", http.StatusNotImplemented)
return
} else {
http.Error(w, "Invalid import method", http.StatusBadRequest)
return
}
// --- Выбираем и запускаем импортер ---
// --- Выбираем импортер ---
var imp importer.ModpackImporter
storagePath := os.Getenv("MODPACKS_STORAGE_PATH")
@@ -77,7 +51,49 @@ func (h *ModpackHandler) ImportModpack(w http.ResponseWriter, r *http.Request) {
return
}
files, err := imp.Import(tempFile.Name())
// --- Получаем zip-файл ---
if importMethod == "file" {
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 tempFile.Close()
defer os.Remove(tempFile.Name())
if _, err := io.Copy(tempFile, file); err != nil {
http.Error(w, "Could not save temp file", http.StatusInternalServerError)
return
}
tempZipPath = tempFile.Name()
} else if importMethod == "url" {
cfImporter, ok := imp.(*importer.CurseForgeImporter)
if !ok {
http.Error(w, "Importer type does not support URL import", http.StatusBadRequest)
return
}
tempZipPath, err = cfImporter.DownloadModpackFromURL(sourceURL)
if err != nil {
http.Error(w, fmt.Sprintf("Failed to download from URL: %v", err), http.StatusInternalServerError)
return
}
defer os.Remove(tempZipPath)
} else {
http.Error(w, "Invalid import method", http.StatusBadRequest)
return
}
// --- Запускаем импорт ---
files, err := imp.Import(tempZipPath)
if err != nil {
http.Error(w, fmt.Sprintf("Import failed: %v", err), http.StatusInternalServerError)
return