diff options
Diffstat (limited to 'app/graphql/mutations/issues')
-rw-r--r-- | app/graphql/mutations/issues/base.rb | 10 | ||||
-rw-r--r-- | app/graphql/mutations/issues/common_mutation_arguments.rb | 6 | ||||
-rw-r--r-- | app/graphql/mutations/issues/create.rb | 24 | ||||
-rw-r--r-- | app/graphql/mutations/issues/move.rb | 4 | ||||
-rw-r--r-- | app/graphql/mutations/issues/set_confidential.rb | 2 | ||||
-rw-r--r-- | app/graphql/mutations/issues/set_due_date.rb | 13 | ||||
-rw-r--r-- | app/graphql/mutations/issues/set_locked.rb | 2 | ||||
-rw-r--r-- | app/graphql/mutations/issues/set_subscription.rb | 10 | ||||
-rw-r--r-- | app/graphql/mutations/issues/update.rb | 46 |
9 files changed, 70 insertions, 47 deletions
diff --git a/app/graphql/mutations/issues/base.rb b/app/graphql/mutations/issues/base.rb index b25987a43f6..2a61e8918a8 100644 --- a/app/graphql/mutations/issues/base.rb +++ b/app/graphql/mutations/issues/base.rb @@ -5,18 +5,18 @@ module Mutations class Base < BaseMutation include Mutations::ResolvesIssuable - argument :project_path, GraphQL::ID_TYPE, + argument :project_path, GraphQL::Types::ID, required: true, - description: "The project the issue to mutate is in." + description: "Project the issue to mutate is in." - argument :iid, GraphQL::STRING_TYPE, + argument :iid, GraphQL::Types::String, required: true, - description: "The IID of the issue to mutate." + description: "IID of the issue to mutate." field :issue, Types::IssueType, null: true, - description: "The issue after mutation." + description: "Issue after mutation." authorize :update_issue diff --git a/app/graphql/mutations/issues/common_mutation_arguments.rb b/app/graphql/mutations/issues/common_mutation_arguments.rb index 65768b85d14..36fd94716a6 100644 --- a/app/graphql/mutations/issues/common_mutation_arguments.rb +++ b/app/graphql/mutations/issues/common_mutation_arguments.rb @@ -6,7 +6,7 @@ module Mutations extend ActiveSupport::Concern included do - argument :description, GraphQL::STRING_TYPE, + argument :description, GraphQL::Types::String, required: false, description: copy_field_description(Types::IssueType, :description) @@ -14,11 +14,11 @@ module Mutations required: false, description: copy_field_description(Types::IssueType, :due_date) - argument :confidential, GraphQL::BOOLEAN_TYPE, + argument :confidential, GraphQL::Types::Boolean, required: false, description: copy_field_description(Types::IssueType, :confidential) - argument :locked, GraphQL::BOOLEAN_TYPE, + argument :locked, GraphQL::Types::Boolean, as: :discussion_locked, required: false, description: copy_field_description(Types::IssueType, :discussion_locked) diff --git a/app/graphql/mutations/issues/create.rb b/app/graphql/mutations/issues/create.rb index 7c4a851f8aa..32f96f1bfe6 100644 --- a/app/graphql/mutations/issues/create.rb +++ b/app/graphql/mutations/issues/create.rb @@ -10,29 +10,29 @@ module Mutations include CommonMutationArguments - argument :project_path, GraphQL::ID_TYPE, + argument :project_path, GraphQL::Types::ID, required: true, description: 'Project full path the issue is associated with.' - argument :iid, GraphQL::INT_TYPE, + argument :iid, GraphQL::Types::Int, required: false, - description: 'The IID (internal ID) of a project issue. Only admins and project owners can modify.' + description: 'IID (internal ID) of a project issue. Only admins and project owners can modify.' - argument :title, GraphQL::STRING_TYPE, + argument :title, GraphQL::Types::String, required: true, description: copy_field_description(Types::IssueType, :title) argument :milestone_id, ::Types::GlobalIDType[::Milestone], 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 :labels, [GraphQL::STRING_TYPE], + argument :labels, [GraphQL::Types::String], required: false, description: copy_field_description(Types::IssueType, :labels) argument :label_ids, [::Types::GlobalIDType[::Label]], required: false, - description: 'The IDs of labels to be added to the issue.' + description: 'IDs of labels to be added to the issue.' argument :created_at, Types::TimeType, required: false, @@ -40,20 +40,20 @@ module Mutations argument :merge_request_to_resolve_discussions_of, ::Types::GlobalIDType[::MergeRequest], required: false, - description: 'The IID of a merge request for which to resolve discussions.' + description: 'IID of a merge request for which to resolve discussions.' - argument :discussion_to_resolve, GraphQL::STRING_TYPE, + argument :discussion_to_resolve, GraphQL::Types::String, required: false, - description: 'The ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.' + description: 'ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.' argument :assignee_ids, [::Types::GlobalIDType[::User]], required: false, - description: 'The array of user IDs to assign to the issue.' + description: 'Array of user IDs to assign to the issue.' field :issue, Types::IssueType, null: true, - description: 'The issue after mutation.' + description: 'Issue after mutation.' def ready?(**args) if args.slice(*mutually_exclusive_label_args).size > 1 diff --git a/app/graphql/mutations/issues/move.rb b/app/graphql/mutations/issues/move.rb index cb4f0f42b38..fb22a2d891c 100644 --- a/app/graphql/mutations/issues/move.rb +++ b/app/graphql/mutations/issues/move.rb @@ -6,9 +6,9 @@ module Mutations graphql_name 'IssueMove' argument :target_project_path, - GraphQL::ID_TYPE, + GraphQL::Types::ID, required: true, - description: 'The project to move the issue to.' + description: 'Project to move the issue to.' def resolve(project_path:, iid:, target_project_path:) Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20816') diff --git a/app/graphql/mutations/issues/set_confidential.rb b/app/graphql/mutations/issues/set_confidential.rb index cfee2420ee0..35e629ddc90 100644 --- a/app/graphql/mutations/issues/set_confidential.rb +++ b/app/graphql/mutations/issues/set_confidential.rb @@ -8,7 +8,7 @@ module Mutations graphql_name 'IssueSetConfidential' argument :confidential, - GraphQL::BOOLEAN_TYPE, + GraphQL::Types::Boolean, required: true, description: 'Whether or not to set the issue as a confidential.' diff --git a/app/graphql/mutations/issues/set_due_date.rb b/app/graphql/mutations/issues/set_due_date.rb index 9cefac96b25..70b76da4fcb 100644 --- a/app/graphql/mutations/issues/set_due_date.rb +++ b/app/graphql/mutations/issues/set_due_date.rb @@ -7,17 +7,8 @@ module Mutations argument :due_date, Types::TimeType, - required: false, - description: 'The desired due date for the issue, ' \ - 'due date will be removed if absent or set to null' - - def ready?(**args) - unless args.key?(:due_date) - raise Gitlab::Graphql::Errors::ArgumentError, 'Argument dueDate must be provided (`null` accepted)' - end - - super - end + required: :nullable, + description: 'Desired due date for the issue. Due date is removed if null.' def resolve(project_path:, iid:, due_date:) issue = authorized_find!(project_path: project_path, iid: iid) diff --git a/app/graphql/mutations/issues/set_locked.rb b/app/graphql/mutations/issues/set_locked.rb index 3a696a64dad..93b31350bbf 100644 --- a/app/graphql/mutations/issues/set_locked.rb +++ b/app/graphql/mutations/issues/set_locked.rb @@ -6,7 +6,7 @@ module Mutations graphql_name 'IssueSetLocked' argument :locked, - GraphQL::BOOLEAN_TYPE, + GraphQL::Types::Boolean, required: true, description: 'Whether or not to lock discussion on the issue.' diff --git a/app/graphql/mutations/issues/set_subscription.rb b/app/graphql/mutations/issues/set_subscription.rb index 55c9049b7cf..1d4fa0eefd8 100644 --- a/app/graphql/mutations/issues/set_subscription.rb +++ b/app/graphql/mutations/issues/set_subscription.rb @@ -8,18 +8,18 @@ module Mutations include ResolvesSubscription include Mutations::ResolvesIssuable - argument :project_path, GraphQL::ID_TYPE, + argument :project_path, GraphQL::Types::ID, required: true, - description: "The project the issue to mutate is in." + description: "Project the issue to mutate is in." - argument :iid, GraphQL::STRING_TYPE, + argument :iid, GraphQL::Types::String, required: true, - description: "The IID of the issue to mutate." + description: "IID of the issue to mutate." field :issue, Types::IssueType, null: true, - description: "The issue after mutation." + description: "Issue after mutation." authorize :update_subscription 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 |