Add service to list issues for a board list

This commit is contained in:
Douglas Barbosa Alexandre 2016-08-02 21:14:50 -03:00
parent 7d6a02aaae
commit 52b6a7e966
2 changed files with 146 additions and 0 deletions

View File

@ -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

View File

@ -0,0 +1,73 @@
require 'spec_helper'
describe Boards::Issues::ListService, services: true do
describe '#execute' do
let(:user) { create(:user) }
let(:project) { create(:project_with_board) }
let(:board) { project.board }
let(:bug) { create(:label, project: project, name: 'Bug') }
let(:development) { create(:label, project: project, name: 'Development') }
let(:testing) { create(:label, project: project, name: 'Testing') }
let(:p1) { create(:label, title: 'P1', project: project, priority: 1) }
let(:p2) { create(:label, title: 'P2', project: project, priority: 2) }
let(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
let!(:backlog) { create(:backlog_list, board: board) }
let!(:list1) { create(:list, board: board, label: development) }
let!(:list2) { create(:list, board: board, label: testing) }
let!(:done) { create(:done_list, board: board) }
let!(:opened_issue1) { create(:labeled_issue, project: project, labels: [bug]) }
let!(:opened_issue2) { create(:labeled_issue, project: project, labels: [p2]) }
let!(:reopened_issue1) { create(:issue, :reopened, project: project) }
let!(:list1_issue1) { create(:labeled_issue, project: project, labels: [p2, development]) }
let!(:list1_issue2) { create(:labeled_issue, project: project, labels: [development]) }
let!(:list1_issue3) { create(:labeled_issue, project: project, labels: [development, p1]) }
let!(:list2_issue1) { create(:labeled_issue, project: project, labels: [testing]) }
let!(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug]) }
let!(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3]) }
let!(:closed_issue3) { create(:issue, :closed, project: project) }
let!(:closed_issue4) { create(:labeled_issue, :closed, project: project, labels: [p1]) }
before do
project.team << [user, :developer]
end
it 'delegates search to IssuesFinder' do
params = { list_id: list1.id }
expect_any_instance_of(IssuesFinder).to receive(:execute).once
described_class.new(project, user, params).execute
end
context 'sets default order to priority' do
it 'returns opened issues when listing issues from Backlog' do
params = { list_id: backlog.id }
issues = described_class.new(project, user, params).execute
expect(issues).to eq [opened_issue2, reopened_issue1, opened_issue1]
end
it 'returns closed issues when listing issues from Done' do
params = { list_id: done.id }
issues = described_class.new(project, user, params).execute
expect(issues).to eq [closed_issue4, closed_issue2, closed_issue3, closed_issue1]
end
it 'returns opened issues that have label list applied when listing issues from a label list' do
params = { list_id: list1.id }
issues = described_class.new(project, user, params).execute
expect(issues).to eq [list1_issue3, list1_issue1, list1_issue2]
end
end
end
end