diff --git a/main.go b/main.go index 8409a77..0ce2831 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "encoding/json" "flag" "fmt" "io" @@ -15,18 +16,21 @@ import ( type Configuration struct { ServerURL string Repo string - TaskID string Token string FilePatterns []string Files []string } +type TaskResponse struct { + TaskID int `json:"taskID"` + Status int `json:"status"` +} + func parseFlags() Configuration { var cfg Configuration flag.StringVar(&cfg.ServerURL, "url", "http://localhost:9999", "Базовый URL сервера загрузки") flag.StringVar(&cfg.Repo, "repo", "", "Название репозитория (обязательно)") - flag.StringVar(&cfg.TaskID, "task", "", "ID задачи (обязательно)") flag.StringVar(&cfg.Token, "token", "", "Токен авторизации (обязательно)") files := flag.String("files", "", "Список путей к файлам или паттернов (разделены запятой) для загрузки (обязательно)") @@ -37,10 +41,6 @@ func parseFlags() Configuration { fmt.Println("Ошибка: -repo является обязательным") missing = true } - if cfg.TaskID == "" { - fmt.Println("Ошибка: -task является обязательным") - missing = true - } if cfg.Token == "" { fmt.Println("Ошибка: -token является обязательным") missing = true @@ -104,7 +104,7 @@ func unique(input []string) []string { 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 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 { return nil, fmt.Errorf("не удалось закрыть multipart писатель: %w", err) } @@ -142,10 +147,41 @@ func createMultipartRequest(url string, files []string, token string) (*http.Req return req, nil } -func uploadFiles(cfg Configuration) error { - uploadURL := fmt.Sprintf("%s/upload/%s/task/%s", strings.TrimRight(cfg.ServerURL, "/"), cfg.Repo, cfg.TaskID) +func createTask(cfg Configuration) (int, error) { + 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 { return fmt.Errorf("не удалось создать multipart-запрос: %w", err) } @@ -162,22 +198,16 @@ func uploadFiles(cfg Configuration) error { 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)) - return nil } func main() { cfg := parseFlags() - - err := uploadFiles(cfg) + taskID, err := createTask(cfg) if err != nil { fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err) os.Exit(1) } + uploadFiles(cfg, taskID) }