Skip to content

Commit 734aa96

Browse files
authored
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 <[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
1 parent 5efd363 commit 734aa96

File tree

4 files changed

+138
-9
lines changed

4 files changed

+138
-9
lines changed

models/commit_status.go

+52-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
"code.gitea.io/gitea/modules/setting"
1515
api "code.gitea.io/gitea/modules/structs"
1616
"code.gitea.io/gitea/modules/util"
17+
18+
"github.com/go-xorm/xorm"
1719
)
1820

1921
// CommitStatusState holds the state of a Status
@@ -132,10 +134,57 @@ func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
132134
return lastStatus
133135
}
134136

137+
// CommitStatusOptions holds the options for query commit statuses
138+
type CommitStatusOptions struct {
139+
Page int
140+
State string
141+
SortType string
142+
}
143+
135144
// GetCommitStatuses returns all statuses for a given commit.
136-
func GetCommitStatuses(repo *Repository, sha string, page int) ([]*CommitStatus, error) {
137-
statuses := make([]*CommitStatus, 0, 10)
138-
return statuses, x.Limit(10, page*10).Where("repo_id = ?", repo.ID).And("sha = ?", sha).Find(&statuses)
145+
func GetCommitStatuses(repo *Repository, sha string, opts *CommitStatusOptions) ([]*CommitStatus, int64, error) {
146+
if opts.Page <= 0 {
147+
opts.Page = 1
148+
}
149+
150+
countSession := listCommitStatusesStatement(repo, sha, opts)
151+
maxResults, err := countSession.Count(new(CommitStatus))
152+
if err != nil {
153+
log.Error("Count PRs: %v", err)
154+
return nil, maxResults, err
155+
}
156+
157+
statuses := make([]*CommitStatus, 0, ItemsPerPage)
158+
findSession := listCommitStatusesStatement(repo, sha, opts)
159+
sortCommitStatusesSession(findSession, opts.SortType)
160+
findSession.Limit(ItemsPerPage, (opts.Page-1)*ItemsPerPage)
161+
return statuses, maxResults, findSession.Find(&statuses)
162+
}
163+
164+
func listCommitStatusesStatement(repo *Repository, sha string, opts *CommitStatusOptions) *xorm.Session {
165+
sess := x.Where("repo_id = ?", repo.ID).And("sha = ?", sha)
166+
switch opts.State {
167+
case "pending", "success", "error", "failure", "warning":
168+
sess.And("state = ?", opts.State)
169+
}
170+
return sess
171+
}
172+
173+
func sortCommitStatusesSession(sess *xorm.Session, sortType string) {
174+
switch sortType {
175+
case "oldest":
176+
sess.Asc("created_unix")
177+
case "recentupdate":
178+
sess.Desc("updated_unix")
179+
case "leastupdate":
180+
sess.Asc("updated_unix")
181+
case "leastindex":
182+
sess.Desc("index")
183+
case "highestindex":
184+
sess.Asc("index")
185+
default:
186+
sess.Desc("created_unix")
187+
}
139188
}
140189

141190
// GetLatestCommitStatus returns all statuses with a unique context for a given commit.

models/commit_status_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ func TestGetCommitStatuses(t *testing.T) {
1717

1818
sha1 := "1234123412341234123412341234123412341234"
1919

20-
statuses, err := GetCommitStatuses(repo1, sha1, 0)
20+
statuses, maxResults, err := GetCommitStatuses(repo1, sha1, &CommitStatusOptions{})
2121
assert.NoError(t, err)
22+
assert.Equal(t, int(maxResults), 5)
2223
if assert.Len(t, statuses, 5) {
2324
assert.Equal(t, statuses[0].Context, "ci/awesomeness")
2425
assert.Equal(t, statuses[0].State, CommitStatusPending)

routers/api/v1/repo/status.go

+46-5
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,23 @@ func GetCommitStatuses(ctx *context.APIContext) {
8989
// description: sha of the commit
9090
// type: string
9191
// required: true
92+
// - name: page
93+
// in: query
94+
// description: page number of results
95+
// type: integer
96+
// required: false
97+
// - name: sort
98+
// in: query
99+
// description: type of sort
100+
// type: string
101+
// enum: [oldest, recentupdate, leastupdate, leastindex, highestindex]
102+
// required: false
103+
// - name: state
104+
// in: query
105+
// description: type of state
106+
// type: string
107+
// enum: [pending, success, error, failure, warning]
108+
// required: false
92109
// responses:
93110
// "200":
94111
// "$ref": "#/responses/StatusList"
@@ -118,6 +135,23 @@ func GetCommitStatusesByRef(ctx *context.APIContext) {
118135
// description: name of branch/tag/commit
119136
// type: string
120137
// required: true
138+
// - name: page
139+
// in: query
140+
// description: page number of results
141+
// type: integer
142+
// required: false
143+
// - name: sort
144+
// in: query
145+
// description: type of sort
146+
// type: string
147+
// enum: [oldest, recentupdate, leastupdate, leastindex, highestindex]
148+
// required: false
149+
// - name: state
150+
// in: query
151+
// description: type of state
152+
// type: string
153+
// enum: [pending, success, error, failure, warning]
154+
// required: false
121155
// responses:
122156
// "200":
123157
// "$ref": "#/responses/StatusList"
@@ -131,11 +165,13 @@ func getCommitStatuses(ctx *context.APIContext, sha string) {
131165
}
132166
repo := ctx.Repo.Repository
133167

134-
page := ctx.ParamsInt("page")
135-
136-
statuses, err := models.GetCommitStatuses(repo, sha, page)
168+
statuses, _, err := models.GetCommitStatuses(repo, sha, &models.CommitStatusOptions{
169+
Page: ctx.QueryInt("page"),
170+
SortType: ctx.QueryTrim("sort"),
171+
State: ctx.QueryTrim("state"),
172+
})
137173
if err != nil {
138-
ctx.Error(500, "GetCommitStatuses", fmt.Errorf("GetCommitStatuses[%s, %s, %d]: %v", repo.FullName(), sha, page, err))
174+
ctx.Error(500, "GetCommitStatuses", fmt.Errorf("GetCommitStatuses[%s, %s, %d]: %v", repo.FullName(), sha, ctx.QueryInt("page"), err))
139175
return
140176
}
141177

@@ -180,6 +216,11 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
180216
// description: name of branch/tag/commit
181217
// type: string
182218
// required: true
219+
// - name: page
220+
// in: query
221+
// description: page number of results
222+
// type: integer
223+
// required: false
183224
// responses:
184225
// "200":
185226
// "$ref": "#/responses/Status"
@@ -190,7 +231,7 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
190231
}
191232
repo := ctx.Repo.Repository
192233

193-
page := ctx.ParamsInt("page")
234+
page := ctx.QueryInt("page")
194235

195236
statuses, err := models.GetLatestCommitStatus(repo, sha, page)
196237
if err != nil {

templates/swagger/v1_json.tmpl

+38
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,12 @@
15611561
"name": "ref",
15621562
"in": "path",
15631563
"required": true
1564+
},
1565+
{
1566+
"type": "integer",
1567+
"description": "page number of results",
1568+
"name": "page",
1569+
"in": "query"
15641570
}
15651571
],
15661572
"responses": {
@@ -5057,6 +5063,38 @@
50575063
"name": "sha",
50585064
"in": "path",
50595065
"required": true
5066+
},
5067+
{
5068+
"type": "integer",
5069+
"description": "page number of results",
5070+
"name": "page",
5071+
"in": "query"
5072+
},
5073+
{
5074+
"enum": [
5075+
"oldest",
5076+
"recentupdate",
5077+
"leastupdate",
5078+
"leastindex",
5079+
"highestindex"
5080+
],
5081+
"type": "string",
5082+
"description": "type of sort",
5083+
"name": "sort",
5084+
"in": "query"
5085+
},
5086+
{
5087+
"enum": [
5088+
"pending",
5089+
"success",
5090+
"error",
5091+
"failure",
5092+
"warning"
5093+
],
5094+
"type": "string",
5095+
"description": "type of state",
5096+
"name": "state",
5097+
"in": "query"
50605098
}
50615099
],
50625100
"responses": {

0 commit comments

Comments
 (0)