summaryrefslogtreecommitdiff
path: root/app/graphql/mutations/issues/update.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/mutations/issues/update.rb')
-rw-r--r--app/graphql/mutations/issues/update.rb46
1 files changed, 39 insertions, 7 deletions
diff --git a/app/graphql/mutations/issues/update.rb b/app/graphql/mutations/issues/update.rb
index 1ceed868a6c..6cab1214d24 100644
--- a/app/graphql/mutations/issues/update.rb
+++ b/app/graphql/mutations/issues/update.rb
@@ -7,21 +7,25 @@ module Mutations
include CommonMutationArguments
- argument :title, GraphQL::STRING_TYPE,
+ argument :title, GraphQL::Types::String,
required: false,
description: copy_field_description(Types::IssueType, :title)
- argument :milestone_id, GraphQL::ID_TYPE, # rubocop: disable Graphql/IDType
+ argument :milestone_id, GraphQL::Types::ID, # rubocop: disable Graphql/IDType
required: false,
- description: 'The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.'
+ description: 'ID of the milestone to assign to the issue. On update milestone will be removed if set to null.'
- argument :add_label_ids, [GraphQL::ID_TYPE],
+ argument :add_label_ids, [GraphQL::Types::ID],
required: false,
- description: 'The IDs of labels to be added to the issue.'
+ description: 'IDs of labels to be added to the issue.'
- argument :remove_label_ids, [GraphQL::ID_TYPE],
+ argument :remove_label_ids, [GraphQL::Types::ID],
required: false,
- description: 'The IDs of labels to be removed from the issue.'
+ description: 'IDs of labels to be removed from the issue.'
+
+ argument :label_ids, [GraphQL::Types::ID],
+ required: false,
+ description: 'IDs of labels to be set. Replaces existing issue labels.'
argument :state_event, Types::IssueStateEventEnum,
description: 'Close or reopen an issue.',
@@ -31,6 +35,8 @@ module Mutations
issue = authorized_find!(project_path: project_path, iid: iid)
project = issue.project
+ args = parse_arguments(args)
+
spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
::Issues::UpdateService.new(project: project, current_user: current_user, params: args, spam_params: spam_params).execute(issue)
@@ -39,6 +45,32 @@ module Mutations
errors: errors_on_object(issue)
}
end
+
+ def ready?(label_ids: [], add_label_ids: [], remove_label_ids: [], **args)
+ if label_ids.any? && (add_label_ids.any? || remove_label_ids.any?)
+ raise Gitlab::Graphql::Errors::ArgumentError, 'labelIds is mutually exclusive with any of addLabelIds or removeLabelIds'
+ end
+
+ super
+ end
+
+ private
+
+ def parse_arguments(args)
+ args[:add_label_ids] = parse_label_ids(args[:add_label_ids])
+ args[:remove_label_ids] = parse_label_ids(args[:remove_label_ids])
+ args[:label_ids] = parse_label_ids(args[:label_ids])
+
+ args
+ end
+
+ def parse_label_ids(ids)
+ ids&.map do |gid|
+ GitlabSchema.parse_gid(gid, expected_type: ::Label).model_id
+ rescue Gitlab::Graphql::Errors::ArgumentError
+ gid
+ end
+ end
end
end
end