@@ -2,6 +2,7 @@ package shared
2
2
3
3
import (
4
4
"errors"
5
+ "log"
5
6
"math"
6
7
"sync"
7
8
@@ -97,6 +98,18 @@ func PromptForAssignment(client api.RESTClient, classroomId int) (assignment cla
97
98
return optionMap [answer .Assignment ], nil
98
99
}
99
100
101
+ // Get the total number of accepted assignments and the number of pages necessary to get them all
102
+ // Calculate the number of pages necessary to get all of the assignments with a given perPage
103
+ func NumberOfAcceptedAssignmentsAndPages (client api.RESTClient , assignmentID int , perPage int ) (numPages , totalAccepted int ) {
104
+ assignment , err := classroom .GetAssignment (client , assignmentID )
105
+ if err != nil {
106
+ log .Fatal (err )
107
+ }
108
+ numPages = int (math .Ceil (float64 (assignment .Accepted ) / float64 (perPage )))
109
+ totalAccepted = assignment .Accepted
110
+ return
111
+ }
112
+
100
113
func ListAcceptedAssignments (client api.RESTClient , assignmentID int , page int , perPage int ) (classroom.AcceptedAssignmentList , error ) {
101
114
response , err := classroom .GetAssignmentList (client , assignmentID , page , perPage )
102
115
if err != nil {
@@ -118,17 +131,11 @@ type assignmentList struct {
118
131
119
132
func ListAllAcceptedAssignments (client api.RESTClient , assignmentID int , perPage int ) (classroom.AcceptedAssignmentList , error ) {
120
133
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 )
124
- if err != nil {
125
- return classroom.AcceptedAssignmentList {}, err
126
- }
127
- numChannels := int (math .Ceil (float64 (assignment .Accepted ) / float64 (perPage )))
134
+ numPages , totalAccepted := NumberOfAcceptedAssignmentsAndPages (client , assignmentID , perPage )
128
135
129
136
ch := make (chan assignmentList )
130
137
var wg sync.WaitGroup
131
- for page := 1 ; page <= numChannels ; page ++ {
138
+ for page := 1 ; page <= numPages ; page ++ {
132
139
wg .Add (1 )
133
140
go func (pg int ) {
134
141
defer wg .Done ()
@@ -141,9 +148,9 @@ func ListAllAcceptedAssignments(client api.RESTClient, assignmentID int, perPage
141
148
}
142
149
143
150
var mu sync.Mutex
144
- assignments := make ([]classroom.AcceptedAssignment , 0 , assignment . Accepted )
151
+ assignments := make ([]classroom.AcceptedAssignment , 0 , totalAccepted )
145
152
var hadErr error = nil
146
- for page := 1 ; page <= numChannels ; page ++ {
153
+ for page := 1 ; page <= numPages ; page ++ {
147
154
wg .Add (1 )
148
155
go func () {
149
156
defer wg .Done ()
@@ -162,7 +169,7 @@ func ListAllAcceptedAssignments(client api.RESTClient, assignmentID int, perPage
162
169
close (ch )
163
170
164
171
if hadErr != nil {
165
- return classroom.AcceptedAssignmentList {}, err
172
+ return classroom.AcceptedAssignmentList {}, hadErr
166
173
}
167
174
168
175
return classroom .NewAcceptedAssignmentList (assignments ), nil
0 commit comments