github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/sonar/issueService.go (about) 1 package sonar 2 3 import ( 4 "net/http" 5 6 sonargo "github.com/magicsong/sonargo/sonar" 7 "github.com/pkg/errors" 8 ) 9 10 // EndpointIssuesSearch API endpoint for https://sonarcloud.io/web_api/api/issues/search 11 const EndpointIssuesSearch = "issues/search" 12 13 // IssueService ... 14 type IssueService struct { 15 Organization string 16 Project string 17 Branch string 18 PullRequest string 19 apiClient *Requester 20 } 21 22 // SearchIssues ... 23 func (service *IssueService) SearchIssues(options *IssuesSearchOption) (*sonargo.IssuesSearchObject, *http.Response, error) { 24 request, err := service.apiClient.create("GET", EndpointIssuesSearch, options) 25 if err != nil { 26 return nil, nil, err 27 } 28 // use custom HTTP client to send request 29 response, err := service.apiClient.send(request) 30 if err != nil { 31 return nil, nil, err 32 } 33 // reuse response verrification from sonargo 34 err = sonargo.CheckResponse(response) 35 if err != nil { 36 return nil, response, err 37 } 38 // decode JSON response 39 result := new(sonargo.IssuesSearchObject) 40 err = service.apiClient.decode(response, result) 41 if err != nil { 42 return nil, response, err 43 } 44 return result, response, nil 45 } 46 47 func (service *IssueService) getIssueCount(severity issueSeverity) (int, error) { 48 options := &IssuesSearchOption{ 49 ComponentKeys: service.Project, 50 Severities: severity.ToString(), 51 Resolved: "false", 52 Ps: "1", 53 } 54 if len(service.Organization) > 0 { 55 options.Organization = service.Organization 56 } 57 // if PR, ignore branch name and consider PR branch name. If not PR, consider branch name 58 if len(service.PullRequest) > 0 { 59 options.PullRequest = service.PullRequest 60 } else if len(service.Branch) > 0 { 61 options.Branch = service.Branch 62 } 63 result, _, err := service.SearchIssues(options) 64 if err != nil { 65 return -1, errors.Wrapf(err, "failed to fetch the numer of '%s' issues", severity) 66 } 67 return result.Total, nil 68 } 69 70 // GetNumberOfBlockerIssues returns the number of issue with BLOCKER severity. 71 func (service *IssueService) GetNumberOfBlockerIssues() (int, error) { 72 return service.getIssueCount(blocker) 73 } 74 75 // GetNumberOfCriticalIssues returns the number of issue with CRITICAL severity. 76 func (service *IssueService) GetNumberOfCriticalIssues() (int, error) { 77 return service.getIssueCount(critical) 78 } 79 80 // GetNumberOfMajorIssues returns the number of issue with MAJOR severity. 81 func (service *IssueService) GetNumberOfMajorIssues() (int, error) { 82 return service.getIssueCount(major) 83 } 84 85 // GetNumberOfMinorIssues returns the number of issue with MINOR severity. 86 func (service *IssueService) GetNumberOfMinorIssues() (int, error) { 87 return service.getIssueCount(minor) 88 } 89 90 // GetNumberOfInfoIssues returns the number of issue with INFO severity. 91 func (service *IssueService) GetNumberOfInfoIssues() (int, error) { 92 return service.getIssueCount(info) 93 } 94 95 // NewIssuesService returns a new instance of a service for the issues API endpoint. 96 func NewIssuesService(host, token, project, organization, branch, pullRequest string, client Sender) *IssueService { 97 return &IssueService{ 98 Organization: organization, 99 Project: project, 100 Branch: branch, 101 PullRequest: pullRequest, 102 apiClient: NewAPIClient(host, token, client), 103 } 104 }