diff --git a/cmd/app/merge_requests.go b/cmd/app/merge_requests.go index a72408db..edb76db4 100644 --- a/cmd/app/merge_requests.go +++ b/cmd/app/merge_requests.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "net/http" + "slices" gitlab "gitlab.com/gitlab-org/api/client-go" ) @@ -35,23 +36,18 @@ func (a mergeRequestListerService) ServeHTTP(w http.ResponseWriter, r *http.Requ payload.Scope = gitlab.Ptr("all") } - payload.PerPage = 100 - var mergeRequests []*gitlab.BasicMergeRequest - for nextPage := int64(1); nextPage != 0; { - payload.Page = nextPage - mrs, res, err := a.client.ListProjectMergeRequests(a.projectInfo.ProjectId, payload) - if err != nil { - handleError(w, err, "Failed to list merge requests", http.StatusInternalServerError) - return - } + payload.ListOptions = gitlab.ListOptions{ + PerPage: 100, + } - if res.StatusCode >= 300 { - handleError(w, GenericError{r.URL.Path}, "Failed to list merge requests", res.StatusCode) - return - } + it, hasErr := gitlab.Scan(func(p gitlab.PaginationOptionFunc) ([]*gitlab.BasicMergeRequest, *gitlab.Response, error) { + return a.client.ListProjectMergeRequests(a.projectInfo.ProjectId, payload, p) + }) + mergeRequests := slices.Collect(it) - mergeRequests = append(mergeRequests, mrs...) - nextPage = res.NextPage + if err := hasErr(); err != nil { + handleError(w, err, "Failed to list merge requests", http.StatusInternalServerError) + return } if len(mergeRequests) == 0 { diff --git a/cmd/app/merge_requests_test.go b/cmd/app/merge_requests_test.go index 1170c6d0..05b9a30d 100644 --- a/cmd/app/merge_requests_test.go +++ b/cmd/app/merge_requests_test.go @@ -56,13 +56,13 @@ func TestMergeRequestHandler(t *testing.T) { t.Run("Handles non-200s from Gitlab client", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/merge_requests", testListMergeRequestsRequest) svc := middleware( - mergeRequestListerService{testProjectData, fakeMergeRequestLister{testBase: testBase{status: http.StatusSeeOther}}}, + mergeRequestListerService{testProjectData, fakeMergeRequestLister{testBase: testBase{errFromGitlab: true}}}, withPayloadValidation(methodToPayload{http.MethodPost: newPayload[gitlab.ListProjectMergeRequestsOptions]}), withMethodCheck(http.MethodPost), ) data, status := getFailData(t, svc, request) - checkNon200(t, data, "Failed to list merge requests", "/merge_requests") - assert(t, status, http.StatusSeeOther) + checkErrorFromGitlab(t, data, "Failed to list merge requests") + assert(t, status, http.StatusInternalServerError) }) t.Run("Should handle not having any merge requests with 404", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/merge_requests", testListMergeRequestsRequest)