summaryrefslogtreecommitdiffstats
path: root/routers/api
diff options
context:
space:
mode:
authorCirno the Strongest <1447794+CirnoT@users.noreply.github.com>2020-06-13 13:35:59 +0200
committerGitHub <noreply@github.com>2020-06-13 12:35:59 +0100
commit0159851cc3fa80e4df4908a5e760afa20452f712 (patch)
tree8f920c6cb3744939c5c9b9e633749cc5a54ab0ab /routers/api
parent2447ffc74a6e3ab57d98a52de0a7398cadb71e08 (diff)
downloadgitea-0159851cc3fa80e4df4908a5e760afa20452f712.tar.gz
gitea-0159851cc3fa80e4df4908a5e760afa20452f712.zip
Rework api/user/repos for pagination (#11827)
* Add count to `GetUserRepositories` so that pagination can be supported for `/user/{username}/repos` * Rework ListMyRepos to use models.SearchRepository ListMyRepos was an odd one. It first fetched all user repositories and then tried to supplement them with accessible map. The end result was that: * Limit for pagination did not work because accessible repos would always be appended * The amount of pages was incorrect if one were to calculate it * When paginating, all accessible repos would be shown on every page Hopefully it should now work properly. Fixes #11800 and does not require any change on Drone-side as it can properly interpret and act on Link header which we now set. Co-authored-by: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'routers/api')
-rw-r--r--routers/api/v1/user/repo.go54
1 files changed, 33 insertions, 21 deletions
diff --git a/routers/api/v1/user/repo.go b/routers/api/v1/user/repo.go
index 887d606998..519a999a98 100644
--- a/routers/api/v1/user/repo.go
+++ b/routers/api/v1/user/repo.go
@@ -6,6 +6,7 @@ package user
import (
"net/http"
+ "strconv"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
@@ -15,10 +16,12 @@ import (
// listUserRepos - List the repositories owned by the given user.
func listUserRepos(ctx *context.APIContext, u *models.User, private bool) {
- repos, err := models.GetUserRepositories(&models.SearchRepoOptions{
+ opts := utils.GetListOptions(ctx)
+
+ repos, count, err := models.GetUserRepositories(&models.SearchRepoOptions{
Actor: u,
Private: private,
- ListOptions: utils.GetListOptions(ctx),
+ ListOptions: opts,
})
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetUserRepositories", err)
@@ -36,6 +39,9 @@ func listUserRepos(ctx *context.APIContext, u *models.User, private bool) {
apiRepos = append(apiRepos, repos[i].APIFormat(access))
}
}
+
+ ctx.SetLinkHeader(int(count), opts.PageSize)
+ ctx.Header().Set("X-Total-Count", strconv.FormatInt(count, 10))
ctx.JSON(http.StatusOK, &apiRepos)
}
@@ -92,31 +98,37 @@ func ListMyRepos(ctx *context.APIContext) {
// "200":
// "$ref": "#/responses/RepositoryList"
- ownRepos, err := models.GetUserRepositories(&models.SearchRepoOptions{
- Actor: ctx.User,
- Private: true,
- ListOptions: utils.GetListOptions(ctx),
- })
- if err != nil {
- ctx.Error(http.StatusInternalServerError, "GetUserRepositories", err)
- return
+ opts := &models.SearchRepoOptions{
+ ListOptions: utils.GetListOptions(ctx),
+ Actor: ctx.User,
+ OwnerID: ctx.User.ID,
+ Private: ctx.IsSigned,
+ IncludeDescription: true,
}
- accessibleReposMap, err := ctx.User.GetRepositoryAccesses()
+
+ var err error
+ repos, count, err := models.SearchRepository(opts)
if err != nil {
- ctx.Error(http.StatusInternalServerError, "GetRepositoryAccesses", err)
+ ctx.Error(http.StatusInternalServerError, "SearchRepository", err)
return
}
- apiRepos := make([]*api.Repository, len(ownRepos)+len(accessibleReposMap))
- for i := range ownRepos {
- apiRepos[i] = ownRepos[i].APIFormat(models.AccessModeOwner)
- }
- i := len(ownRepos)
- for repo, access := range accessibleReposMap {
- apiRepos[i] = repo.APIFormat(access)
- i++
+ results := make([]*api.Repository, len(repos))
+ for i, repo := range repos {
+ if err = repo.GetOwner(); err != nil {
+ ctx.Error(http.StatusInternalServerError, "GetOwner", err)
+ return
+ }
+ accessMode, err := models.AccessLevel(ctx.User, repo)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "AccessLevel", err)
+ }
+ results[i] = repo.APIFormat(accessMode)
}
- ctx.JSON(http.StatusOK, &apiRepos)
+
+ ctx.SetLinkHeader(int(count), opts.ListOptions.PageSize)
+ ctx.Header().Set("X-Total-Count", strconv.FormatInt(count, 10))
+ ctx.JSON(http.StatusOK, &results)
}
// ListOrgRepos - list the repositories of an organization.