2022-07-07 15:08:37 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module WorkItems
|
|
|
|
module ParentLinks
|
|
|
|
class CreateService < IssuableLinks::CreateService
|
|
|
|
private
|
|
|
|
|
|
|
|
# rubocop: disable CodeReuse/ActiveRecord
|
|
|
|
def relate_issuables(work_item)
|
|
|
|
link = WorkItems::ParentLink.find_or_initialize_by(work_item: work_item)
|
|
|
|
link.work_item_parent = issuable
|
|
|
|
|
|
|
|
if link.changed? && link.save
|
|
|
|
create_notes(work_item)
|
|
|
|
end
|
|
|
|
|
|
|
|
link
|
|
|
|
end
|
|
|
|
# rubocop: enable CodeReuse/ActiveRecord
|
|
|
|
|
|
|
|
def linkable_issuables(work_items)
|
|
|
|
@linkable_issuables ||= begin
|
2022-07-15 15:15:01 +00:00
|
|
|
return [] unless can?(current_user, :admin_parent_link, issuable)
|
2022-07-07 15:08:37 +00:00
|
|
|
|
|
|
|
work_items.select do |work_item|
|
|
|
|
linkable?(work_item)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def linkable?(work_item)
|
2022-07-15 15:15:01 +00:00
|
|
|
can?(current_user, :admin_parent_link, work_item) &&
|
2022-07-07 15:08:37 +00:00
|
|
|
!previous_related_issuables.include?(work_item)
|
|
|
|
end
|
|
|
|
|
|
|
|
def previous_related_issuables
|
|
|
|
@related_issues ||= issuable.work_item_children.to_a
|
|
|
|
end
|
|
|
|
|
|
|
|
def extract_references
|
|
|
|
params[:issuable_references].map do |id|
|
|
|
|
::WorkItem.find(id)
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
@errors << _("Task with ID: %{id} could not be found.") % { id: id }
|
2022-07-15 15:15:01 +00:00
|
|
|
next
|
|
|
|
end.compact
|
2022-07-07 15:08:37 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# TODO: Create system notes when work item's parent or children are updated
|
|
|
|
# See https://gitlab.com/gitlab-org/gitlab/-/issues/362213
|
|
|
|
def create_notes(work_item)
|
|
|
|
# no-op
|
|
|
|
end
|
|
|
|
|
|
|
|
def target_issuable_type
|
|
|
|
issuable.issue_type == 'issue' ? 'task' : issuable.issue_type
|
|
|
|
end
|
|
|
|
|
|
|
|
def issuables_not_found_message
|
|
|
|
_('No matching %{issuable} found. Make sure that you are adding a valid %{issuable} ID.' %
|
|
|
|
{ issuable: target_issuable_type })
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|