github.com/wtfutil/wtf@v0.43.0/modules/gitlab/gitlab_project.go (about)

     1  package gitlab
     2  
     3  import (
     4  	glb "github.com/xanzy/go-gitlab"
     5  )
     6  
     7  type context struct {
     8  	client *glb.Client
     9  	user   *glb.User
    10  }
    11  
    12  func newContext(settings *Settings) (*context, error) {
    13  	baseURL := settings.domain
    14  	gitlabClient, _ := glb.NewClient(settings.apiKey, glb.WithBaseURL(baseURL))
    15  
    16  	user, _, err := gitlabClient.Users.CurrentUser()
    17  
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	ctx := &context{
    23  		client: gitlabClient,
    24  		user:   user,
    25  	}
    26  
    27  	return ctx, nil
    28  }
    29  
    30  type GitlabProject struct {
    31  	context *context
    32  	path    string
    33  
    34  	MergeRequests         []*glb.MergeRequest
    35  	AssignedMergeRequests []*glb.MergeRequest
    36  	AuthoredMergeRequests []*glb.MergeRequest
    37  	AssignedIssues        []*glb.Issue
    38  	AuthoredIssues        []*glb.Issue
    39  	RemoteProject         *glb.Project
    40  }
    41  
    42  func NewGitlabProject(context *context, projectPath string) *GitlabProject {
    43  	project := GitlabProject{
    44  		context: context,
    45  		path:    projectPath,
    46  	}
    47  
    48  	return &project
    49  }
    50  
    51  // Refresh reloads the gitlab data via the Gitlab API
    52  func (project *GitlabProject) Refresh() {
    53  	project.MergeRequests, _ = project.loadMergeRequests()
    54  	project.AssignedMergeRequests, _ = project.loadAssignedMergeRequests()
    55  	project.AuthoredMergeRequests, _ = project.loadAuthoredMergeRequests()
    56  	project.AssignedIssues, _ = project.loadAssignedIssues()
    57  	project.AuthoredIssues, _ = project.loadAuthoredIssues()
    58  	project.RemoteProject, _ = project.loadRemoteProject()
    59  }
    60  
    61  /* -------------------- Counts -------------------- */
    62  
    63  func (project *GitlabProject) IssueCount() int {
    64  	if project.RemoteProject == nil {
    65  		return 0
    66  	}
    67  
    68  	return project.RemoteProject.OpenIssuesCount
    69  }
    70  
    71  func (project *GitlabProject) MergeRequestCount() int {
    72  	return len(project.MergeRequests)
    73  }
    74  
    75  func (project *GitlabProject) StarCount() int {
    76  	if project.RemoteProject == nil {
    77  		return 0
    78  	}
    79  
    80  	return project.RemoteProject.StarCount
    81  }
    82  
    83  /* -------------------- Unexported Functions -------------------- */
    84  
    85  // myMergeRequests returns a list of merge requests
    86  func (project *GitlabProject) myMergeRequests() []*glb.MergeRequest {
    87  	return project.AuthoredMergeRequests
    88  }
    89  
    90  // myAssignedMergeRequests returns a list of merge requests
    91  // assigned
    92  func (project *GitlabProject) myAssignedMergeRequests() []*glb.MergeRequest {
    93  	return project.AssignedMergeRequests
    94  }
    95  
    96  // myAssignedIssues returns a list of issues
    97  func (project *GitlabProject) myAssignedIssues() []*glb.Issue {
    98  	return project.AssignedIssues
    99  }
   100  
   101  // myIssues returns a list of issues
   102  func (project *GitlabProject) myIssues() []*glb.Issue {
   103  	return project.AuthoredIssues
   104  }
   105  
   106  func (project *GitlabProject) loadMergeRequests() ([]*glb.MergeRequest, error) {
   107  	state := "opened"
   108  	opts := glb.ListProjectMergeRequestsOptions{
   109  		State: &state,
   110  	}
   111  
   112  	mrs, _, err := project.context.client.MergeRequests.ListProjectMergeRequests(project.path, &opts)
   113  
   114  	if err != nil {
   115  		return nil, err
   116  	}
   117  
   118  	return mrs, nil
   119  }
   120  
   121  func (project *GitlabProject) loadAssignedMergeRequests() ([]*glb.MergeRequest, error) {
   122  	state := "opened"
   123  	opts := glb.ListProjectMergeRequestsOptions{
   124  		State:      &state,
   125  		AssigneeID: glb.AssigneeID(project.context.user.ID),
   126  	}
   127  
   128  	mrs, _, err := project.context.client.MergeRequests.ListProjectMergeRequests(project.path, &opts)
   129  
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  
   134  	return mrs, nil
   135  }
   136  
   137  func (project *GitlabProject) loadAuthoredMergeRequests() ([]*glb.MergeRequest, error) {
   138  	state := "opened"
   139  	opts := glb.ListProjectMergeRequestsOptions{
   140  		State:    &state,
   141  		AuthorID: &project.context.user.ID,
   142  	}
   143  
   144  	mrs, _, err := project.context.client.MergeRequests.ListProjectMergeRequests(project.path, &opts)
   145  
   146  	if err != nil {
   147  		return nil, err
   148  	}
   149  
   150  	return mrs, nil
   151  }
   152  
   153  func (project *GitlabProject) loadAssignedIssues() ([]*glb.Issue, error) {
   154  	state := "opened"
   155  	opts := glb.ListProjectIssuesOptions{
   156  		State:      &state,
   157  		AssigneeID: glb.AssigneeID(project.context.user.ID),
   158  	}
   159  
   160  	issues, _, err := project.context.client.Issues.ListProjectIssues(project.path, &opts)
   161  
   162  	if err != nil {
   163  		return nil, err
   164  	}
   165  
   166  	return issues, nil
   167  }
   168  
   169  func (project *GitlabProject) loadAuthoredIssues() ([]*glb.Issue, interface{}) {
   170  	state := "opened"
   171  	opts := glb.ListProjectIssuesOptions{
   172  		State:    &state,
   173  		AuthorID: &project.context.user.ID,
   174  	}
   175  
   176  	issues, _, err := project.context.client.Issues.ListProjectIssues(project.path, &opts)
   177  
   178  	if err != nil {
   179  		return nil, err
   180  	}
   181  
   182  	return issues, nil
   183  }
   184  
   185  func (project *GitlabProject) loadRemoteProject() (*glb.Project, error) {
   186  	projectsitory, _, err := project.context.client.Projects.GetProject(project.path, nil)
   187  
   188  	if err != nil {
   189  		return nil, err
   190  	}
   191  
   192  	return projectsitory, nil
   193  }