Skip to content

Commit 3ba4b6b

Browse files
motatoesclaude
andauthored
fix: add pagination to GetUserTeams for teams and members (#2545)
The GetUserTeams function was missing pagination, causing it to only return teams from the first page of results (max 30 items). This led to users not seeing all their team memberships in approval_teams. Changes: - Add pagination for ListTeams with PerPage: 100 - Add pagination for ListTeamMembersBySlug with PerPage: 100 - Add proper error logging for team member fetch failures Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent c5b1f46 commit 3ba4b6b

File tree

1 file changed

+40
-10
lines changed

1 file changed

+40
-10
lines changed

libs/ci/github/github.go

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,49 @@ type GithubService struct {
4444
}
4545

4646
func (svc GithubService) GetUserTeams(organisation string, user string) ([]string, error) {
47-
teamsResponse, _, err := svc.Client.Teams.ListTeams(context.Background(), organisation, nil)
48-
if err != nil {
49-
return nil, fmt.Errorf("failed to list github teams: %v", err)
50-
}
5147
var teams []string
52-
for _, team := range teamsResponse {
53-
teamMembers, _, _ := svc.Client.Teams.ListTeamMembersBySlug(context.Background(), organisation, *team.Slug, nil)
54-
for _, member := range teamMembers {
55-
if *member.Login == user {
56-
teams = append(teams, *team.Name)
57-
break
48+
49+
// Paginate through all teams
50+
opts := &github.ListOptions{PerPage: 100}
51+
for {
52+
teamsResponse, resp, err := svc.Client.Teams.ListTeams(context.Background(), organisation, opts)
53+
if err != nil {
54+
return nil, fmt.Errorf("failed to list github teams: %v", err)
55+
}
56+
57+
for _, team := range teamsResponse {
58+
// Paginate through all team members
59+
memberOpts := &github.TeamListTeamMembersOptions{
60+
ListOptions: github.ListOptions{PerPage: 100},
5861
}
62+
memberLoop:
63+
for {
64+
teamMembers, memberResp, err := svc.Client.Teams.ListTeamMembersBySlug(
65+
context.Background(), organisation, *team.Slug, memberOpts)
66+
if err != nil {
67+
// Log error but continue with other teams
68+
slog.Warn("failed to list team members", "team", *team.Slug, "error", err)
69+
break
70+
}
71+
72+
for _, member := range teamMembers {
73+
if *member.Login == user {
74+
teams = append(teams, *team.Name)
75+
break memberLoop // Found user, move to next team
76+
}
77+
}
78+
79+
if memberResp.NextPage == 0 {
80+
break
81+
}
82+
memberOpts.Page = memberResp.NextPage
83+
}
84+
}
85+
86+
if resp.NextPage == 0 {
87+
break
5988
}
89+
opts.Page = resp.NextPage
6090
}
6191

6292
return teams, nil

0 commit comments

Comments
 (0)