-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgitlabpaging.go
68 lines (56 loc) · 1.34 KB
/
gitlabpaging.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package main
import (
"fmt"
"github.com/xanzy/go-gitlab"
)
type gitLabPaging struct {
totalItems int
totalPages int
itemsPerPage int
currentPage int
nextPage int
previousPage int
}
func mapToPaging(resp *gitlab.Response) gitLabPaging {
return gitLabPaging{
totalItems: resp.TotalItems,
totalPages: resp.TotalPages,
itemsPerPage: resp.ItemsPerPage,
currentPage: resp.CurrentPage,
nextPage: resp.NextPage,
previousPage: resp.PreviousPage,
}
}
func (p gitLabPaging) next() int {
if p.currentPage >= p.totalPages {
log.Debug().WithInt("page", p.totalPages).Message("Found end of collection.")
return -1
}
log.Debug().
WithInt("currentPage", p.currentPage).
WithInt("nextPage", p.nextPage).
WithInt("totalPages", p.totalPages).
Message("Fetching next page.")
return p.nextPage
}
type getProjects func(int) ([]*gitlab.Project, gitLabPaging, error)
type postProjects func([]*gitlab.Project) string
func importPaginatedProjects(get getProjects, post postProjects) error {
errMessage := ""
page := 0
for page >= 0 {
projects, paging, err := get(page)
if err != nil {
log.Error().WithError(err).Message("Failed to get projects.")
return err
}
if len(projects) > 0 {
errMessage += post(projects)
}
page = paging.next()
}
if errMessage != "" {
return fmt.Errorf(errMessage)
}
return nil
}