diff options
author | zeripath <art27@cantab.net> | 2019-07-25 11:55:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-25 11:55:06 +0100 |
commit | 734aa965088fb72330f4ad744c187c614cce3d8b (patch) | |
tree | 96c97d3333b54e327a2ff5b6a5549b9567157eff /models | |
parent | 5efd3630bc21d4b0ba6ff492d16d4c7e2814dd1f (diff) | |
download | gitea-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.go | 55 | ||||
-rw-r--r-- | models/commit_status_test.go | 3 |
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) |