diff options
author | 6543 <6543@obermui.de> | 2020-04-30 06:15:39 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-30 01:15:39 -0300 |
commit | bfda0f38646f66dbae2767eed3097489c456ebf5 (patch) | |
tree | b3c915a6fb63215cd2c31c24bf4d7da332503565 /routers/api/v1/repo/issue.go | |
parent | cbf5dffaf29c1e871342c15478b33e9229a7f9d2 (diff) | |
download | gitea-bfda0f38646f66dbae2767eed3097489c456ebf5.tar.gz gitea-bfda0f38646f66dbae2767eed3097489c456ebf5.zip |
[API] ListIssues add filter for milestones (#10148)
* Refactor Issue Filter Func
* ListIssues add filter for milestones
* as per @lafriks
* documentation ...
Diffstat (limited to 'routers/api/v1/repo/issue.go')
-rw-r--r-- | routers/api/v1/repo/issue.go | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 217c97c69b..3497fe08fe 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -8,6 +8,7 @@ package repo import ( "fmt" "net/http" + "strconv" "strings" "time" @@ -208,6 +209,10 @@ func ListIssues(ctx *context.APIContext) { // in: query // description: filter by type (issues / pulls) if set // type: string + // - name: milestones + // in: query + // description: comma separated list of milestone names or ids. It uses names and fall back to ids. Fetch only issues that have any of this milestones. Non existent milestones are discarded + // type: string // - name: page // in: query // description: page number of results to return (1-based) @@ -251,6 +256,36 @@ func ListIssues(ctx *context.APIContext) { } } + var mileIDs []int64 + if part := strings.Split(ctx.Query("milestones"), ","); len(part) > 0 { + for i := range part { + // uses names and fall back to ids + // non existent milestones are discarded + mile, err := models.GetMilestoneByRepoIDANDName(ctx.Repo.Repository.ID, part[i]) + if err == nil { + mileIDs = append(mileIDs, mile.ID) + continue + } + if !models.IsErrMilestoneNotExist(err) { + ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoIDANDName", err) + return + } + id, err := strconv.ParseInt(part[i], 10, 64) + if err != nil { + continue + } + mile, err = models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, id) + if err == nil { + mileIDs = append(mileIDs, mile.ID) + continue + } + if models.IsErrMilestoneNotExist(err) { + continue + } + ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err) + } + } + listOptions := utils.GetListOptions(ctx) if ctx.QueryInt("limit") == 0 { listOptions.PageSize = setting.UI.IssuePagingNum @@ -270,12 +305,13 @@ func ListIssues(ctx *context.APIContext) { // This would otherwise return all issues if no issues were found by the search. if len(keyword) == 0 || len(issueIDs) > 0 || len(labelIDs) > 0 { issues, err = models.Issues(&models.IssuesOptions{ - ListOptions: listOptions, - RepoIDs: []int64{ctx.Repo.Repository.ID}, - IsClosed: isClosed, - IssueIDs: issueIDs, - LabelIDs: labelIDs, - IsPull: isPull, + ListOptions: listOptions, + RepoIDs: []int64{ctx.Repo.Repository.ID}, + IsClosed: isClosed, + IssueIDs: issueIDs, + LabelIDs: labelIDs, + MilestoneIDs: mileIDs, + IsPull: isPull, }) } |