@@ -187,55 +187,61 @@ type CodespaceEnvironmentConnection struct {
187187 HostPublicKeys []string `json:"hostPublicKeys"`
188188}
189189
190- // ListCodespaces returns a list of codespaces for the user.
191- func ( a * API ) ListCodespaces ( ctx context. Context ) ([] * Codespace , error ) {
192- page := 1
193- per_page := 50
194- codespaces := [] * Codespace { }
190+ // codespacesListResponse is the request body for the `/ user/codespaces` endpoint
191+ type getCodespacesListResponse struct {
192+ Codespaces [] * Codespace `json:"codespaces"`
193+ TotalCount int `json:"total_count"`
194+ }
195195
196- for page := 1 ;; page ++ {
197- req , err := http . NewRequest (
198- http . MethodGet , a . githubAPI + "/user/codespaces" , nil ,
199- )
196+ // ListCodespaces returns a list of codespaces for the user.
197+ func ( a * API ) ListCodespaces ( ctx context. Context ) ( codespaces [] * Codespace , err error ) {
198+ for page := 1 ; ; page ++ {
199+ response , err := a . fetchCodespaces ( ctx , page )
200200 if err != nil {
201- return nil , fmt .Errorf ("error creating request: %w" , err )
201+ return nil , fmt .Errorf ("%w" , err )
202202 }
203- a .setHeaders (req )
204- q := req .URL .Query ()
205- q .Add ("page" , strconv .Itoa (page ))
206- q .Add ("per_page" , strconv .Itoa (per_page ))
207-
208- req .URL .RawQuery = q .Encode ()
209- resp , err := a .do (ctx , req , "/user/codespaces" )
210- if err != nil {
211- return nil , fmt .Errorf ("error making request: %w" , err )
203+ if len (codespaces ) >= response .TotalCount {
204+ break
212205 }
213- defer resp .Body .Close ()
206+ codespaces = append (codespaces , response .Codespaces ... )
207+ }
214208
215- b , err := ioutil .ReadAll (resp .Body )
216- if err != nil {
217- return nil , fmt .Errorf ("error reading response body: %w" , err )
218- }
209+ return codespaces , nil
210+ }
219211
220- if resp .StatusCode != http .StatusOK {
221- return nil , jsonErrorResponse (b )
222- }
212+ func (a * API ) fetchCodespaces (ctx context.Context , page int ) (response * getCodespacesListResponse , err error ) {
213+ per_page := 50
214+ req , err := http .NewRequest (
215+ http .MethodGet , a .githubAPI + "/user/codespaces" , nil ,
216+ )
217+ if err != nil {
218+ return nil , fmt .Errorf ("error creating request: %w" , err )
219+ }
220+ a .setHeaders (req )
221+ q := req .URL .Query ()
222+ q .Add ("page" , strconv .Itoa (page ))
223+ q .Add ("per_page" , strconv .Itoa (per_page ))
223224
224- var response struct {
225- Codespaces [] * Codespace `json:" codespaces"`
226- }
227- if err := json . Unmarshal ( b , & response ); err != nil {
228- return nil , fmt . Errorf ( "error unmarshaling response: %w" , err )
229- }
225+ req . URL . RawQuery = q . Encode ()
226+ resp , err := a . do ( ctx , req , "/user/ codespaces")
227+ if err != nil {
228+ return nil , fmt . Errorf ( "error making request: %w" , err )
229+ }
230+ defer resp . Body . Close ()
230231
231- if len (response .Codespaces ) == 0 {
232- break
233- }
234-
235- codespaces = append (codespaces , response .Codespaces ... )
232+ b , err := ioutil .ReadAll (resp .Body )
233+ if err != nil {
234+ return nil , fmt .Errorf ("error reading response body: %w" , err )
236235 }
237236
238- return codespaces , nil
237+ if resp .StatusCode != http .StatusOK {
238+ return nil , jsonErrorResponse (b )
239+ }
240+
241+ if err := json .Unmarshal (b , & response ); err != nil {
242+ return nil , fmt .Errorf ("error unmarshaling response: %w" , err )
243+ }
244+ return response , nil
239245}
240246
241247// getCodespaceTokenRequest is the request body for the get codespace token endpoint.
0 commit comments