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 }