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  }