60 lines
1.4 KiB
Ruby
60 lines
1.4 KiB
Ruby
class Command::Assign < Command
|
|
include Command::Cards
|
|
|
|
store_accessor :data, :assignee_ids, :toggled_assignees_by_card
|
|
|
|
validates_presence_of :assignee_ids
|
|
|
|
def title
|
|
assignee_description = assignees.collect(&:first_name).join(", ")
|
|
|
|
"Assign #{assignee_description} to #{cards_description}"
|
|
end
|
|
|
|
def execute
|
|
toggled_assignees_by_card = {}
|
|
|
|
transaction do
|
|
cards.find_each do |card|
|
|
toggled_assignees_by_card[card.id] = []
|
|
assignees.find_each do |assignee|
|
|
assign(assignee, card, toggled_assignees_by_card)
|
|
end
|
|
end
|
|
|
|
update! toggled_assignees_by_card: toggled_assignees_by_card
|
|
end
|
|
end
|
|
|
|
def undo
|
|
transaction do
|
|
toggled_assignees_by_card.each do |card_id, assignee_ids|
|
|
card = user.accessible_cards.find_by_id(card_id)
|
|
assignees = User.where(id: assignee_ids)
|
|
|
|
undo_assignment(assignees, card)
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
def assignees
|
|
User.where(id: assignee_ids)
|
|
end
|
|
|
|
def assign(assignee, card, toggled_assignees_by_card)
|
|
unless card.assigned_to?(assignee)
|
|
toggled_assignees_by_card[card.id] << assignee.id
|
|
card.toggle_assignment(assignee)
|
|
end
|
|
end
|
|
|
|
def undo_assignment(assignees, card)
|
|
if card && assignees.any?
|
|
assignees.each do |assignee|
|
|
card.toggle_assignment(assignee) if card.assigned_to?(assignee)
|
|
end
|
|
end
|
|
end
|
|
end
|