Allows to filter issues by `Any milestone` in the API
In GET `api/v4/projects/:id/issues` the user can filter issues that have an assigned milestone through the parameter `milestone=Any+Milestone`.
This commit is contained in:
parent
bf37ff071f
commit
a1c3d40739
|
|
@ -424,6 +424,10 @@ class IssuableFinder
|
|||
params[:milestone_title] == Milestone::Upcoming.name
|
||||
end
|
||||
|
||||
def filter_by_any_milestone?
|
||||
params[:milestone_title] == Milestone::Any.title
|
||||
end
|
||||
|
||||
def filter_by_started_milestone?
|
||||
params[:milestone_title] == Milestone::Started.name
|
||||
end
|
||||
|
|
@ -433,6 +437,8 @@ class IssuableFinder
|
|||
if milestones?
|
||||
if filter_by_no_milestone?
|
||||
items = items.left_joins_milestones.where(milestone_id: [-1, nil])
|
||||
elsif filter_by_any_milestone?
|
||||
items = items.any_milestone
|
||||
elsif filter_by_upcoming_milestone?
|
||||
upcoming_ids = Milestone.upcoming_ids_by_projects(projects(items))
|
||||
items = items.left_joins_milestones.where(milestone_id: upcoming_ids)
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ module Issuable
|
|||
scope :recent, -> { reorder(id: :desc) }
|
||||
scope :of_projects, ->(ids) { where(project_id: ids) }
|
||||
scope :of_milestones, ->(ids) { where(milestone_id: ids) }
|
||||
scope :any_milestone, -> { where('milestone_id IS NOT NULL') }
|
||||
scope :with_milestone, ->(title) { left_joins_milestones.where(milestones: { title: title }) }
|
||||
scope :opened, -> { with_state(:opened) }
|
||||
scope :only_opened, -> { with_state(:opened) }
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Allows to filter issues by Any milestone in the API
|
||||
merge_request: 22080
|
||||
author: Jacopo Beschi @jacopo-beschi
|
||||
type: added
|
||||
|
|
@ -37,7 +37,7 @@ GET /issues?my_reaction_emoji=star
|
|||
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `state` | string | no | Return all issues or just those that are `opened` or `closed` |
|
||||
| `labels` | string | no | Comma-separated list of label names, issues must have all labels to be returned. `No+Label` lists all issues with no labels |
|
||||
| `milestone` | string | no | The milestone title. `No+Milestone` lists all issues with no milestone |
|
||||
| `milestone` | string | no | The milestone title. `No+Milestone` lists all issues with no milestone. `Any+Milestone` lists all issues that have an assigned milestone |
|
||||
| `scope` | string | no | Return issues for the given scope: `created_by_me`, `assigned_to_me` or `all`. Defaults to `created_by_me`<br> For versions before 11.0, use the now deprecated `created-by-me` or `assigned-to-me` scopes instead.<br> _([Introduced][ce-13004] in GitLab 9.5. [Changed to snake_case][ce-18935] in GitLab 11.0)_ |
|
||||
| `author_id` | integer | no | Return issues created by the given user `id`. Combine with `scope=all` or `scope=assigned_to_me`. _([Introduced][ce-13004] in GitLab 9.5)_ |
|
||||
| `assignee_id` | integer | no | Return issues assigned to the given user `id` _([Introduced][ce-13004] in GitLab 9.5)_ |
|
||||
|
|
|
|||
|
|
@ -125,6 +125,14 @@ describe IssuesFinder do
|
|||
end
|
||||
end
|
||||
|
||||
context 'filtering by any milestone' do
|
||||
let(:params) { { milestone_title: Milestone::Any.title } }
|
||||
|
||||
it 'returns issues with any assigned milestone' do
|
||||
expect(issues).to contain_exactly(issue1)
|
||||
end
|
||||
end
|
||||
|
||||
context 'filtering by upcoming milestone' do
|
||||
let(:params) { { milestone_title: Milestone::Upcoming.name } }
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ describe API::Issues do
|
|||
let!(:note) { create(:note_on_issue, author: user, project: project, noteable: issue) }
|
||||
|
||||
let(:no_milestone_title) { URI.escape(Milestone::None.title) }
|
||||
let(:any_milestone_title) { URI.escape(Milestone::Any.title) }
|
||||
|
||||
before(:all) do
|
||||
project.add_reporter(user)
|
||||
|
|
@ -811,6 +812,15 @@ describe API::Issues do
|
|||
expect(json_response.first['id']).to eq(confidential_issue.id)
|
||||
end
|
||||
|
||||
it 'returns an array of issues with any milestone' do
|
||||
get api("#{base_url}/issues?milestone=#{any_milestone_title}", user)
|
||||
|
||||
response_ids = json_response.map { |issue| issue['id'] }
|
||||
|
||||
expect_paginated_array_response(size: 2)
|
||||
expect(response_ids).to contain_exactly(closed_issue.id, issue.id)
|
||||
end
|
||||
|
||||
it 'sorts by created_at descending by default' do
|
||||
get api("#{base_url}/issues", user)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue