Skip to content

Commit 02145cc

Browse files
authored
Updated PR with suggestions
- created a new method to avoid defer pileup issue - removed extra api call at the end of the sequence
1 parent c6dc509 commit 02145cc

File tree

1 file changed

+45
-39
lines changed

1 file changed

+45
-39
lines changed

internal/codespaces/api/api.go

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)