1package gitlab
2
3import (
4	glb "github.com/xanzy/go-gitlab"
5)
6
7type GitlabProject struct {
8	gitlab *glb.Client
9	Path   string
10
11	MergeRequests []*glb.MergeRequest
12	RemoteProject *glb.Project
13}
14
15func NewGitlabProject(name string, namespace string, gitlab *glb.Client) *GitlabProject {
16	path := namespace + "/" + name
17	project := GitlabProject{
18		gitlab: gitlab,
19		Path:   path,
20	}
21
22	return &project
23}
24
25// Refresh reloads the gitlab data via the Gitlab API
26func (project *GitlabProject) Refresh() {
27	project.MergeRequests, _ = project.loadMergeRequests()
28	project.RemoteProject, _ = project.loadRemoteProject()
29}
30
31/* -------------------- Counts -------------------- */
32
33func (project *GitlabProject) IssueCount() int {
34	if project.RemoteProject == nil {
35		return 0
36	}
37
38	return project.RemoteProject.OpenIssuesCount
39}
40
41func (project *GitlabProject) MergeRequestCount() int {
42	return len(project.MergeRequests)
43}
44
45func (project *GitlabProject) StarCount() int {
46	if project.RemoteProject == nil {
47		return 0
48	}
49
50	return project.RemoteProject.StarCount
51}
52
53/* -------------------- Unexported Functions -------------------- */
54
55// myMergeRequests returns a list of merge requests created by username on this project
56func (project *GitlabProject) myMergeRequests(username string) []*glb.MergeRequest {
57	mrs := []*glb.MergeRequest{}
58
59	for _, mr := range project.MergeRequests {
60		user := mr.Author
61
62		if user.Username == username {
63			mrs = append(mrs, mr)
64		}
65	}
66
67	return mrs
68}
69
70// myApprovalRequests returns a list of merge requests for which username has been
71// requested to approve
72func (project *GitlabProject) myApprovalRequests(username string) []*glb.MergeRequest {
73	mrs := []*glb.MergeRequest{}
74
75	for _, mr := range project.MergeRequests {
76		approvers, _, err := project.gitlab.MergeRequests.GetMergeRequestApprovals(project.Path, mr.IID)
77		if err != nil {
78			continue
79		}
80		for _, approver := range approvers.Approvers {
81			if approver.User.Username == username {
82				mrs = append(mrs, mr)
83			}
84		}
85	}
86
87	return mrs
88}
89
90func (project *GitlabProject) loadMergeRequests() ([]*glb.MergeRequest, error) {
91	state := "opened"
92	opts := glb.ListProjectMergeRequestsOptions{
93		State: &state,
94	}
95
96	mrs, _, err := project.gitlab.MergeRequests.ListProjectMergeRequests(project.Path, &opts)
97
98	if err != nil {
99		return nil, err
100	}
101
102	return mrs, nil
103}
104
105func (project *GitlabProject) loadRemoteProject() (*glb.Project, error) {
106	projectsitory, _, err := project.gitlab.Projects.GetProject(project.Path, nil)
107
108	if err != nil {
109		return nil, err
110	}
111
112	return projectsitory, nil
113}
114