mirror of
https://github.com/go-gitea/gitea
synced 2025-07-23 02:38:35 +00:00
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 (39eb82446c/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>
This commit is contained in:
@@ -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 {
|
||||
|
@@ -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 {
|
||||
|
@@ -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,
|
||||
})
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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).
|
||||
|
Reference in New Issue
Block a user