From 20c2e90222ac0b12a4cc3fb9b9455232f6e250ae Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Sep 2014 15:28:27 +0300 Subject: Refactor finders. Prevent circular dependency error Signed-off-by: Dmitriy Zaporozhets --- app/finders/base_finder.rb | 143 ---------------------------------- app/finders/issuable_finder.rb | 145 +++++++++++++++++++++++++++++++++++ app/finders/issues_finder.rb | 2 +- app/finders/merge_requests_finder.rb | 2 +- 4 files changed, 147 insertions(+), 145 deletions(-) delete mode 100644 app/finders/base_finder.rb create mode 100644 app/finders/issuable_finder.rb (limited to 'app/finders') diff --git a/app/finders/base_finder.rb b/app/finders/base_finder.rb deleted file mode 100644 index ec5f5919d7e..00000000000 --- a/app/finders/base_finder.rb +++ /dev/null @@ -1,143 +0,0 @@ -# BaseFinder -# -# Used to filter Issues and MergeRequests collections by set of params -# -# Arguments: -# klass - actual class like Issue or MergeRequest -# current_user - which user use -# params: -# scope: 'created-by-me' or 'assigned-to-me' or 'all' -# state: 'open' or 'closed' or 'all' -# group_id: integer -# project_id: integer -# milestone_id: integer -# assignee_id: integer -# search: string -# label_name: string -# sort: string -# -class BaseFinder - attr_accessor :current_user, :params - - def execute(current_user, params) - @current_user = current_user - @params = params - - items = init_collection - items = by_scope(items) - items = by_state(items) - items = by_group(items) - items = by_project(items) - items = by_search(items) - items = by_milestone(items) - items = by_assignee(items) - items = by_label(items) - items = sort(items) - end - - private - - def init_collection - table_name = klass.table_name - - if project - if project.public? || (current_user && current_user.can?(:read_project, project)) - project.send(table_name) - else - [] - end - elsif current_user && params[:authorized_only].presence - klass.of_projects(current_user.authorized_projects).references(:project) - else - klass.of_projects(ProjectsFinder.new.execute(current_user)).references(:project) - end - end - - def by_scope(items) - case params[:scope] - when 'created-by-me', 'authored' then - items.where(author_id: current_user.id) - when 'all' then - items - when 'assigned-to-me' then - items.where(assignee_id: current_user.id) - else - raise 'You must specify default scope' - end - end - - def by_state(items) - case params[:state] - when 'closed' - items.closed - when 'all' - items - when 'opened' - items.opened - else - raise 'You must specify default state' - end - end - - def by_group(items) - if params[:group_id].present? - items = items.of_group(Group.find(params[:group_id])) - end - - items - 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 - - def sort(items) - items.sort(params[:sort]) - end - - def by_milestone(items) - if params[:milestone_id].present? - items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) - end - - items - end - - def by_assignee(items) - if params[:assignee_id].present? - items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) - end - - items - end - - def by_label(items) - if params[:label_name].present? - label_names = params[:label_name].split(",") - - item_ids = LabelLink.joins(:label). - where('labels.title in (?)', label_names). - where(target_type: klass.name).pluck(:target_id) - - items = items.where(id: item_ids) - end - - items - end - - def project - Project.where(id: params[:project_id]).first if params[:project_id].present? - end -end diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb new file mode 100644 index 00000000000..56c4f22120d --- /dev/null +++ b/app/finders/issuable_finder.rb @@ -0,0 +1,145 @@ +# IssuableFinder +# +# Used to filter Issues and MergeRequests collections by set of params +# +# Arguments: +# klass - actual class like Issue or MergeRequest +# current_user - which user use +# params: +# scope: 'created-by-me' or 'assigned-to-me' or 'all' +# state: 'open' or 'closed' or 'all' +# group_id: integer +# project_id: integer +# milestone_id: integer +# assignee_id: integer +# search: string +# label_name: string +# sort: string +# +require_relative 'projects_finder' + +class IssuableFinder + attr_accessor :current_user, :params + + def execute(current_user, params) + @current_user = current_user + @params = params + + items = init_collection + items = by_scope(items) + items = by_state(items) + items = by_group(items) + items = by_project(items) + items = by_search(items) + items = by_milestone(items) + items = by_assignee(items) + items = by_label(items) + items = sort(items) + end + + private + + def init_collection + table_name = klass.table_name + + if project + if project.public? || (current_user && current_user.can?(:read_project, project)) + project.send(table_name) + else + [] + end + elsif current_user && params[:authorized_only].presence + klass.of_projects(current_user.authorized_projects).references(:project) + else + klass.of_projects(ProjectsFinder.new.execute(current_user)).references(:project) + end + end + + def by_scope(items) + case params[:scope] + when 'created-by-me', 'authored' then + items.where(author_id: current_user.id) + when 'all' then + items + when 'assigned-to-me' then + items.where(assignee_id: current_user.id) + else + raise 'You must specify default scope' + end + end + + def by_state(items) + case params[:state] + when 'closed' + items.closed + when 'all' + items + when 'opened' + items.opened + else + raise 'You must specify default state' + end + end + + def by_group(items) + if params[:group_id].present? + items = items.of_group(Group.find(params[:group_id])) + end + + items + 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 + + def sort(items) + items.sort(params[:sort]) + end + + def by_milestone(items) + if params[:milestone_id].present? + items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) + end + + items + end + + def by_assignee(items) + if params[:assignee_id].present? + items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) + end + + items + end + + def by_label(items) + if params[:label_name].present? + label_names = params[:label_name].split(",") + + item_ids = LabelLink.joins(:label). + where('labels.title in (?)', label_names). + where(target_type: klass.name).pluck(:target_id) + + items = items.where(id: item_ids) + end + + items + end + + def project + Project.where(id: params[:project_id]).first if params[:project_id].present? + end +end diff --git a/app/finders/issues_finder.rb b/app/finders/issues_finder.rb index 8e0c606249e..20a2b0ce8f0 100644 --- a/app/finders/issues_finder.rb +++ b/app/finders/issues_finder.rb @@ -15,7 +15,7 @@ # label_name: string # sort: string # -class IssuesFinder < BaseFinder +class IssuesFinder < IssuableFinder def klass Issue end diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb index 3727149c8fb..b258216d0d4 100644 --- a/app/finders/merge_requests_finder.rb +++ b/app/finders/merge_requests_finder.rb @@ -15,7 +15,7 @@ # label_name: string # sort: string # -class MergeRequestsFinder < BaseFinder +class MergeRequestsFinder < IssuableFinder def klass MergeRequest end -- cgit v1.2.3