Commit 5e96ee341c0b0ed933e1e939ca3302965a44913b

Authored by Dmitriy Zaporozhets
1 parent 1fc42d99

Implement FilteringService

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing 1 changed file with 119 additions and 0 deletions   Show diff stats
app/services/filtering_service.rb 0 → 100644
... ... @@ -0,0 +1,119 @@
  1 +# FilteringService class
  2 +#
  3 +# Used to filter Issues and MergeRequests collections by set of params
  4 +#
  5 +# Arguments:
  6 +# klass - actual class like Issue or MergeRequest
  7 +# current_user - which user use
  8 +# params:
  9 +# scope: 'created-by-me' or 'assigned-to-me' or 'all'
  10 +# state: 'open' or 'closed' or 'all'
  11 +# group_id: integer
  12 +# project_id: integer
  13 +# milestone_id: integer
  14 +# assignee_id: integer
  15 +# search: string
  16 +# label_name: string
  17 +# sort: string
  18 +#
  19 +class FilteringService
  20 + attr_accessor :klass, :current_user, :params
  21 +
  22 + def execute(klass, current_user, params)
  23 + @klass = klass
  24 + @current_user = current_user
  25 + @params = params
  26 +
  27 + items = by_scope
  28 + items = by_state(items)
  29 + items = by_group(items)
  30 + items = by_project(items)
  31 + items = by_search(items)
  32 + items = by_milestone(items)
  33 + items = by_assignee(items)
  34 + items = by_label(items)
  35 + items = sort(items)
  36 + end
  37 +
  38 + private
  39 +
  40 + def by_scope
  41 + table_name = klass.table_name
  42 +
  43 + case params[:scope]
  44 + when 'created-by-me', 'authored' then
  45 + current_user.send(table_name)
  46 + when 'all' then
  47 + klass.of_projects(current_user.authorized_projects.pluck(:id))
  48 + when 'assigned-to-me' then
  49 + current_user.send("assigned_#{table_name}")
  50 + else
  51 + raise 'You must specify default scope'
  52 + end
  53 + end
  54 +
  55 + def by_state(items)
  56 + case params[:state]
  57 + when 'closed'
  58 + items.closed
  59 + when 'all'
  60 + items
  61 + when 'opened'
  62 + items.opened
  63 + else
  64 + raise 'You must specify default state'
  65 + end
  66 + end
  67 +
  68 + def by_group(items)
  69 + if params[:group_id].present?
  70 + items = items.of_group(Group.find(params[:group_id]))
  71 + end
  72 +
  73 + items
  74 + end
  75 +
  76 + def by_project(items)
  77 + if params[:project_id].present?
  78 + items = items.of_projects(params[:project_id])
  79 + end
  80 +
  81 + items
  82 + end
  83 +
  84 + def by_search(items)
  85 + if params[:search].present?
  86 + items = items.search(params[:search])
  87 + end
  88 +
  89 + items
  90 + end
  91 +
  92 + def sort(items)
  93 + items.sort(params[:sort])
  94 + end
  95 +
  96 + def by_milestone(items)
  97 + if params[:milestone_id].present?
  98 + items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
  99 + end
  100 +
  101 + items
  102 + end
  103 +
  104 + def by_assignee(items)
  105 + if params[:assignee_id].present?
  106 + items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
  107 + end
  108 +
  109 + items
  110 + end
  111 +
  112 + def by_label(items)
  113 + if params[:label_name].present?
  114 + items = items.tagged_with(params[:label_name])
  115 + end
  116 +
  117 + items
  118 + end
  119 +end
... ...