forked from gitea/gitea
		
	* 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
This commit is contained in:
		
							parent
							
								
									5efd3630bc
								
							
						
					
					
						commit
						734aa96508
					
				| @ -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": { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 zeripath
						zeripath