summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2019-07-25 11:55:06 +0100
committerGitHub <noreply@github.com>2019-07-25 11:55:06 +0100
commit734aa965088fb72330f4ad744c187c614cce3d8b (patch)
tree96c97d3333b54e327a2ff5b6a5549b9567157eff /models
parent5efd3630bc21d4b0ba6ff492d16d4c7e2814dd1f (diff)
downloadgitea-734aa965088fb72330f4ad744c187c614cce3d8b.tar.gz
gitea-734aa965088fb72330f4ad744c187c614cce3d8b.zip
Fix #7136: Add paging and extend API GetCommitStatuses (#7141)
* Fix #7136: Add paging and extend API GetCommitStatuses * update swagger * Update routers/api/v1/repo/status.go Co-Authored-By: techknowlogick <matti@mdranta.net> * Update routers/api/v1/repo/status.go Co-Authored-By: techknowlogick <matti@mdranta.net> * Update routers/api/v1/repo/status.go Co-Authored-By: techknowlogick <matti@mdranta.net> * Apply suggestions from code review
Diffstat (limited to 'models')
-rw-r--r--models/commit_status.go55
-rw-r--r--models/commit_status_test.go3
2 files changed, 54 insertions, 4 deletions
diff --git a/models/commit_status.go b/models/commit_status.go
index 74a2756303..ecd319c5fe 100644
--- a/models/commit_status.go
+++ b/models/commit_status.go
@@ -14,6 +14,8 @@ import (
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
+
+ "github.com/go-xorm/xorm"
)
// CommitStatusState holds the state of a Status
@@ -132,10 +134,57 @@ func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
return lastStatus
}
+// CommitStatusOptions holds the options for query commit statuses
+type CommitStatusOptions struct {
+ Page int
+ State string
+ SortType string
+}
+
// GetCommitStatuses returns all statuses for a given commit.
-func GetCommitStatuses(repo *Repository, sha string, page int) ([]*CommitStatus, error) {
- statuses := make([]*CommitStatus, 0, 10)
- return statuses, x.Limit(10, page*10).Where("repo_id = ?", repo.ID).And("sha = ?", sha).Find(&statuses)
+func GetCommitStatuses(repo *Repository, sha string, opts *CommitStatusOptions) ([]*CommitStatus, int64, error) {
+ if opts.Page <= 0 {
+ opts.Page = 1
+ }
+
+ countSession := listCommitStatusesStatement(repo, sha, opts)
+ maxResults, err := countSession.Count(new(CommitStatus))
+ if err != nil {
+ log.Error("Count PRs: %v", err)
+ return nil, maxResults, err
+ }
+
+ statuses := make([]*CommitStatus, 0, ItemsPerPage)
+ findSession := listCommitStatusesStatement(repo, sha, opts)
+ sortCommitStatusesSession(findSession, opts.SortType)
+ findSession.Limit(ItemsPerPage, (opts.Page-1)*ItemsPerPage)
+ return statuses, maxResults, findSession.Find(&statuses)
+}
+
+func listCommitStatusesStatement(repo *Repository, sha string, opts *CommitStatusOptions) *xorm.Session {
+ sess := x.Where("repo_id = ?", repo.ID).And("sha = ?", sha)
+ switch opts.State {
+ case "pending", "success", "error", "failure", "warning":
+ sess.And("state = ?", opts.State)
+ }
+ return sess
+}
+
+func sortCommitStatusesSession(sess *xorm.Session, sortType string) {
+ switch sortType {
+ case "oldest":
+ sess.Asc("created_unix")
+ case "recentupdate":
+ sess.Desc("updated_unix")
+ case "leastupdate":
+ sess.Asc("updated_unix")
+ case "leastindex":
+ sess.Desc("index")
+ case "highestindex":
+ sess.Asc("index")
+ default:
+ sess.Desc("created_unix")
+ }
}
// GetLatestCommitStatus returns all statuses with a unique context for a given commit.
diff --git a/models/commit_status_test.go b/models/commit_status_test.go
index 78d2370f9d..580db127f6 100644
--- a/models/commit_status_test.go
+++ b/models/commit_status_test.go
@@ -17,8 +17,9 @@ func TestGetCommitStatuses(t *testing.T) {
sha1 := "1234123412341234123412341234123412341234"
- statuses, err := GetCommitStatuses(repo1, sha1, 0)
+ statuses, maxResults, err := GetCommitStatuses(repo1, sha1, &CommitStatusOptions{})
assert.NoError(t, err)
+ assert.Equal(t, int(maxResults), 5)
if assert.Len(t, statuses, 5) {
assert.Equal(t, statuses[0].Context, "ci/awesomeness")
assert.Equal(t, statuses[0].State, CommitStatusPending)