@@ -2,6 +2,8 @@ package shared
2
2
3
3
import (
4
4
"errors"
5
+ "math"
6
+ "sync"
5
7
6
8
"github.com/AlecAivazis/survey/v2"
7
9
"github.com/cli/go-gh/pkg/api"
@@ -109,30 +111,59 @@ func ListAcceptedAssignments(client api.RESTClient, assignmentID int, page int,
109
111
return acceptedAssignmentList , nil
110
112
}
111
113
114
+ type assignmentList struct {
115
+ assignments []classroom.AcceptedAssignment
116
+ Error error
117
+ }
118
+
112
119
func ListAllAcceptedAssignments (client api.RESTClient , assignmentID int , perPage int ) (classroom.AcceptedAssignmentList , error ) {
113
- var page = 1
114
- response , err := classroom .GetAssignmentList (client , assignmentID , page , perPage )
120
+
121
+ //Calculate the number of go channels to create. We will assign 1 channel per page
122
+ //so we don't put too much pressure on the API all at once
123
+ assignment , err := classroom .GetAssignment (client , assignmentID )
115
124
if err != nil {
116
125
return classroom.AcceptedAssignmentList {}, err
117
126
}
118
-
119
- if len (response ) == 0 {
120
- return classroom.AcceptedAssignmentList {}, nil
121
- }
122
-
123
- //keep calling getAssignmentList until we get them all
124
- var nextList []classroom.AcceptedAssignment
125
- for hasNext := true ; hasNext ; {
126
- page += 1
127
- nextList , err = classroom .GetAssignmentList (client , assignmentID , page , perPage )
128
- if err != nil {
129
- return classroom.AcceptedAssignmentList {}, err
130
- }
131
- hasNext = len (nextList ) > 0
132
- response = append (response , nextList ... )
127
+ numChannels := int (math .Ceil (float64 (assignment .Accepted ) / float64 (perPage )))
128
+
129
+ ch := make (chan assignmentList )
130
+ var wg sync.WaitGroup
131
+ for page := 1 ; page <= numChannels ; page ++ {
132
+ wg .Add (1 )
133
+ go func (pg int ) {
134
+ defer wg .Done ()
135
+ response , err := classroom .GetAssignmentList (client , assignmentID , pg , perPage )
136
+ ch <- assignmentList {
137
+ assignments : response ,
138
+ Error : err ,
139
+ }
140
+ }(page )
141
+ }
142
+
143
+ var mu sync.Mutex
144
+ assignments := make ([]classroom.AcceptedAssignment , 0 , assignment .Accepted )
145
+ var hadErr error = nil
146
+ for page := 1 ; page <= numChannels ; page ++ {
147
+ wg .Add (1 )
148
+ go func () {
149
+ defer wg .Done ()
150
+ result := <- ch
151
+ if result .Error != nil {
152
+ hadErr = result .Error
153
+ } else {
154
+ mu .Lock ()
155
+ assignments = append (assignments , result .assignments ... )
156
+ mu .Unlock ()
157
+ }
158
+ }()
159
+ }
160
+
161
+ wg .Wait ()
162
+ close (ch )
163
+
164
+ if hadErr != nil {
165
+ return classroom.AcceptedAssignmentList {}, err
133
166
}
134
167
135
- acceptedAssignmentList := classroom .NewAcceptedAssignmentList (response )
136
-
137
- return acceptedAssignmentList , nil
168
+ return classroom .NewAcceptedAssignmentList (assignments ), nil
138
169
}
0 commit comments