diff options
author | qwerty287 <80460567+qwerty287@users.noreply.github.com> | 2021-12-15 06:39:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-15 13:39:34 +0800 |
commit | 9d943bf374e56e4d403303a6a2caafc1c79cdb6f (patch) | |
tree | 2ff7a10921f269aff52e6798bc5f76895d87e4fc /routers | |
parent | 790e6cfeec15e802ce2130c8113b705815016d6c (diff) | |
download | gitea-9d943bf374e56e4d403303a6a2caafc1c79cdb6f.tar.gz gitea-9d943bf374e56e4d403303a6a2caafc1c79cdb6f.zip |
Add missing `X-Total-Count` and fix some related bugs (#17968)
* Add missing `X-Total-Count` and fix some related bugs
Adds `X-Total-Count` header to APIs that return a list but doesn't have it yet.
Fixed bugs:
* not returned after reporting error (https://github.com/qwerty287/gitea/blob/39eb82446c6fe5da3d79124e1f701f3795625b69/routers/api/v1/user/star.go#L70)
* crash with index out of bounds, API issue/issueSubscriptions
I also found various endpoints that return lists but do not apply/support pagination yet:
```
/repos/{owner}/{repo}/issues/{index}/labels
/repos/{owner}/{repo}/issues/comments/{id}/reactions
/repos/{owner}/{repo}/branch_protections
/repos/{owner}/{repo}/contents
/repos/{owner}/{repo}/hooks/git
/repos/{owner}/{repo}/issue_templates
/repos/{owner}/{repo}/releases/{id}/assets
/repos/{owner}/{repo}/reviewers
/repos/{owner}/{repo}/teams
/user/emails
/users/{username}/heatmap
```
If this is not expected, an new issue should be opened.
Closes #13043
* fmt
* Update routers/api/v1/repo/issue_subscription.go
Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
* Use FindAndCount
Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
Co-authored-by: 6543 <6543@obermui.de>
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/org/team.go | 1 | ||||
-rw-r--r-- | routers/api/v1/repo/issue_reaction.go | 7 | ||||
-rw-r--r-- | routers/api/v1/repo/issue_subscription.go | 11 | ||||
-rw-r--r-- | routers/api/v1/repo/status.go | 4 | ||||
-rw-r--r-- | routers/api/v1/repo/tree.go | 1 | ||||
-rw-r--r-- | routers/api/v1/repo/wiki.go | 2 | ||||
-rw-r--r-- | routers/api/v1/user/star.go | 3 | ||||
-rw-r--r-- | routers/web/repo/commit.go | 2 | ||||
-rw-r--r-- | routers/web/repo/pull.go | 6 | ||||
-rw-r--r-- | routers/web/repo/view.go | 2 |
10 files changed, 27 insertions, 12 deletions
diff --git a/routers/api/v1/org/team.go b/routers/api/v1/org/team.go index 074d6fd009..d39125b050 100644 --- a/routers/api/v1/org/team.go +++ b/routers/api/v1/org/team.go @@ -509,6 +509,7 @@ func GetTeamRepos(ctx *context.APIContext) { } repos[i] = convert.ToRepo(repo, access) } + ctx.SetTotalCountHeader(int64(team.NumRepos)) ctx.JSON(http.StatusOK, repos) } diff --git a/routers/api/v1/repo/issue_reaction.go b/routers/api/v1/repo/issue_reaction.go index d0ba8dac65..6184ea71f0 100644 --- a/routers/api/v1/repo/issue_reaction.go +++ b/routers/api/v1/repo/issue_reaction.go @@ -67,9 +67,9 @@ func GetIssueCommentReactions(ctx *context.APIContext) { return } - reactions, err := models.FindCommentReactions(comment) + reactions, _, err := models.FindCommentReactions(comment) if err != nil { - ctx.Error(http.StatusInternalServerError, "FindIssueReactions", err) + ctx.Error(http.StatusInternalServerError, "FindCommentReactions", err) return } _, err = reactions.LoadUsers(ctx.Repo.Repository) @@ -285,7 +285,7 @@ func GetIssueReactions(ctx *context.APIContext) { return } - reactions, err := models.FindIssueReactions(issue, utils.GetListOptions(ctx)) + reactions, count, err := models.FindIssueReactions(issue, utils.GetListOptions(ctx)) if err != nil { ctx.Error(http.StatusInternalServerError, "FindIssueReactions", err) return @@ -305,6 +305,7 @@ func GetIssueReactions(ctx *context.APIContext) { }) } + ctx.SetTotalCountHeader(count) ctx.JSON(http.StatusOK, result) } diff --git a/routers/api/v1/repo/issue_subscription.go b/routers/api/v1/repo/issue_subscription.go index ae7661cfab..ff305c4877 100644 --- a/routers/api/v1/repo/issue_subscription.go +++ b/routers/api/v1/repo/issue_subscription.go @@ -279,9 +279,16 @@ func GetIssueSubscribers(ctx *context.APIContext) { return } apiUsers := make([]*api.User, 0, len(users)) - for i := range users { - apiUsers[i] = convert.ToUser(users[i], ctx.User) + for _, v := range users { + apiUsers = append(apiUsers, convert.ToUser(v, ctx.User)) } + count, err := models.CountIssueWatchers(issue.ID) + if err != nil { + ctx.Error(http.StatusInternalServerError, "CountIssueWatchers", err) + return + } + + ctx.SetTotalCountHeader(count) ctx.JSON(http.StatusOK, apiUsers) } diff --git a/routers/api/v1/repo/status.go b/routers/api/v1/repo/status.go index 583b89dd7a..9d0fbbddad 100644 --- a/routers/api/v1/repo/status.go +++ b/routers/api/v1/repo/status.go @@ -253,7 +253,7 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) { repo := ctx.Repo.Repository - statuses, err := models.GetLatestCommitStatus(repo.ID, sha, utils.GetListOptions(ctx)) + statuses, count, err := models.GetLatestCommitStatus(repo.ID, sha, utils.GetListOptions(ctx)) if err != nil { ctx.Error(http.StatusInternalServerError, "GetLatestCommitStatus", fmt.Errorf("GetLatestCommitStatus[%s, %s]: %v", repo.FullName(), sha, err)) return @@ -266,6 +266,6 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) { combiStatus := convert.ToCombinedStatus(statuses, convert.ToRepo(repo, ctx.Repo.AccessMode)) - // TODO: ctx.SetTotalCountHeader(count) + ctx.SetTotalCountHeader(count) ctx.JSON(http.StatusOK, combiStatus) } diff --git a/routers/api/v1/repo/tree.go b/routers/api/v1/repo/tree.go index 2168a311d0..411d87d6c5 100644 --- a/routers/api/v1/repo/tree.go +++ b/routers/api/v1/repo/tree.go @@ -63,6 +63,7 @@ func GetTree(ctx *context.APIContext) { if tree, err := files_service.GetTreeBySHA(ctx.Repo.Repository, sha, ctx.FormInt("page"), ctx.FormInt("per_page"), ctx.FormBool("recursive")); err != nil { ctx.Error(http.StatusBadRequest, "", err.Error()) } else { + ctx.SetTotalCountHeader(int64(tree.TotalCount)) ctx.JSON(http.StatusOK, tree) } } diff --git a/routers/api/v1/repo/wiki.go b/routers/api/v1/repo/wiki.go index f8969067be..bef32f367b 100644 --- a/routers/api/v1/repo/wiki.go +++ b/routers/api/v1/repo/wiki.go @@ -323,6 +323,7 @@ func ListWikiPages(ctx *context.APIContext) { pages = append(pages, convert.ToWikiPageMetaData(wikiName, c, ctx.Repo.Repository)) } + ctx.SetTotalCountHeader(int64(len(entries))) ctx.JSON(http.StatusOK, pages) } @@ -432,6 +433,7 @@ func ListPageRevisions(ctx *context.APIContext) { return } + ctx.SetTotalCountHeader(commitsCount) ctx.JSON(http.StatusOK, convert.ToWikiCommitList(commitsHistory, commitsCount)) } diff --git a/routers/api/v1/user/star.go b/routers/api/v1/user/star.go index 14bc23b1c3..cc527d9213 100644 --- a/routers/api/v1/user/star.go +++ b/routers/api/v1/user/star.go @@ -67,7 +67,10 @@ func GetStarredRepos(ctx *context.APIContext) { repos, err := getStarredRepos(user, private, utils.GetListOptions(ctx)) if err != nil { ctx.Error(http.StatusInternalServerError, "getStarredRepos", err) + return } + + ctx.SetTotalCountHeader(int64(user.NumStars)) ctx.JSON(http.StatusOK, &repos) } diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index 0a51e43cf7..e012bc24d2 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -337,7 +337,7 @@ func Diff(ctx *context.Context) { ctx.Data["Commit"] = commit ctx.Data["Diff"] = diff - statuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, commitID, db.ListOptions{}) + statuses, _, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, commitID, db.ListOptions{}) if err != nil { log.Error("GetLatestCommitStatus: %v", err) } diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 2fcee33a23..f94424870a 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -339,7 +339,7 @@ func PrepareMergedViewPullInfo(ctx *context.Context, issue *models.Issue) *git.C if len(compareInfo.Commits) != 0 { sha := compareInfo.Commits[0].ID.String() - commitStatuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, sha, db.ListOptions{}) + commitStatuses, _, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, sha, db.ListOptions{}) if err != nil { ctx.ServerError("GetLatestCommitStatus", err) return nil @@ -393,7 +393,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *models.Issue) *git.Compare ctx.ServerError(fmt.Sprintf("GetRefCommitID(%s)", pull.GetGitRefName()), err) return nil } - commitStatuses, err := models.GetLatestCommitStatus(repo.ID, sha, db.ListOptions{}) + commitStatuses, _, err := models.GetLatestCommitStatus(repo.ID, sha, db.ListOptions{}) if err != nil { ctx.ServerError("GetLatestCommitStatus", err) return nil @@ -482,7 +482,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *models.Issue) *git.Compare return nil } - commitStatuses, err := models.GetLatestCommitStatus(repo.ID, sha, db.ListOptions{}) + commitStatuses, _, err := models.GetLatestCommitStatus(repo.ID, sha, db.ListOptions{}) if err != nil { ctx.ServerError("GetLatestCommitStatus", err) return nil diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 5e9003b16b..e19fb9bf91 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -790,7 +790,7 @@ func renderDirectoryFiles(ctx *context.Context, timeout time.Duration) git.Entri ctx.Data["LatestCommitUser"] = user_model.ValidateCommitWithEmail(latestCommit) } - statuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, ctx.Repo.Commit.ID.String(), db.ListOptions{}) + statuses, _, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, ctx.Repo.Commit.ID.String(), db.ListOptions{}) if err != nil { log.Error("GetLatestCommitStatus: %v", err) } |