diff options
author | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-08-02 21:14:50 -0300 |
---|---|---|
committer | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-08-17 12:58:58 -0300 |
commit | 52b6a7e966670fd7320dc821d11311f50b3725e7 (patch) | |
tree | 87ca5c8da111e236886c2a29dc9cc823732f2586 /app/services/boards | |
parent | 7d6a02aaae8572686aadb7f3cd01b1c0e39cfefd (diff) | |
download | gitlab-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.rb | 73 |
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 |