commit 82b8536397b0c1fe84af1b0ca1aabf33faaabceb from: Oliver Lowe date: Fri Jun 13 06:45:06 2025 UTC jira: implement issue creation commit - 945b3fc34aaeca2019e8045bb23d2c1c5fe62539 commit + 82b8536397b0c1fe84af1b0ca1aabf33faaabceb blob - bf513862428129dca85813e77ec2022e3cdf8478 blob + fb5a932b3fc71fc0b29256b428ffa3c53f47ffad --- jira/http.go +++ jira/http.go @@ -150,75 +150,36 @@ func (c *Client) Comment(ikey, id string) (*Comment, e return &com, nil } +func (c *Client) CreateIssue(issue Issue) (*Issue, error) { + u := *c.APIRoot + u.Path = path.Join(u.Path, "issue") + resp, err := c.postJSON(u.String(), &issue) + if err != nil { + return nil, fmt.Errorf("post json: %w", err) + } + if resp.StatusCode >= http.StatusBadRequest { + return nil, fmt.Errorf("non-ok status: %s", resp.Status) + } + return nil, fmt.Errorf("TODO") +} + func (c *Client) PostComment(issueKey string, body io.Reader) error { b, err := io.ReadAll(body) if err != nil { return fmt.Errorf("read body: %w", err) } cm := Comment{Body: string(b)} - hbody, err := json.Marshal(&cm) - if err != nil { - return fmt.Errorf("to json: %w", err) - } u := fmt.Sprintf("%s/issue/%s/comment", c.APIRoot, issueKey) - req, err := http.NewRequest(http.MethodPost, u, bytes.NewReader(hbody)) + resp, err := c.postJSON(u, &cm) if err != nil { - return err + return fmt.Errorf("post json: %w", err) } - req.Header.Add("Content-Type", "application/json") - resp, err := c.do(req) - if err != nil { - return err - } if resp.StatusCode >= http.StatusBadRequest { return fmt.Errorf("non-ok status: %s", resp.Status) } return nil - } -func Create(APIRoot string, issue Issue) (*Issue, error) { - b, err := json.Marshal(&issue) - if err != nil { - return nil, fmt.Errorf("to json: %w", err) - } - u := APIRoot + "/issue" - resp, err := http.Post(u, "application/json", bytes.NewReader(b)) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("non-ok status %s", resp.Status) - } - var i Issue - if err := json.NewDecoder(resp.Body).Decode(&i); err != nil { - return nil, fmt.Errorf("decode created issue: %w", err) - } - return &i, nil -} - -func CreateComment(APIRoot, issueKey string, body io.Reader) error { - b, err := io.ReadAll(body) - if err != nil { - return fmt.Errorf("read body: %w", err) - } - c := Comment{Body: string(b)} - hbody, err := json.Marshal(&c) - if err != nil { - return fmt.Errorf("to json: %w", err) - } - u := fmt.Sprintf("%s/issue/%s/comment", APIRoot, issueKey) - resp, err := http.Post(u, "application/json", bytes.NewReader(hbody)) - if err != nil { - return err - } - if resp.StatusCode >= http.StatusBadRequest { - return fmt.Errorf("non-ok status: %s", resp.Status) - } - return nil -} - func (c *Client) get(url string) (*http.Response, error) { req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { @@ -227,15 +188,30 @@ func (c *Client) get(url string) (*http.Response, erro return c.do(req) } +func (c *Client) postJSON(url string, v any) (*http.Response, error) { + body, err := json.Marshal(v) + if err != nil { + return nil, err + } + req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + return c.do(req) +} + func (c *Client) do(req *http.Request) (*http.Response, error) { + if c.Debug { + fmt.Fprintln(os.Stderr, req.Method, req.URL) + } + if c.Client == nil { c.Client = http.DefaultClient } + if c.Username != "" && c.Password != "" { req.SetBasicAuth(c.Username, c.Password) } - if c.Debug { - fmt.Fprintln(os.Stderr, req.Method, req.URL) - } return c.Do(req) }