Skip to content

Commit 81324cf

Browse files
CirnoTlafriks
andauthored
Add pagination headers on endpoints that support total count from database (#11145)
* begin work * import fmt * more work * empty commit Co-authored-by: Lauris BH <[email protected]>
1 parent a07cc0d commit 81324cf

File tree

9 files changed

+51
-14
lines changed

9 files changed

+51
-14
lines changed

routers/api/v1/admin/org.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package admin
77

88
import (
9+
"fmt"
910
"net/http"
1011

1112
"code.gitea.io/gitea/models"
@@ -101,10 +102,12 @@ func GetAllOrgs(ctx *context.APIContext) {
101102
// "403":
102103
// "$ref": "#/responses/forbidden"
103104

104-
users, _, err := models.SearchUsers(&models.SearchUserOptions{
105+
listOptions := utils.GetListOptions(ctx)
106+
107+
users, maxResults, err := models.SearchUsers(&models.SearchUserOptions{
105108
Type: models.UserTypeOrganization,
106109
OrderBy: models.SearchOrderByAlphabetically,
107-
ListOptions: utils.GetListOptions(ctx),
110+
ListOptions: listOptions,
108111
Visible: []api.VisibleType{api.VisibleTypePublic, api.VisibleTypeLimited, api.VisibleTypePrivate},
109112
})
110113
if err != nil {
@@ -115,5 +118,8 @@ func GetAllOrgs(ctx *context.APIContext) {
115118
for i := range users {
116119
orgs[i] = convert.ToOrganization(users[i])
117120
}
121+
122+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
123+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
118124
ctx.JSON(http.StatusOK, &orgs)
119125
}

routers/api/v1/admin/user.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,10 +351,12 @@ func GetAllUsers(ctx *context.APIContext) {
351351
// "403":
352352
// "$ref": "#/responses/forbidden"
353353

354-
users, _, err := models.SearchUsers(&models.SearchUserOptions{
354+
listOptions := utils.GetListOptions(ctx)
355+
356+
users, maxResults, err := models.SearchUsers(&models.SearchUserOptions{
355357
Type: models.UserTypeIndividual,
356358
OrderBy: models.SearchOrderByAlphabetically,
357-
ListOptions: utils.GetListOptions(ctx),
359+
ListOptions: listOptions,
358360
})
359361
if err != nil {
360362
ctx.Error(http.StatusInternalServerError, "GetAllUsers", err)
@@ -366,5 +368,7 @@ func GetAllUsers(ctx *context.APIContext) {
366368
results[i] = convert.ToUser(users[i], ctx.IsSigned, ctx.User.IsAdmin)
367369
}
368370

371+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
372+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
369373
ctx.JSON(http.StatusOK, &results)
370374
}

routers/api/v1/org/member.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
// listMembers list an organization's members
2121
func listMembers(ctx *context.APIContext, publicOnly bool) {
2222
var members []*models.User
23+
2324
members, _, err := models.FindOrgMembers(&models.FindOrgMembersOpts{
2425
OrgID: ctx.Org.Organization.ID,
2526
PublicOnly: publicOnly,
@@ -34,6 +35,7 @@ func listMembers(ctx *context.APIContext, publicOnly bool) {
3435
for i, member := range members {
3536
apiMembers[i] = convert.ToUser(member, ctx.IsSigned, ctx.User != nil && ctx.User.IsAdmin)
3637
}
38+
3739
ctx.JSON(http.StatusOK, apiMembers)
3840
}
3941

routers/api/v1/org/org.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org
77

88
import (
9+
"fmt"
910
"net/http"
1011

1112
"code.gitea.io/gitea/models"
@@ -115,8 +116,10 @@ func GetAll(ctx *context.APIContext) {
115116
}
116117
}
117118

118-
publicOrgs, _, err := models.SearchUsers(&models.SearchUserOptions{
119-
ListOptions: utils.GetListOptions(ctx),
119+
listOptions := utils.GetListOptions(ctx)
120+
121+
publicOrgs, maxResults, err := models.SearchUsers(&models.SearchUserOptions{
122+
ListOptions: listOptions,
120123
Type: models.UserTypeOrganization,
121124
OrderBy: models.SearchOrderByAlphabetically,
122125
Visible: vMode,
@@ -130,6 +133,8 @@ func GetAll(ctx *context.APIContext) {
130133
orgs[i] = convert.ToOrganization(publicOrgs[i])
131134
}
132135

136+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
137+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
133138
ctx.JSON(http.StatusOK, &orgs)
134139
}
135140

routers/api/v1/org/team.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org
77

88
import (
9+
"fmt"
910
"net/http"
1011
"strings"
1112

@@ -650,15 +651,17 @@ func SearchTeam(ctx *context.APIContext) {
650651
// items:
651652
// "$ref": "#/definitions/Team"
652653

654+
listOptions := utils.GetListOptions(ctx)
655+
653656
opts := &models.SearchTeamOptions{
654657
UserID: ctx.User.ID,
655658
Keyword: strings.TrimSpace(ctx.Query("q")),
656659
OrgID: ctx.Org.Organization.ID,
657660
IncludeDesc: (ctx.Query("include_desc") == "" || ctx.QueryBool("include_desc")),
658-
ListOptions: utils.GetListOptions(ctx),
661+
ListOptions: listOptions,
659662
}
660663

661-
teams, _, err := models.SearchTeam(opts)
664+
teams, maxResults, err := models.SearchTeam(opts)
662665
if err != nil {
663666
log.Error("SearchTeam failed: %v", err)
664667
ctx.JSON(http.StatusInternalServerError, map[string]interface{}{
@@ -681,6 +684,8 @@ func SearchTeam(ctx *context.APIContext) {
681684
apiTeams[i] = convert.ToTeam(teams[i])
682685
}
683686

687+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
688+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
684689
ctx.JSON(http.StatusOK, map[string]interface{}{
685690
"ok": true,
686691
"data": apiTeams,

routers/api/v1/repo/commits.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,16 @@ func GetAllCommits(ctx *context.APIContext) {
202202
i++
203203
}
204204

205-
ctx.SetLinkHeader(int(commitsCountTotal), listOptions.PageSize)
206-
205+
// kept for backwards compatibility
207206
ctx.Header().Set("X-Page", strconv.Itoa(listOptions.Page))
208207
ctx.Header().Set("X-PerPage", strconv.Itoa(listOptions.PageSize))
209208
ctx.Header().Set("X-Total", strconv.FormatInt(commitsCountTotal, 10))
210209
ctx.Header().Set("X-PageCount", strconv.Itoa(pageCount))
211210
ctx.Header().Set("X-HasMore", strconv.FormatBool(listOptions.Page < pageCount))
212211

212+
ctx.SetLinkHeader(int(commitsCountTotal), listOptions.PageSize)
213+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", commitsCountTotal))
214+
213215
ctx.JSON(http.StatusOK, &apiCommits)
214216
}
215217

routers/api/v1/repo/issue.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ func ListIssues(ctx *context.APIContext) {
322322
}
323323

324324
ctx.SetLinkHeader(ctx.Repo.Repository.NumIssues, listOptions.PageSize)
325+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", ctx.Repo.Repository.NumIssues))
326+
325327
ctx.JSON(http.StatusOK, convert.ToAPIIssueList(issues))
326328
}
327329

routers/api/v1/repo/status.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,10 @@ func getCommitStatuses(ctx *context.APIContext, sha string) {
208208
}
209209
repo := ctx.Repo.Repository
210210

211-
statuses, _, err := models.GetCommitStatuses(repo, sha, &models.CommitStatusOptions{
212-
ListOptions: utils.GetListOptions(ctx),
211+
listOptions := utils.GetListOptions(ctx)
212+
213+
statuses, maxResults, err := models.GetCommitStatuses(repo, sha, &models.CommitStatusOptions{
214+
ListOptions: listOptions,
213215
SortType: ctx.QueryTrim("sort"),
214216
State: ctx.QueryTrim("state"),
215217
})
@@ -223,6 +225,9 @@ func getCommitStatuses(ctx *context.APIContext, sha string) {
223225
apiStatuses = append(apiStatuses, status.APIFormat())
224226
}
225227

228+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
229+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
230+
226231
ctx.JSON(http.StatusOK, apiStatuses)
227232
}
228233

routers/api/v1/user/user.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package user
77

88
import (
9+
"fmt"
910
"net/http"
1011
"strings"
1112

@@ -56,14 +57,16 @@ func Search(ctx *context.APIContext) {
5657
// items:
5758
// "$ref": "#/definitions/User"
5859

60+
listOptions := utils.GetListOptions(ctx)
61+
5962
opts := &models.SearchUserOptions{
6063
Keyword: strings.Trim(ctx.Query("q"), " "),
6164
UID: com.StrTo(ctx.Query("uid")).MustInt64(),
6265
Type: models.UserTypeIndividual,
63-
ListOptions: utils.GetListOptions(ctx),
66+
ListOptions: listOptions,
6467
}
6568

66-
users, _, err := models.SearchUsers(opts)
69+
users, maxResults, err := models.SearchUsers(opts)
6770
if err != nil {
6871
ctx.JSON(http.StatusInternalServerError, map[string]interface{}{
6972
"ok": false,
@@ -77,6 +80,9 @@ func Search(ctx *context.APIContext) {
7780
results[i] = convert.ToUser(users[i], ctx.IsSigned, ctx.User != nil && ctx.User.IsAdmin)
7881
}
7982

83+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
84+
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
85+
8086
ctx.JSON(http.StatusOK, map[string]interface{}{
8187
"ok": true,
8288
"data": results,

0 commit comments

Comments
 (0)