summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Schilling <rschilling@student.tugraz.at>2017-01-26 09:40:11 +0100
committerRobert Schilling <rschilling@student.tugraz.at>2017-04-21 10:02:33 +0200
commitbb2080cb159a5af7336ed405822c6ff62763fdcf (patch)
tree1f79b5118cd4d363d4420a01638e0e0dec162cfa
parent18fb08c70137604269c2a3806bff89905dda0473 (diff)
downloadgitlab-ce-api-filter-mr-milestones.tar.gz
-rw-r--r--app/finders/milestones_finder.rb20
-rw-r--r--app/models/global_milestone.rb2
-rw-r--r--doc/api/milestones.md3
-rw-r--r--lib/api/merge_requests.rb2
-rw-r--r--lib/api/milestones.rb10
5 files changed, 29 insertions, 8 deletions
diff --git a/app/finders/milestones_finder.rb b/app/finders/milestones_finder.rb
index 02e5ec3fcd4..fabbea3ea54 100644
--- a/app/finders/milestones_finder.rb
+++ b/app/finders/milestones_finder.rb
@@ -1,14 +1,26 @@
class MilestonesFinder
- def execute(projects, params)
+
+ attr_accessor :params
+
+ def initialize(params)
+ @params = params
+ end
+
+ def execute(projects)
milestones = Milestone.of_projects(projects)
milestones = by_state(milestones)
milestones = by_iid(milestones, params[:iid])
milestones = by_search(milestones, params[:search])
+
sort(milestones)
end
def sort(milestones)
- milestones.reorder(due_date: :asc)
+ if params[:sort_by].present? && params[:sort_direction].present?
+ milestones.reorder(params[:sort_by] => params[:sort_direction])
+ else
+ milestones.reorder(due_date: :asc)
+ end
end
def by_state(milestones)
@@ -22,8 +34,8 @@ class MilestonesFinder
end
end
- def by_iid(milestones, iid)
- iid.present? ? milestones.where(iid: iid) : milestones
+ def by_iid(milestones)
+ params[:iid].present? ? milestones.where(iid: params[:iid]) : milestones
end
def by_search(milestones, search)
diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb
index 0afbca2cb32..104a4352dc9 100644
--- a/app/models/global_milestone.rb
+++ b/app/models/global_milestone.rb
@@ -11,7 +11,7 @@ class GlobalMilestone
end
def self.build_collection(projects, params)
- child_milestones = MilestonesFinder.new.execute(projects, params)
+ child_milestones = MilestonesFinder.new(params).execute(projects)
milestones = child_milestones.select(:id, :title).group_by(&:title).map do |title, grouped|
milestones_relation = Milestone.where(id: grouped.map(&:id))
diff --git a/doc/api/milestones.md b/doc/api/milestones.md
index f6ec6c3b53c..362f6eb0387 100644
--- a/doc/api/milestones.md
+++ b/doc/api/milestones.md
@@ -17,10 +17,13 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
+
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
| `iids` | Array[integer] | optional | Return only the milestones having the given `iids` |
| `state` | string | optional | Return only `active` or `closed` milestones` |
| `search` | string | optional | Return only milestones with a title or description matching the provided string |
+| `order_by`| string | no | Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` |
+| `sort` | string | no | Return requests sorted in `asc` or `desc` order. Default is `desc` |
```bash
curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/5/milestones
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index 7515f782399..e8b32d64fb2 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -50,6 +50,8 @@ module API
args[:milestone_title] = args.delete(:milestone)
args[:label_name] = args.delete(:labels)
+ args[:sort_by] = args.delete(:order_by)
+ args[:sort_direction] = args.delete(:sort)
merge_requests = MergeRequestsFinder.new(current_user, args).execute.inc_notes_with_associations
diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb
index 94e5f1893cf..5d27c39cdf1 100644
--- a/lib/api/milestones.rb
+++ b/lib/api/milestones.rb
@@ -22,14 +22,18 @@ module API
params do
optional :state, type: String, values: %w[active closed all], default: 'all',
desc: 'Return "active", "closed", or "all" milestones'
- optional :iids, type: Array[Integer], desc: 'The IIDs of the milestones'
+ optional :iid, type: Array[Integer], desc: 'The IID of the milestone'
optional :search, type: String, desc: 'The search criteria for the title or description of the milestone'
+ optional :sort_by, type: String, values: %w[due_date start_date created_at updated_at], default: 'due_date',
+ desc: 'Return issues ordered by `created_at` or `updated_at` fields.'
+ optional :sort_direction, type: String, values: %w[asc desc], default: 'desc',
+ desc: 'Return issues sorted in `asc` or `desc` order.'
use :pagination
end
get ":id/milestones" do
authorize! :read_milestone, user_project
- milestones = MilestonesFinder.new.execute(user_project, declared_params(include_missing: false))
+ milestones = MilestonesFinder.new(declared_params(include_missing: false)).execute(user_project)
present paginate(milestones), with: Entities::Milestone
end
@@ -150,7 +154,7 @@ module API
get ":id/milestones/:milestone_id/merge_requests" do
authorize! :read_milestone, user_project
- milestone = MilestonesFinder.new.execute(user_project, state: 'all').find_by(id: params[:milestone_id])
+ milestone = MilestonesFinder.new(state: 'all').execute(user_project).find_by(id: params[:milestone_id])
not_found!('Milestone') unless milestone
finder_params = {