Skip to content

Commit

Permalink
Fix #7136: Add paging and extend API GetCommitStatuses (#7141)
Browse files Browse the repository at this point in the history
* Fix #7136: Add paging and extend API GetCommitStatuses

* update swagger

* Update routers/api/v1/repo/status.go

Co-Authored-By: techknowlogick <[email protected]>

* Update routers/api/v1/repo/status.go

Co-Authored-By: techknowlogick <[email protected]>

* Update routers/api/v1/repo/status.go

Co-Authored-By: techknowlogick <[email protected]>

* Apply suggestions from code review
  • Loading branch information
zeripath authored Jul 25, 2019
1 parent 5efd363 commit 734aa96
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 9 deletions.
55 changes: 52 additions & 3 deletions models/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
3 changes: 2 additions & 1 deletion models/commit_status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
51 changes: 46 additions & 5 deletions routers/api/v1/repo/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,23 @@ func GetCommitStatuses(ctx *context.APIContext) {
// description: sha of the commit
// type: string
// required: true
// - name: page
// in: query
// description: page number of results
// type: integer
// required: false
// - name: sort
// in: query
// description: type of sort
// type: string
// enum: [oldest, recentupdate, leastupdate, leastindex, highestindex]
// required: false
// - name: state
// in: query
// description: type of state
// type: string
// enum: [pending, success, error, failure, warning]
// required: false
// responses:
// "200":
// "$ref": "#/responses/StatusList"
Expand Down Expand Up @@ -118,6 +135,23 @@ func GetCommitStatusesByRef(ctx *context.APIContext) {
// description: name of branch/tag/commit
// type: string
// required: true
// - name: page
// in: query
// description: page number of results
// type: integer
// required: false
// - name: sort
// in: query
// description: type of sort
// type: string
// enum: [oldest, recentupdate, leastupdate, leastindex, highestindex]
// required: false
// - name: state
// in: query
// description: type of state
// type: string
// enum: [pending, success, error, failure, warning]
// required: false
// responses:
// "200":
// "$ref": "#/responses/StatusList"
Expand All @@ -131,11 +165,13 @@ func getCommitStatuses(ctx *context.APIContext, sha string) {
}
repo := ctx.Repo.Repository

page := ctx.ParamsInt("page")

statuses, err := models.GetCommitStatuses(repo, sha, page)
statuses, _, err := models.GetCommitStatuses(repo, sha, &models.CommitStatusOptions{
Page: ctx.QueryInt("page"),
SortType: ctx.QueryTrim("sort"),
State: ctx.QueryTrim("state"),
})
if err != nil {
ctx.Error(500, "GetCommitStatuses", fmt.Errorf("GetCommitStatuses[%s, %s, %d]: %v", repo.FullName(), sha, page, err))
ctx.Error(500, "GetCommitStatuses", fmt.Errorf("GetCommitStatuses[%s, %s, %d]: %v", repo.FullName(), sha, ctx.QueryInt("page"), err))
return
}

Expand Down Expand Up @@ -180,6 +216,11 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
// description: name of branch/tag/commit
// type: string
// required: true
// - name: page
// in: query
// description: page number of results
// type: integer
// required: false
// responses:
// "200":
// "$ref": "#/responses/Status"
Expand All @@ -190,7 +231,7 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
}
repo := ctx.Repo.Repository

page := ctx.ParamsInt("page")
page := ctx.QueryInt("page")

statuses, err := models.GetLatestCommitStatus(repo, sha, page)
if err != nil {
Expand Down
38 changes: 38 additions & 0 deletions templates/swagger/v1_json.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -1561,6 +1561,12 @@
"name": "ref",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "page number of results",
"name": "page",
"in": "query"
}
],
"responses": {
Expand Down Expand Up @@ -5057,6 +5063,38 @@
"name": "sha",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "page number of results",
"name": "page",
"in": "query"
},
{
"enum": [
"oldest",
"recentupdate",
"leastupdate",
"leastindex",
"highestindex"
],
"type": "string",
"description": "type of sort",
"name": "sort",
"in": "query"
},
{
"enum": [
"pending",
"success",
"error",
"failure",
"warning"
],
"type": "string",
"description": "type of state",
"name": "state",
"in": "query"
}
],
"responses": {
Expand Down

0 comments on commit 734aa96

Please sign in to comment.