diff --git a/app/contexts/filter_context.rb b/app/contexts/filter_context.rb index 2607b12..fb0d42c 100644 --- a/app/contexts/filter_context.rb +++ b/app/contexts/filter_context.rb @@ -1,24 +1,35 @@ class FilterContext - attr_accessor :items, :params + attr_accessor :klass, :current_user, :params - def initialize(items, params) - @items = items + def initialize(klass, current_user, params) + @klass = klass + @current_user = current_user @params = params end def execute - apply_filter(items) + items = by_scope + items = by_state(items) + items = by_project(items) + items = by_search(items) end - def apply_filter items - if params[:project_id].present? - items = items.of_projects(params[:project_id]) - end + private - if params[:search].present? - items = items.search(params[:search]) + def by_scope + table_name = klass.table_name + + case params[:scope] + when 'authored' then + current_user.send(table_name) + when 'all' then + klass.of_projects(current_user.authorized_projects.pluck(:id)) + else + current_user.send("assigned_#{table_name}") end + end + def by_state(items) case params[:status] when 'closed' items.closed @@ -28,4 +39,20 @@ class FilterContext items.opened end end + + def by_project(items) + if params[:project_id].present? + items = items.of_projects(params[:project_id]) + end + + items + end + + def by_search(items) + if params[:search].present? + items = items.search(params[:search]) + end + + items + end end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 70dd3ff..7845699 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -51,30 +51,12 @@ class DashboardController < ApplicationController end def merge_requests - @merge_requests = case params[:scope] - when 'authored' then - current_user.merge_requests - when 'all' then - MergeRequest.where(target_project_id: current_user.authorized_projects.pluck(:id)) - else - current_user.assigned_merge_requests - end - - @merge_requests = FilterContext.new(@merge_requests, params).execute + @merge_requests = FilterContext.new(MergeRequest, current_user, params).execute @merge_requests = @merge_requests.recent.page(params[:page]).per(20) end def issues - @issues = case params[:scope] - when 'authored' then - current_user.issues - when 'all' then - Issue.where(project_id: current_user.authorized_projects.pluck(:id)) - else - current_user.assigned_issues - end - - @issues = FilterContext.new(@issues, params).execute + @issues = FilterContext.new(Issue, current_user, params).execute @issues = @issues.recent.page(params[:page]).per(20) @issues = @issues.includes(:author, :project) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index fd0aa03..5e8efe3 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -45,15 +45,15 @@ class GroupsController < ApplicationController # Get authored or assigned open merge requests def merge_requests - @merge_requests = current_user.cared_merge_requests.of_group(@group) - @merge_requests = FilterContext.new(@merge_requests, params).execute + @merge_requests = FilterContext.new(MergeRequest, current_user, params).execute + @merge_requests = @merge_requests.of_group(@group) @merge_requests = @merge_requests.recent.page(params[:page]).per(20) end # Get only assigned issues def issues - @issues = current_user.assigned_issues.of_group(@group) - @issues = FilterContext.new(@issues, params).execute + @issues = FilterContext.new(Issue, current_user, params).execute + @issues = @issues.of_group(@group) @issues = @issues.recent.page(params[:page]).per(20) @issues = @issues.includes(:author, :project) -- libgit2 0.21.2