fix: update to new api

This commit is contained in:
Максим Слипенко 2024-12-13 15:02:23 +03:00
parent 03610b8d18
commit 4951a290ee

68
main.go
View file

@ -2,6 +2,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json"
"flag" "flag"
"fmt" "fmt"
"io" "io"
@ -15,18 +16,21 @@ import (
type Configuration struct { type Configuration struct {
ServerURL string ServerURL string
Repo string Repo string
TaskID string
Token string Token string
FilePatterns []string FilePatterns []string
Files []string Files []string
} }
type TaskResponse struct {
TaskID int `json:"taskID"`
Status int `json:"status"`
}
func parseFlags() Configuration { func parseFlags() Configuration {
var cfg Configuration var cfg Configuration
flag.StringVar(&cfg.ServerURL, "url", "http://localhost:9999", "Базовый URL сервера загрузки") flag.StringVar(&cfg.ServerURL, "url", "http://localhost:9999", "Базовый URL сервера загрузки")
flag.StringVar(&cfg.Repo, "repo", "", "Название репозитория (обязательно)") flag.StringVar(&cfg.Repo, "repo", "", "Название репозитория (обязательно)")
flag.StringVar(&cfg.TaskID, "task", "", "ID задачи (обязательно)")
flag.StringVar(&cfg.Token, "token", "", "Токен авторизации (обязательно)") flag.StringVar(&cfg.Token, "token", "", "Токен авторизации (обязательно)")
files := flag.String("files", "", "Список путей к файлам или паттернов (разделены запятой) для загрузки (обязательно)") files := flag.String("files", "", "Список путей к файлам или паттернов (разделены запятой) для загрузки (обязательно)")
@ -37,10 +41,6 @@ func parseFlags() Configuration {
fmt.Println("Ошибка: -repo является обязательным") fmt.Println("Ошибка: -repo является обязательным")
missing = true missing = true
} }
if cfg.TaskID == "" {
fmt.Println("Ошибка: -task является обязательным")
missing = true
}
if cfg.Token == "" { if cfg.Token == "" {
fmt.Println("Ошибка: -token является обязательным") fmt.Println("Ошибка: -token является обязательным")
missing = true missing = true
@ -104,7 +104,7 @@ func unique(input []string) []string {
return result return result
} }
func createMultipartRequest(url string, files []string, token string) (*http.Request, error) { func createMultipartRequest(url string, files []string, token string, repo string) (*http.Request, error) {
var buf bytes.Buffer var buf bytes.Buffer
writer := multipart.NewWriter(&buf) writer := multipart.NewWriter(&buf)
@ -126,7 +126,12 @@ func createMultipartRequest(url string, files []string, token string) (*http.Req
} }
} }
err := writer.Close() err := writer.WriteField("repo", repo)
if err != nil {
return nil, fmt.Errorf("не удалось добавить поле repo: %w", err)
}
err = writer.Close()
if err != nil { if err != nil {
return nil, fmt.Errorf("не удалось закрыть multipart писатель: %w", err) return nil, fmt.Errorf("не удалось закрыть multipart писатель: %w", err)
} }
@ -142,10 +147,41 @@ func createMultipartRequest(url string, files []string, token string) (*http.Req
return req, nil return req, nil
} }
func uploadFiles(cfg Configuration) error { func createTask(cfg Configuration) (int, error) {
uploadURL := fmt.Sprintf("%s/upload/%s/task/%s", strings.TrimRight(cfg.ServerURL, "/"), cfg.Repo, cfg.TaskID) taskURL := fmt.Sprintf("%s/tasks", strings.TrimRight(cfg.ServerURL, "/"))
requestBody, err := json.Marshal(map[string]string{
"Repo": cfg.Repo,
})
if err != nil {
return 0, fmt.Errorf("не удалось создать тело запроса: %w", err)
}
req, err := createMultipartRequest(uploadURL, cfg.Files, cfg.Token) req, err := http.NewRequest("POST", taskURL, bytes.NewReader(requestBody))
if err != nil {
return 0, fmt.Errorf("не удалось создать HTTP-запрос: %w", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+cfg.Token)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return 0, fmt.Errorf("не удалось выполнить HTTP-запрос: %w", err)
}
defer resp.Body.Close()
var taskResp TaskResponse
err = json.NewDecoder(resp.Body).Decode(&taskResp)
if err != nil {
return 0, fmt.Errorf("не удалось декодировать ответ: %w", err)
}
return taskResp.TaskID, nil
}
func uploadFiles(cfg Configuration, taskID int) error {
uploadURL := fmt.Sprintf("%s/tasks/%d/upload", strings.TrimRight(cfg.ServerURL, "/"), taskID)
req, err := createMultipartRequest(uploadURL, cfg.Files, cfg.Token, cfg.Repo)
if err != nil { if err != nil {
return fmt.Errorf("не удалось создать multipart-запрос: %w", err) return fmt.Errorf("не удалось создать multipart-запрос: %w", err)
} }
@ -162,22 +198,16 @@ func uploadFiles(cfg Configuration) error {
return fmt.Errorf("не удалось прочитать тело ответа: %w", err) return fmt.Errorf("не удалось прочитать тело ответа: %w", err)
} }
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("загрузка не удалась с кодом %d: %s", resp.StatusCode, string(respBody))
}
fmt.Println("Загрузка успешна:")
fmt.Println(string(respBody)) fmt.Println(string(respBody))
return nil return nil
} }
func main() { func main() {
cfg := parseFlags() cfg := parseFlags()
taskID, err := createTask(cfg)
err := uploadFiles(cfg)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err) fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1) os.Exit(1)
} }
uploadFiles(cfg, taskID)
} }