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 /models | |
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 'models')
-rw-r--r-- | models/commit_status.go | 14 | ||||
-rw-r--r-- | models/issue.go | 2 | ||||
-rw-r--r-- | models/issue_comment.go | 2 | ||||
-rw-r--r-- | models/issue_reaction.go | 18 | ||||
-rw-r--r-- | models/issue_watch.go | 14 |
5 files changed, 33 insertions, 17 deletions
diff --git a/models/commit_status.go b/models/commit_status.go index 93b6f93f96..cd7497eed8 100644 --- a/models/commit_status.go +++ b/models/commit_status.go @@ -231,11 +231,11 @@ type CommitStatusIndex struct { } // GetLatestCommitStatus returns all statuses with a unique context for a given commit. -func GetLatestCommitStatus(repoID int64, sha string, listOptions db.ListOptions) ([]*CommitStatus, error) { +func GetLatestCommitStatus(repoID int64, sha string, listOptions db.ListOptions) ([]*CommitStatus, int64, error) { return getLatestCommitStatus(db.GetEngine(db.DefaultContext), repoID, sha, listOptions) } -func getLatestCommitStatus(e db.Engine, repoID int64, sha string, listOptions db.ListOptions) ([]*CommitStatus, error) { +func getLatestCommitStatus(e db.Engine, repoID int64, sha string, listOptions db.ListOptions) ([]*CommitStatus, int64, error) { ids := make([]int64, 0, 10) sess := e.Table(&CommitStatus{}). Where("repo_id = ?", repoID).And("sha = ?", sha). @@ -244,15 +244,15 @@ func getLatestCommitStatus(e db.Engine, repoID int64, sha string, listOptions db sess = db.SetSessionPagination(sess, &listOptions) - err := sess.Find(&ids) + count, err := sess.FindAndCount(&ids) if err != nil { - return nil, err + return nil, count, err } statuses := make([]*CommitStatus, 0, len(ids)) if len(ids) == 0 { - return statuses, nil + return statuses, count, nil } - return statuses, e.In("id", ids).Find(&statuses) + return statuses, count, e.In("id", ids).Find(&statuses) } // FindRepoRecentCommitStatusContexts returns repository's recent commit status contexts @@ -340,7 +340,7 @@ func ParseCommitsWithStatus(oldCommits []*asymkey_model.SignCommit, repo *repo_m commit := &SignCommitWithStatuses{ SignCommit: c, } - statuses, err := GetLatestCommitStatus(repo.ID, commit.ID.String(), db.ListOptions{}) + statuses, _, err := GetLatestCommitStatus(repo.ID, commit.ID.String(), db.ListOptions{}) if err != nil { log.Error("GetLatestCommitStatus: %v", err) } else { diff --git a/models/issue.go b/models/issue.go index d2f06846c2..ea8eb4a9aa 100644 --- a/models/issue.go +++ b/models/issue.go @@ -238,7 +238,7 @@ func (issue *Issue) loadReactions(ctx context.Context) (err error) { return nil } e := db.GetEngine(ctx) - reactions, err := findReactions(e, FindReactionsOptions{ + reactions, _, err := findReactions(e, FindReactionsOptions{ IssueID: issue.ID, }) if err != nil { diff --git a/models/issue_comment.go b/models/issue_comment.go index 754fa3439e..e54d41bf0d 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -593,7 +593,7 @@ func (c *Comment) loadReactions(e db.Engine, repo *repo_model.Repository) (err e if c.Reactions != nil { return nil } - c.Reactions, err = findReactions(e, FindReactionsOptions{ + c.Reactions, _, err = findReactions(e, FindReactionsOptions{ IssueID: c.IssueID, CommentID: c.ID, }) diff --git a/models/issue_reaction.go b/models/issue_reaction.go index 4072733a1c..2e0ab07db7 100644 --- a/models/issue_reaction.go +++ b/models/issue_reaction.go @@ -71,7 +71,7 @@ func (opts *FindReactionsOptions) toConds() builder.Cond { } // FindCommentReactions returns a ReactionList of all reactions from an comment -func FindCommentReactions(comment *Comment) (ReactionList, error) { +func FindCommentReactions(comment *Comment) (ReactionList, int64, error) { return findReactions(db.GetEngine(db.DefaultContext), FindReactionsOptions{ IssueID: comment.IssueID, CommentID: comment.ID, @@ -79,7 +79,7 @@ func FindCommentReactions(comment *Comment) (ReactionList, error) { } // FindIssueReactions returns a ReactionList of all reactions from an issue -func FindIssueReactions(issue *Issue, listOptions db.ListOptions) (ReactionList, error) { +func FindIssueReactions(issue *Issue, listOptions db.ListOptions) (ReactionList, int64, error) { return findReactions(db.GetEngine(db.DefaultContext), FindReactionsOptions{ ListOptions: listOptions, IssueID: issue.ID, @@ -87,20 +87,22 @@ func FindIssueReactions(issue *Issue, listOptions db.ListOptions) (ReactionList, }) } -func findReactions(e db.Engine, opts FindReactionsOptions) ([]*Reaction, error) { - e = e. +func findReactions(e db.Engine, opts FindReactionsOptions) ([]*Reaction, int64, error) { + sess := e. Where(opts.toConds()). In("reaction.`type`", setting.UI.Reactions). Asc("reaction.issue_id", "reaction.comment_id", "reaction.created_unix", "reaction.id") if opts.Page != 0 { - e = db.SetEnginePagination(e, &opts) + sess = db.SetSessionPagination(sess, &opts) reactions := make([]*Reaction, 0, opts.PageSize) - return reactions, e.Find(&reactions) + count, err := sess.FindAndCount(&reactions) + return reactions, count, err } reactions := make([]*Reaction, 0, 10) - return reactions, e.Find(&reactions) + count, err := sess.FindAndCount(&reactions) + return reactions, count, err } func createReaction(e db.Engine, opts *ReactionOptions) (*Reaction, error) { @@ -120,7 +122,7 @@ func createReaction(e db.Engine, opts *ReactionOptions) (*Reaction, error) { findOpts.CommentID = opts.Comment.ID } - existingR, err := findReactions(e, findOpts) + existingR, _, err := findReactions(e, findOpts) if err != nil { return nil, err } diff --git a/models/issue_watch.go b/models/issue_watch.go index 181cd23433..92dc847415 100644 --- a/models/issue_watch.go +++ b/models/issue_watch.go @@ -126,6 +126,20 @@ func getIssueWatchers(e db.Engine, issueID int64, listOptions db.ListOptions) (I return watches, sess.Find(&watches) } +// CountIssueWatchers count watchers/unwatchers of a given issue +func CountIssueWatchers(issueID int64) (int64, error) { + return countIssueWatchers(db.GetEngine(db.DefaultContext), issueID) +} + +func countIssueWatchers(e db.Engine, issueID int64) (int64, error) { + return e. + Where("`issue_watch`.issue_id = ?", issueID). + And("`issue_watch`.is_watching = ?", true). + And("`user`.is_active = ?", true). + And("`user`.prohibit_login = ?", false). + Join("INNER", "`user`", "`user`.id = `issue_watch`.user_id").Count(new(IssueWatch)) +} + func removeIssueWatchersByRepoID(e db.Engine, userID, repoID int64) error { _, err := e. Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", repoID). |