Commit 1e64333c5fe81a36373f0d437e425e8cab107a91

Authored by Dmitriy Zaporozhets
1 parent 1a2e11c8

Refactor FilterContext

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/contexts/filter_context.rb
1 1 class FilterContext
2   - attr_accessor :items, :params
  2 + attr_accessor :klass, :current_user, :params
3 3  
4   - def initialize(items, params)
5   - @items = items
  4 + def initialize(klass, current_user, params)
  5 + @klass = klass
  6 + @current_user = current_user
6 7 @params = params
7 8 end
8 9  
9 10 def execute
10   - apply_filter(items)
  11 + items = by_scope
  12 + items = by_state(items)
  13 + items = by_project(items)
  14 + items = by_search(items)
11 15 end
12 16  
13   - def apply_filter items
14   - if params[:project_id].present?
15   - items = items.of_projects(params[:project_id])
16   - end
  17 + private
17 18  
18   - if params[:search].present?
19   - items = items.search(params[:search])
  19 + def by_scope
  20 + table_name = klass.table_name
  21 +
  22 + case params[:scope]
  23 + when 'authored' then
  24 + current_user.send(table_name)
  25 + when 'all' then
  26 + klass.of_projects(current_user.authorized_projects.pluck(:id))
  27 + else
  28 + current_user.send("assigned_#{table_name}")
20 29 end
  30 + end
21 31  
  32 + def by_state(items)
22 33 case params[:status]
23 34 when 'closed'
24 35 items.closed
... ... @@ -28,4 +39,20 @@ class FilterContext
28 39 items.opened
29 40 end
30 41 end
  42 +
  43 + def by_project(items)
  44 + if params[:project_id].present?
  45 + items = items.of_projects(params[:project_id])
  46 + end
  47 +
  48 + items
  49 + end
  50 +
  51 + def by_search(items)
  52 + if params[:search].present?
  53 + items = items.search(params[:search])
  54 + end
  55 +
  56 + items
  57 + end
31 58 end
... ...
app/controllers/dashboard_controller.rb
... ... @@ -51,30 +51,12 @@ class DashboardController &lt; ApplicationController
51 51 end
52 52  
53 53 def merge_requests
54   - @merge_requests = case params[:scope]
55   - when 'authored' then
56   - current_user.merge_requests
57   - when 'all' then
58   - MergeRequest.where(target_project_id: current_user.authorized_projects.pluck(:id))
59   - else
60   - current_user.assigned_merge_requests
61   - end
62   -
63   - @merge_requests = FilterContext.new(@merge_requests, params).execute
  54 + @merge_requests = FilterContext.new(MergeRequest, current_user, params).execute
64 55 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
65 56 end
66 57  
67 58 def issues
68   - @issues = case params[:scope]
69   - when 'authored' then
70   - current_user.issues
71   - when 'all' then
72   - Issue.where(project_id: current_user.authorized_projects.pluck(:id))
73   - else
74   - current_user.assigned_issues
75   - end
76   -
77   - @issues = FilterContext.new(@issues, params).execute
  59 + @issues = FilterContext.new(Issue, current_user, params).execute
78 60 @issues = @issues.recent.page(params[:page]).per(20)
79 61 @issues = @issues.includes(:author, :project)
80 62  
... ...
app/controllers/groups_controller.rb
... ... @@ -45,15 +45,15 @@ class GroupsController &lt; ApplicationController
45 45  
46 46 # Get authored or assigned open merge requests
47 47 def merge_requests
48   - @merge_requests = current_user.cared_merge_requests.of_group(@group)
49   - @merge_requests = FilterContext.new(@merge_requests, params).execute
  48 + @merge_requests = FilterContext.new(MergeRequest, current_user, params).execute
  49 + @merge_requests = @merge_requests.of_group(@group)
50 50 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
51 51 end
52 52  
53 53 # Get only assigned issues
54 54 def issues
55   - @issues = current_user.assigned_issues.of_group(@group)
56   - @issues = FilterContext.new(@issues, params).execute
  55 + @issues = FilterContext.new(Issue, current_user, params).execute
  56 + @issues = @issues.of_group(@group)
57 57 @issues = @issues.recent.page(params[:page]).per(20)
58 58 @issues = @issues.includes(:author, :project)
59 59  
... ...