summaryrefslogtreecommitdiff
path: root/app/services/boards
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-08-02 21:14:50 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-08-17 12:58:58 -0300
commit52b6a7e966670fd7320dc821d11311f50b3725e7 (patch)
tree87ca5c8da111e236886c2a29dc9cc823732f2586 /app/services/boards
parent7d6a02aaae8572686aadb7f3cd01b1c0e39cfefd (diff)
downloadgitlab-ce-52b6a7e966670fd7320dc821d11311f50b3725e7.tar.gz
Add service to list issues for a board list
Diffstat (limited to 'app/services/boards')
-rw-r--r--app/services/boards/issues/list_service.rb73
1 files changed, 73 insertions, 0 deletions
diff --git a/app/services/boards/issues/list_service.rb b/app/services/boards/issues/list_service.rb
new file mode 100644
index 00000000000..4948ab3a140
--- /dev/null
+++ b/app/services/boards/issues/list_service.rb
@@ -0,0 +1,73 @@
+module Boards
+ module Issues
+ class ListService
+ def initialize(project, user, params = {})
+ @project = project
+ @user = user
+ @params = params.dup
+ end
+
+ def execute
+ issues = IssuesFinder.new(user, filter_params).execute
+ issues = without_board_labels(issues) if list.backlog?
+ issues
+ end
+
+ private
+
+ attr_reader :project, :user, :params
+
+ delegate :board, to: :project
+
+ def list
+ @list ||= board.lists.find(params[:list_id])
+ end
+
+ def filter_params
+ set_default_scope
+ set_default_sort
+ set_list_label
+ set_project
+ set_state
+
+ params
+ end
+
+ def set_default_scope
+ params[:scope] = 'all'
+ end
+
+ def set_default_sort
+ params[:sort] = 'priority'
+ end
+
+ def set_list_label
+ return unless list.label?
+
+ params[:label_name] ||= []
+ params[:label_name] << list.label_name
+ end
+
+ def set_project
+ params[:project_id] = project.id
+ end
+
+ def set_state
+ params[:state] = list.done? ? 'closed' : 'opened'
+ end
+
+ def board_label_ids
+ @board_label_ids ||= board.lists.label.pluck(:label_id)
+ end
+
+ def without_board_labels(issues)
+ return issues unless board_label_ids.any?
+
+ issues.where.not(
+ LabelLink.where("label_links.target_type = 'Issue' AND label_links.target_id = issues.id")
+ .where(label_id: board_label_ids).limit(1).arel.exists
+ )
+ end
+ end
+ end
+end