* Support state params * update tests * fix tests * add state=all support * update tests * update swagger * update swaggertags/v1.9.0-rc1
| @@ -13,3 +13,11 @@ | |||||
| content: content2 | content: content2 | ||||
| is_closed: false | is_closed: false | ||||
| num_issues: 0 | num_issues: 0 | ||||
| - | |||||
| id: 3 | |||||
| repo_id: 1 | |||||
| name: milestone3 | |||||
| content: content3 | |||||
| is_closed: true | |||||
| num_issues: 0 | |||||
| @@ -8,7 +8,8 @@ | |||||
| num_closed_issues: 1 | num_closed_issues: 1 | ||||
| num_pulls: 2 | num_pulls: 2 | ||||
| num_closed_pulls: 0 | num_closed_pulls: 0 | ||||
| num_milestones: 2 | |||||
| num_milestones: 3 | |||||
| num_closed_milestones: 1 | |||||
| num_watches: 3 | num_watches: 3 | ||||
| - | - | ||||
| @@ -495,4 +496,4 @@ | |||||
| num_stars: 0 | num_stars: 0 | ||||
| num_forks: 0 | num_forks: 0 | ||||
| num_issues: 0 | num_issues: 0 | ||||
| is_mirror: false | |||||
| is_mirror: false | |||||
| @@ -190,10 +190,26 @@ func (milestones MilestoneList) getMilestoneIDs() []int64 { | |||||
| } | } | ||||
| // GetMilestonesByRepoID returns all opened milestones of a repository. | // 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) | 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. | // GetMilestones returns a list of milestones of given repository and status. | ||||
| @@ -69,20 +69,43 @@ func TestGetMilestoneByRepoID(t *testing.T) { | |||||
| func TestGetMilestonesByRepoID(t *testing.T) { | func TestGetMilestonesByRepoID(t *testing.T) { | ||||
| assert.NoError(t, PrepareTestDatabase()) | assert.NoError(t, PrepareTestDatabase()) | ||||
| test := func(repoID int64) { | |||||
| test := func(repoID int64, state api.StateType) { | |||||
| repo := AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository) | repo := AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository) | ||||
| milestones, err := GetMilestonesByRepoID(repo.ID) | |||||
| milestones, err := GetMilestonesByRepoID(repo.ID, state) | |||||
| assert.NoError(t, err) | 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 { | for _, milestone := range milestones { | ||||
| assert.EqualValues(t, repoID, milestone.RepoID) | 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.NoError(t, err) | ||||
| assert.Len(t, milestones, 0) | assert.Len(t, milestones, 0) | ||||
| } | } | ||||
| @@ -16,6 +16,8 @@ const ( | |||||
| StateOpen StateType = "open" | StateOpen StateType = "open" | ||||
| // StateClosed pr is closed | // StateClosed pr is closed | ||||
| StateClosed StateType = "closed" | StateClosed StateType = "closed" | ||||
| // StateAll is all | |||||
| StateAll StateType = "all" | |||||
| ) | ) | ||||
| // PullRequestMeta PR info if an issue is a PR | // PullRequestMeta PR info if an issue is a PR | ||||
| @@ -14,7 +14,7 @@ import ( | |||||
| api "code.gitea.io/gitea/modules/structs" | 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) { | func ListMilestones(ctx *context.APIContext) { | ||||
| // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList | // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList | ||||
| // --- | // --- | ||||
| @@ -32,10 +32,14 @@ func ListMilestones(ctx *context.APIContext) { | |||||
| // description: name of the repo | // description: name of the repo | ||||
| // type: string | // type: string | ||||
| // required: true | // required: true | ||||
| // - name: state | |||||
| // in: query | |||||
| // description: Milestone state, Recognised values are open, closed and all. Defaults to "open" | |||||
| // type: string | |||||
| // responses: | // responses: | ||||
| // "200": | // "200": | ||||
| // "$ref": "#/responses/MilestoneList" | // "$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 { | if err != nil { | ||||
| ctx.Error(500, "GetMilestonesByRepoID", err) | ctx.Error(500, "GetMilestonesByRepoID", err) | ||||
| return | return | ||||
| @@ -24,6 +24,7 @@ import ( | |||||
| "code.gitea.io/gitea/modules/markup/markdown" | "code.gitea.io/gitea/modules/markup/markdown" | ||||
| "code.gitea.io/gitea/modules/notification" | "code.gitea.io/gitea/modules/notification" | ||||
| "code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
| api "code.gitea.io/gitea/modules/structs" | |||||
| "code.gitea.io/gitea/modules/util" | "code.gitea.io/gitea/modules/util" | ||||
| "github.com/Unknwon/com" | "github.com/Unknwon/com" | ||||
| @@ -305,7 +306,7 @@ func Issues(ctx *context.Context) { | |||||
| var err error | var err error | ||||
| // Get milestones. | // 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 { | if err != nil { | ||||
| ctx.ServerError("GetAllRepoMilestones", err) | ctx.ServerError("GetAllRepoMilestones", err) | ||||
| return | return | ||||
| @@ -3892,6 +3892,12 @@ | |||||
| "name": "repo", | "name": "repo", | ||||
| "in": "path", | "in": "path", | ||||
| "required": true | "required": true | ||||
| }, | |||||
| { | |||||
| "type": "string", | |||||
| "description": "Milestone state, Recognised values are open, closed and all. Defaults to \"open\"", | |||||
| "name": "state", | |||||
| "in": "query" | |||||
| } | } | ||||
| ], | ], | ||||
| "responses": { | "responses": { | ||||