diff options
Diffstat (limited to 'app/services/work_items/parent_links/create_service.rb')
-rw-r--r-- | app/services/work_items/parent_links/create_service.rb | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/app/services/work_items/parent_links/create_service.rb b/app/services/work_items/parent_links/create_service.rb new file mode 100644 index 00000000000..9940776e367 --- /dev/null +++ b/app/services/work_items/parent_links/create_service.rb @@ -0,0 +1,60 @@ +# 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 + return [] unless can?(current_user, :admin_parent_link, issuable) + + work_items.select do |work_item| + linkable?(work_item) + end + end + end + + def linkable?(work_item) + can?(current_user, :admin_parent_link, work_item) && + !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] + 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 |