From bb2080cb159a5af7336ed405822c6ff62763fdcf Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Thu, 26 Jan 2017 09:40:11 +0100 Subject: f --- app/finders/milestones_finder.rb | 20 ++++++++++++++++---- app/models/global_milestone.rb | 2 +- doc/api/milestones.md | 3 +++ lib/api/merge_requests.rb | 2 ++ lib/api/milestones.rb | 10 +++++++--- 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 = { -- cgit v1.2.3