forked from forgejo/forgejo
[API] Add pagination to ListBranches (#14524)
* make PaginateUserSlice generic -> PaginateSlice * Add pagination to ListBranches * add skip, limit to Repository.GetBranches() * Move routers/api/v1/utils/utils PaginateSlice -> modules/util/paginate.go * repo_module.GetBranches paginate * fix & rename & more logging * better description Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: a1012112796 <1012112796@qq.com>
This commit is contained in:
parent
c295a27d4a
commit
0d1444751f
20 changed files with 239 additions and 87 deletions
|
@ -13,6 +13,7 @@ import (
|
|||
"code.gitea.io/gitea/modules/context"
|
||||
"code.gitea.io/gitea/modules/convert"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
"code.gitea.io/gitea/modules/web"
|
||||
"code.gitea.io/gitea/routers/api/v1/user"
|
||||
"code.gitea.io/gitea/routers/api/v1/utils"
|
||||
|
@ -28,9 +29,9 @@ func listUserOrgs(ctx *context.APIContext, u *models.User) {
|
|||
ctx.Error(http.StatusInternalServerError, "GetOrgsByUserID", err)
|
||||
return
|
||||
}
|
||||
maxResults := len(orgs)
|
||||
|
||||
orgs = utils.PaginateUserSlice(orgs, listOptions.Page, listOptions.PageSize)
|
||||
maxResults := len(orgs)
|
||||
orgs, _ = util.PaginateSlice(orgs, listOptions.Page, listOptions.PageSize).([]*models.User)
|
||||
|
||||
apiOrgs := make([]*api.Organization, len(orgs))
|
||||
for i := range orgs {
|
||||
|
|
|
@ -17,6 +17,7 @@ import (
|
|||
repo_module "code.gitea.io/gitea/modules/repository"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/modules/web"
|
||||
"code.gitea.io/gitea/routers/api/v1/utils"
|
||||
pull_service "code.gitea.io/gitea/services/pull"
|
||||
repo_service "code.gitea.io/gitea/services/repository"
|
||||
)
|
||||
|
@ -284,11 +285,21 @@ func ListBranches(ctx *context.APIContext) {
|
|||
// description: name of the repo
|
||||
// type: string
|
||||
// required: true
|
||||
// - name: page
|
||||
// in: query
|
||||
// description: page number of results to return (1-based)
|
||||
// type: integer
|
||||
// - name: limit
|
||||
// in: query
|
||||
// description: page size of results
|
||||
// type: integer
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/BranchList"
|
||||
|
||||
branches, err := repo_module.GetBranches(ctx.Repo.Repository)
|
||||
listOptions := utils.GetListOptions(ctx)
|
||||
skip, _ := listOptions.GetStartEnd()
|
||||
branches, totalNumOfBranches, err := repo_module.GetBranches(ctx.Repo.Repository, skip, listOptions.PageSize)
|
||||
if err != nil {
|
||||
ctx.Error(http.StatusInternalServerError, "GetBranches", err)
|
||||
return
|
||||
|
@ -313,6 +324,9 @@ func ListBranches(ctx *context.APIContext) {
|
|||
}
|
||||
}
|
||||
|
||||
ctx.SetLinkHeader(int(totalNumOfBranches), listOptions.PageSize)
|
||||
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", totalNumOfBranches))
|
||||
ctx.Header().Set("Access-Control-Expose-Headers", "X-Total-Count, Link")
|
||||
ctx.JSON(http.StatusOK, &apiBranches)
|
||||
}
|
||||
|
||||
|
|
|
@ -66,22 +66,3 @@ func GetListOptions(ctx *context.APIContext) models.ListOptions {
|
|||
PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")),
|
||||
}
|
||||
}
|
||||
|
||||
// PaginateUserSlice cut a slice of Users as per pagination options
|
||||
// TODO: make it generic
|
||||
func PaginateUserSlice(items []*models.User, page, pageSize int) []*models.User {
|
||||
if page != 0 {
|
||||
page--
|
||||
}
|
||||
|
||||
if page*pageSize >= len(items) {
|
||||
return items[len(items):]
|
||||
}
|
||||
|
||||
items = items[page*pageSize:]
|
||||
|
||||
if len(items) > pageSize {
|
||||
return items[:pageSize]
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue