mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-28 10:33:20 +00:00
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
This commit is contained in:
parent
59e6a7b97f
commit
de6539fc8c
|
@ -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
|
||||||
|
|
||||||
-
|
-
|
||||||
|
|
|
@ -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).
|
return miles, sess.Asc("deadline_unix").Asc("id").Find(&miles)
|
||||||
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(1, api.StateOpen)
|
||||||
test(2)
|
test(1, api.StateAll)
|
||||||
test(3)
|
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)
|
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": {
|
||||||
|
|
Loading…
Reference in a new issue