aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorqwerty287 <80460567+qwerty287@users.noreply.github.com>2021-12-15 06:39:34 +0100
committerGitHub <noreply@github.com>2021-12-15 13:39:34 +0800
commit9d943bf374e56e4d403303a6a2caafc1c79cdb6f (patch)
tree2ff7a10921f269aff52e6798bc5f76895d87e4fc /models
parent790e6cfeec15e802ce2130c8113b705815016d6c (diff)
downloadgitea-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.go14
-rw-r--r--models/issue.go2
-rw-r--r--models/issue_comment.go2
-rw-r--r--models/issue_reaction.go18
-rw-r--r--models/issue_watch.go14
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).