mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08: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:
		
				
					committed by
					
						
						Lunny Xiao
					
				
			
			
				
	
			
			
			
						parent
						
							59e6a7b97f
						
					
				
				
					commit
					de6539fc8c
				
			@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
-
 | 
			
		||||
@@ -495,4 +496,4 @@
 | 
			
		||||
  num_stars: 0
 | 
			
		||||
  num_forks: 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.
 | 
			
		||||
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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
	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)
 | 
			
		||||
	milestones, err := GetMilestonesByRepoID(NonexistentID, api.StateOpen)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, milestones, 0)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
	// ---
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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": {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user