Skip to content

Add state param to milestone listing API #7131

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 6, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions models/fixtures/milestone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,11 @@
content: content2
is_closed: false
num_issues: 0

-
id: 3
repo_id: 1
name: milestone3
content: content3
is_closed: true
num_issues: 0
5 changes: 3 additions & 2 deletions models/fixtures/repository.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
num_closed_issues: 1
num_pulls: 2
num_closed_pulls: 0
num_milestones: 2
num_milestones: 3
num_closed_milestones: 1
num_watches: 3

-
Expand Down Expand Up @@ -495,4 +496,4 @@
num_stars: 0
num_forks: 0
num_issues: 0
is_mirror: false
is_mirror: false
22 changes: 19 additions & 3 deletions models/issue_milestone.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,10 +190,26 @@ func (milestones MilestoneList) getMilestoneIDs() []int64 {
}

// GetMilestonesByRepoID returns all opened milestones of a repository.
func GetMilestonesByRepoID(repoID int64) (MilestoneList, error) {
func GetMilestonesByRepoID(repoID int64, state api.StateType) (MilestoneList, error) {

sess := x.Where("repo_id = ?", repoID)

switch state {
case api.StateClosed:
sess = sess.And("is_closed = ?", true)

case api.StateAll:
break

case api.StateOpen:
fallthrough

default:
sess = sess.And("is_closed = ?", false)
}

miles := make([]*Milestone, 0, 10)
return miles, x.Where("repo_id = ? AND is_closed = ?", repoID, false).
Asc("deadline_unix").Asc("id").Find(&miles)
return miles, sess.Asc("deadline_unix").Asc("id").Find(&miles)
}

// GetMilestones returns a list of milestones of given repository and status.
Expand Down
39 changes: 31 additions & 8 deletions models/issue_milestone_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,20 +69,43 @@ func TestGetMilestoneByRepoID(t *testing.T) {

func TestGetMilestonesByRepoID(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
test := func(repoID int64) {
test := func(repoID int64, state api.StateType) {
repo := AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository)
milestones, err := GetMilestonesByRepoID(repo.ID)
milestones, err := GetMilestonesByRepoID(repo.ID, state)
assert.NoError(t, err)
assert.Len(t, milestones, repo.NumMilestones)

var n int

switch state {
case api.StateClosed:
n = repo.NumClosedMilestones

case api.StateAll:
n = repo.NumMilestones

case api.StateOpen:
fallthrough

default:
n = repo.NumOpenMilestones
}

assert.Len(t, milestones, n)
for _, milestone := range milestones {
assert.EqualValues(t, repoID, milestone.RepoID)
}
}
test(1)
test(2)
test(3)

milestones, err := GetMilestonesByRepoID(NonexistentID)
test(1, api.StateOpen)
test(1, api.StateAll)
test(1, api.StateClosed)
test(2, api.StateOpen)
test(2, api.StateAll)
test(2, api.StateClosed)
test(3, api.StateOpen)
test(3, api.StateClosed)
test(3, api.StateAll)

milestones, err := GetMilestonesByRepoID(NonexistentID, api.StateOpen)
assert.NoError(t, err)
assert.Len(t, milestones, 0)
}
Expand Down
2 changes: 2 additions & 0 deletions modules/structs/issue.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ const (
StateOpen StateType = "open"
// StateClosed pr is closed
StateClosed StateType = "closed"
// StateAll is all
StateAll StateType = "all"
)

// PullRequestMeta PR info if an issue is a PR
Expand Down
8 changes: 6 additions & 2 deletions routers/api/v1/repo/milestone.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
api "code.gitea.io/gitea/modules/structs"
)

// ListMilestones list all the opened milestones for a repository
// ListMilestones list milestones for a repository
func ListMilestones(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList
// ---
Expand All @@ -32,10 +32,14 @@ func ListMilestones(ctx *context.APIContext) {
// description: name of the repo
// type: string
// required: true
// - name: state
// in: query
// description: Milestone state, Recognised values are open, closed and all. Defaults to "open"
// type: string
// responses:
// "200":
// "$ref": "#/responses/MilestoneList"
milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID)
milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID, api.StateType(ctx.Query("state")))
if err != nil {
ctx.Error(500, "GetMilestonesByRepoID", err)
return
Expand Down
3 changes: 2 additions & 1 deletion routers/repo/issue.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/notification"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"

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

var err error
// Get milestones.
ctx.Data["Milestones"], err = models.GetMilestonesByRepoID(ctx.Repo.Repository.ID)
ctx.Data["Milestones"], err = models.GetMilestonesByRepoID(ctx.Repo.Repository.ID, api.StateType(ctx.Query("state")))
if err != nil {
ctx.ServerError("GetAllRepoMilestones", err)
return
Expand Down
6 changes: 6 additions & 0 deletions templates/swagger/v1_json.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -3892,6 +3892,12 @@
"name": "repo",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Milestone state, Recognised values are open, closed and all. Defaults to \"open\"",
"name": "state",
"in": "query"
}
],
"responses": {
Expand Down