Skip to content

Commit de6539f

Browse files
adelowolunny
authored andcommitted
Add state param to milestone listing API (#7131)
* Support state params * update tests * fix tests * add state=all support * update tests * update swagger * update swagger
1 parent 59e6a7b commit de6539f

File tree

8 files changed

+77
-16
lines changed

8 files changed

+77
-16
lines changed

models/fixtures/milestone.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,11 @@
1313
content: content2
1414
is_closed: false
1515
num_issues: 0
16+
17+
-
18+
id: 3
19+
repo_id: 1
20+
name: milestone3
21+
content: content3
22+
is_closed: true
23+
num_issues: 0

models/fixtures/repository.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
num_closed_issues: 1
99
num_pulls: 2
1010
num_closed_pulls: 0
11-
num_milestones: 2
11+
num_milestones: 3
12+
num_closed_milestones: 1
1213
num_watches: 3
1314

1415
-
@@ -495,4 +496,4 @@
495496
num_stars: 0
496497
num_forks: 0
497498
num_issues: 0
498-
is_mirror: false
499+
is_mirror: false

models/issue_milestone.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,26 @@ func (milestones MilestoneList) getMilestoneIDs() []int64 {
190190
}
191191

192192
// GetMilestonesByRepoID returns all opened milestones of a repository.
193-
func GetMilestonesByRepoID(repoID int64) (MilestoneList, error) {
193+
func GetMilestonesByRepoID(repoID int64, state api.StateType) (MilestoneList, error) {
194+
195+
sess := x.Where("repo_id = ?", repoID)
196+
197+
switch state {
198+
case api.StateClosed:
199+
sess = sess.And("is_closed = ?", true)
200+
201+
case api.StateAll:
202+
break
203+
204+
case api.StateOpen:
205+
fallthrough
206+
207+
default:
208+
sess = sess.And("is_closed = ?", false)
209+
}
210+
194211
miles := make([]*Milestone, 0, 10)
195-
return miles, x.Where("repo_id = ? AND is_closed = ?", repoID, false).
196-
Asc("deadline_unix").Asc("id").Find(&miles)
212+
return miles, sess.Asc("deadline_unix").Asc("id").Find(&miles)
197213
}
198214

199215
// GetMilestones returns a list of milestones of given repository and status.

models/issue_milestone_test.go

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,43 @@ func TestGetMilestoneByRepoID(t *testing.T) {
6969

7070
func TestGetMilestonesByRepoID(t *testing.T) {
7171
assert.NoError(t, PrepareTestDatabase())
72-
test := func(repoID int64) {
72+
test := func(repoID int64, state api.StateType) {
7373
repo := AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository)
74-
milestones, err := GetMilestonesByRepoID(repo.ID)
74+
milestones, err := GetMilestonesByRepoID(repo.ID, state)
7575
assert.NoError(t, err)
76-
assert.Len(t, milestones, repo.NumMilestones)
76+
77+
var n int
78+
79+
switch state {
80+
case api.StateClosed:
81+
n = repo.NumClosedMilestones
82+
83+
case api.StateAll:
84+
n = repo.NumMilestones
85+
86+
case api.StateOpen:
87+
fallthrough
88+
89+
default:
90+
n = repo.NumOpenMilestones
91+
}
92+
93+
assert.Len(t, milestones, n)
7794
for _, milestone := range milestones {
7895
assert.EqualValues(t, repoID, milestone.RepoID)
7996
}
8097
}
81-
test(1)
82-
test(2)
83-
test(3)
84-
85-
milestones, err := GetMilestonesByRepoID(NonexistentID)
98+
test(1, api.StateOpen)
99+
test(1, api.StateAll)
100+
test(1, api.StateClosed)
101+
test(2, api.StateOpen)
102+
test(2, api.StateAll)
103+
test(2, api.StateClosed)
104+
test(3, api.StateOpen)
105+
test(3, api.StateClosed)
106+
test(3, api.StateAll)
107+
108+
milestones, err := GetMilestonesByRepoID(NonexistentID, api.StateOpen)
86109
assert.NoError(t, err)
87110
assert.Len(t, milestones, 0)
88111
}

modules/structs/issue.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ const (
1616
StateOpen StateType = "open"
1717
// StateClosed pr is closed
1818
StateClosed StateType = "closed"
19+
// StateAll is all
20+
StateAll StateType = "all"
1921
)
2022

2123
// PullRequestMeta PR info if an issue is a PR

routers/api/v1/repo/milestone.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
api "code.gitea.io/gitea/modules/structs"
1515
)
1616

17-
// ListMilestones list all the opened milestones for a repository
17+
// ListMilestones list milestones for a repository
1818
func ListMilestones(ctx *context.APIContext) {
1919
// swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList
2020
// ---
@@ -32,10 +32,14 @@ func ListMilestones(ctx *context.APIContext) {
3232
// description: name of the repo
3333
// type: string
3434
// required: true
35+
// - name: state
36+
// in: query
37+
// description: Milestone state, Recognised values are open, closed and all. Defaults to "open"
38+
// type: string
3539
// responses:
3640
// "200":
3741
// "$ref": "#/responses/MilestoneList"
38-
milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID)
42+
milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID, api.StateType(ctx.Query("state")))
3943
if err != nil {
4044
ctx.Error(500, "GetMilestonesByRepoID", err)
4145
return

routers/repo/issue.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"code.gitea.io/gitea/modules/markup/markdown"
2525
"code.gitea.io/gitea/modules/notification"
2626
"code.gitea.io/gitea/modules/setting"
27+
api "code.gitea.io/gitea/modules/structs"
2728
"code.gitea.io/gitea/modules/util"
2829

2930
"github.com/Unknwon/com"
@@ -305,7 +306,7 @@ func Issues(ctx *context.Context) {
305306

306307
var err error
307308
// Get milestones.
308-
ctx.Data["Milestones"], err = models.GetMilestonesByRepoID(ctx.Repo.Repository.ID)
309+
ctx.Data["Milestones"], err = models.GetMilestonesByRepoID(ctx.Repo.Repository.ID, api.StateType(ctx.Query("state")))
309310
if err != nil {
310311
ctx.ServerError("GetAllRepoMilestones", err)
311312
return

templates/swagger/v1_json.tmpl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3892,6 +3892,12 @@
38923892
"name": "repo",
38933893
"in": "path",
38943894
"required": true
3895+
},
3896+
{
3897+
"type": "string",
3898+
"description": "Milestone state, Recognised values are open, closed and all. Defaults to \"open\"",
3899+
"name": "state",
3900+
"in": "query"
38953901
}
38963902
],
38973903
"responses": {

0 commit comments

Comments
 (0)