1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
# frozen_string_literal: true
module Mutations
module WorkItems
class Create < BaseMutation
graphql_name 'WorkItemCreate'
include Mutations::SpamProtection
include FindsNamespace
include Mutations::WorkItems::SharedArguments
include Mutations::WorkItems::Widgetable
description "Creates a work item."
authorize :create_work_item
MUTUALLY_EXCLUSIVE_ARGUMENTS_ERROR = 'Please provide either projectPath or namespacePath argument, but not both.'
DISABLED_FF_ERROR = 'create_group_level_work_items feature flag is disabled. Only project paths allowed.'
argument :crm_contacts_widget,
::Types::WorkItems::Widgets::CrmContactsCreateInputType,
required: false,
description: 'Input for CRM contacts widget.'
argument :description,
GraphQL::Types::String,
required: false,
description: copy_field_description(Types::WorkItemType, :description),
deprecated: { milestone: '16.9', reason: 'use description widget instead' }
argument :hierarchy_widget,
::Types::WorkItems::Widgets::HierarchyCreateInputType,
required: false,
description: 'Input for hierarchy widget.'
argument :labels_widget,
::Types::WorkItems::Widgets::LabelsCreateInputType,
required: false,
description: 'Input for labels widget.'
argument :linked_items_widget,
::Types::WorkItems::Widgets::LinkedItemsCreateInputType,
required: false,
description: 'Input for linked items widget.'
argument :namespace_path,
GraphQL::Types::ID,
required: false,
description: 'Full path of the namespace(project or group) the work item is created in.'
argument :project_path,
GraphQL::Types::ID,
required: false,
description: 'Full path of the project the work item is associated with.',
deprecated: {
reason: 'Please use namespacePath instead. That will cover for both projects and groups',
milestone: '15.10'
}
argument :start_and_due_date_widget,
::Types::WorkItems::Widgets::StartAndDueDateUpdateInputType,
required: false,
description: 'Input for start and due date widget.'
argument :title,
GraphQL::Types::String,
required: true,
description: copy_field_description(Types::WorkItemType, :title)
argument :work_item_type_id,
::Types::GlobalIDType[::WorkItems::Type],
required: true,
description: 'Global ID of a work item type.'
field :work_item,
::Types::WorkItemType,
null: true,
description: 'Created work item.'
def ready?(**args)
if args.slice(:project_path, :namespace_path)&.length != 1
raise Gitlab::Graphql::Errors::ArgumentError, MUTUALLY_EXCLUSIVE_ARGUMENTS_ERROR
end
super
end
def resolve(project_path: nil, namespace_path: nil, **attributes)
container_path = project_path || namespace_path
container = authorized_find!(container_path)
params = global_id_compatibility_params(attributes).merge(author_id: current_user.id)
type = ::WorkItems::Type.find(attributes[:work_item_type_id])
check_feature_available!(container, type)
widget_params = extract_widget_params!(type, params, container)
create_result = ::WorkItems::CreateService.new(
container: container,
current_user: current_user,
params: params,
widget_params: widget_params
).execute
check_spam_action_response!(create_result[:work_item]) if create_result[:work_item]
{
work_item: create_result.success? ? create_result[:work_item] : nil,
errors: create_result.errors
}
end
private
def check_feature_available!(container, type)
return unless container.is_a?(::Group)
return if ::WorkItems::Type.allowed_group_level_types(container).include?(type.base_type)
raise_feature_not_available_error!(type)
end
def global_id_compatibility_params(params)
params[:work_item_type_id] = params[:work_item_type_id]&.model_id
params
end
# type is used in overridden EE method
def raise_feature_not_available_error!(_type)
raise Gitlab::Graphql::Errors::ArgumentError, DISABLED_FF_ERROR
end
end
end
end
Mutations::WorkItems::Create.prepend_mod
|