1package gitlab
  2
  3import (
  4	"context"
  5	"time"
  6
  7	"github.com/MichaelMure/git-bug/util/text"
  8	"github.com/xanzy/go-gitlab"
  9)
 10
 11// Issues returns a channel with gitlab project issues, ascending order.
 12func Issues(ctx context.Context, client *gitlab.Client, pid string, since time.Time) <-chan *gitlab.Issue {
 13	out := make(chan *gitlab.Issue)
 14
 15	go func() {
 16		defer close(out)
 17
 18		opts := gitlab.ListProjectIssuesOptions{
 19			UpdatedAfter: &since,
 20			Scope:        gitlab.String("all"),
 21			Sort:         gitlab.String("asc"),
 22		}
 23
 24		for {
 25			issues, resp, err := client.Issues.ListProjectIssues(pid, &opts, gitlab.WithContext(ctx))
 26			if err != nil {
 27				return
 28			}
 29
 30			for _, issue := range issues {
 31				out <- issue
 32			}
 33
 34			if resp.CurrentPage >= resp.TotalPages {
 35				break
 36			}
 37
 38			opts.Page = resp.NextPage
 39		}
 40	}()
 41
 42	return out
 43}
 44
 45// Notes returns a channel with note events
 46func Notes(ctx context.Context, client *gitlab.Client, issue *gitlab.Issue) <-chan Event {
 47	out := make(chan Event)
 48
 49	go func() {
 50		defer close(out)
 51
 52		opts := gitlab.ListIssueNotesOptions{
 53			OrderBy: gitlab.String("created_at"),
 54			Sort:    gitlab.String("asc"),
 55		}
 56
 57		for {
 58			notes, resp, err := client.Notes.ListIssueNotes(issue.ProjectID, issue.IID, &opts, gitlab.WithContext(ctx))
 59
 60			if err != nil {
 61				out <- ErrorEvent{Err: err, Time: time.Now()}
 62			}
 63
 64			for _, note := range notes {
 65				out <- NoteEvent{*note}
 66			}
 67
 68			if resp.CurrentPage >= resp.TotalPages {
 69				break
 70			}
 71
 72			opts.Page = resp.NextPage
 73		}
 74	}()
 75
 76	return out
 77}
 78
 79// LabelEvents returns a channel with label events.
 80func LabelEvents(ctx context.Context, client *gitlab.Client, issue *gitlab.Issue) <-chan Event {
 81	out := make(chan Event)
 82
 83	go func() {
 84		defer close(out)
 85
 86		opts := gitlab.ListLabelEventsOptions{}
 87
 88		for {
 89			events, resp, err := client.ResourceLabelEvents.ListIssueLabelEvents(issue.ProjectID, issue.IID, &opts, gitlab.WithContext(ctx))
 90
 91			if err != nil {
 92				out <- ErrorEvent{Err: err, Time: time.Now()}
 93			}
 94
 95			for _, e := range events {
 96				le := LabelEvent{*e}
 97				le.Label.Name = text.CleanupOneLine(le.Label.Name)
 98				out <- le
 99			}
100
101			if resp.CurrentPage >= resp.TotalPages {
102				break
103			}
104
105			opts.Page = resp.NextPage
106		}
107	}()
108
109	return out
110}
111
112// StateEvents returns a channel with state change events.
113func StateEvents(ctx context.Context, client *gitlab.Client, issue *gitlab.Issue) <-chan Event {
114	out := make(chan Event)
115
116	go func() {
117		defer close(out)
118
119		opts := gitlab.ListStateEventsOptions{}
120
121		for {
122			events, resp, err := client.ResourceStateEvents.ListIssueStateEvents(issue.ProjectID, issue.IID, &opts, gitlab.WithContext(ctx))
123			if err != nil {
124				out <- ErrorEvent{Err: err, Time: time.Now()}
125			}
126
127			for _, e := range events {
128				out <- StateEvent{*e}
129			}
130
131			if resp.CurrentPage >= resp.TotalPages {
132				break
133			}
134
135			opts.Page = resp.NextPage
136		}
137	}()
138
139	return out
140}