jiraclient/client.go

103 lines
2.0 KiB
Go

package jiraclient
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
func NewJiraClient(username, token, domain string) *JiraClient {
client := &http.Client{}
return &JiraClient{
Username: username,
Token: token,
Domain: domain,
Client: client,
}
}
// JiraClient manages communication with Jira Cloud's V2 REST API.
type JiraClient struct {
Username string
Token string
Domain string
Client *http.Client
}
func (c JiraClient) get(url string, queryParams map[string]string) ([]byte, error) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return []byte{}, err
}
req.SetBasicAuth(c.Username, c.Token)
if queryParams != nil {
q := req.URL.Query()
for k, v := range queryParams {
q.Add(k, v)
}
req.URL.RawQuery = q.Encode()
}
resp, err := c.Client.Do(req)
if err != nil {
return []byte{}, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
return body, err
}
func (c JiraClient) GetIssue(keyOrId string) (Issue, error) {
var issue Issue
url := fmt.Sprintf("https://%s.atlassian.net/rest/api/2/issue/%s", c.Domain, keyOrId)
body, err := c.get(url, nil)
if err != nil {
return issue, err
}
err = json.Unmarshal(body, &issue)
return issue, err
}
func (c JiraClient) GetProject(keyOrId string) (Project, error) {
var project Project
url := fmt.Sprintf("https://%s.atlassian.net/rest/api/2/project/%s", c.Domain, keyOrId)
body, err := c.get(url, nil)
if err != nil {
return project, err
}
err = json.Unmarshal(body, &project)
return project, err
}
func (c JiraClient) Search(jql string) ([]Issue, error) {
var issues []Issue
type SearchResponse struct {
Issues []Issue `json:"issues"`
}
searchResponse := SearchResponse{}
url := fmt.Sprintf("https://%s.atlassian.net/rest/api/2/search", c.Domain)
body, err := c.get(url, map[string]string{"jql": jql})
if err != nil {
return issues, err
}
err = json.Unmarshal(body, &searchResponse)
return searchResponse.Issues, err
}