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 }