github.com/wtfutil/wtf@v0.43.0/modules/pivotal/client.go (about)

     1  package pivotal
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  	"net/url"
     9  )
    10  
    11  type Resource struct {
    12  	Response interface{}
    13  	Raw      string
    14  }
    15  
    16  type PivotalClient struct {
    17  	token     string
    18  	baseUrl   string
    19  	projectId string
    20  	user      *User
    21  }
    22  
    23  type Error struct {
    24  	Code  string `json:"code"`
    25  	Kind  string `json:"kind"`
    26  	Error string `json:"error"`
    27  }
    28  
    29  func NewPivotalClient(token string, projectId string) *PivotalClient {
    30  	baseUrl := "https://www.pivotaltracker.com/services/v5/"
    31  	if baseUrl == "" {
    32  		baseUrl = "https://www.pivotaltracker.com/services/v5/"
    33  	}
    34  	pivotal := PivotalClient{
    35  		token:     token,
    36  		baseUrl:   baseUrl,
    37  		projectId: projectId,
    38  	}
    39  	pivotal.user, _ = pivotal.getCurrentUser()
    40  	return &pivotal
    41  }
    42  
    43  func (pivotal *PivotalClient) apiv5(resource string) (*Resource, error) {
    44  	trn := &http.Transport{}
    45  	meth := "GET"
    46  	client := &http.Client{
    47  		Transport: trn,
    48  	}
    49  
    50  	apiToken := pivotal.token
    51  	URL := fmt.Sprintf("%s%s", pivotal.baseUrl, resource)
    52  
    53  	req, err := http.NewRequest(meth, URL, http.NoBody)
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  
    58  	req.Header.Add("Content-Type", "application/json")
    59  	req.Header.Add("X-TrackerToken", apiToken)
    60  
    61  	resp, err := client.Do(req)
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  	defer func() { _ = resp.Body.Close() }()
    66  
    67  	data, err := io.ReadAll(resp.Body)
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  
    72  	// check if we received a Pivotal Error response
    73  	Err := Error{}
    74  	err = json.Unmarshal([]byte(string(data)), &Err)
    75  	if err == nil && Err.Error != "" {
    76  		return nil, fmt.Errorf(Err.Error)
    77  	}
    78  
    79  	return &Resource{Response: &resp, Raw: string(data)}, nil
    80  }
    81  
    82  func (pivotal *PivotalClient) getCurrentUser() (*User, error) {
    83  	resource, err := pivotal.apiv5("me")
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  
    88  	user := User{}
    89  	err = json.Unmarshal([]byte(resource.Raw), &user)
    90  	if err != nil {
    91  		return nil, err
    92  	}
    93  	return &user, nil
    94  }
    95  
    96  func (pivotal *PivotalClient) searchStories(filter string) (*PivotalTrackerResponse, error) {
    97  	fields := ":default,stories(:default,stories(:default,branches,pull_requests))"
    98  	res := fmt.Sprintf("projects/%s/search?fields=%s&query=%s",
    99  		pivotal.projectId,
   100  		fields,
   101  		url.QueryEscape(filter),
   102  	)
   103  	resource, err := pivotal.apiv5(res)
   104  	if err != nil {
   105  		return nil, err
   106  	}
   107  
   108  	var response PivotalTrackerResponse
   109  
   110  	err = json.Unmarshal([]byte(resource.Raw), &response)
   111  	if err != nil {
   112  		return nil, err
   113  	}
   114  
   115  	return &response, nil
   116  }