* 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 reviewtags/v1.21.12.1
| @@ -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. | |||
| @@ -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) | |||
| @@ -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" | |||
| @@ -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" | |||
| @@ -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 | |||
| } | |||
| @@ -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" | |||
| @@ -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 { | |||
| @@ -1561,6 +1561,12 @@ | |||
| "name": "ref", | |||
| "in": "path", | |||
| "required": true | |||
| }, | |||
| { | |||
| "type": "integer", | |||
| "description": "page number of results", | |||
| "name": "page", | |||
| "in": "query" | |||
| } | |||
| ], | |||
| "responses": { | |||
| @@ -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": { | |||