summaryrefslogtreecommitdiff
path: root/app/graphql/mutations
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/mutations')
-rw-r--r--app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb2
-rw-r--r--app/graphql/mutations/alert_management/http_integration/create.rb4
-rw-r--r--app/graphql/mutations/alert_management/prometheus_integration/create.rb4
-rw-r--r--app/graphql/mutations/boards/create.rb3
-rw-r--r--app/graphql/mutations/branches/create.rb4
-rw-r--r--app/graphql/mutations/ci/ci_cd_settings_update.rb4
-rw-r--r--app/graphql/mutations/ci/job_token_scope/add_project.rb4
-rw-r--r--app/graphql/mutations/ci/job_token_scope/remove_project.rb4
-rw-r--r--app/graphql/mutations/ci/runner/delete.rb2
-rw-r--r--app/graphql/mutations/ci/runner/update.rb7
-rw-r--r--app/graphql/mutations/clusters/agents/create.rb4
-rw-r--r--app/graphql/mutations/commits/create.rb4
-rw-r--r--app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb51
-rw-r--r--app/graphql/mutations/container_expiration_policies/update.rb4
-rw-r--r--app/graphql/mutations/container_repositories/destroy_tags.rb5
-rw-r--r--app/graphql/mutations/custom_emoji/create.rb4
-rw-r--r--app/graphql/mutations/customer_relations/contacts/create.rb4
-rw-r--r--app/graphql/mutations/customer_relations/contacts/update.rb4
-rw-r--r--app/graphql/mutations/customer_relations/organizations/create.rb4
-rw-r--r--app/graphql/mutations/customer_relations/organizations/update.rb4
-rw-r--r--app/graphql/mutations/dependency_proxy/group_settings/update.rb4
-rw-r--r--app/graphql/mutations/dependency_proxy/image_ttl_group_policy/update.rb4
-rw-r--r--app/graphql/mutations/design_management/delete.rb4
-rw-r--r--app/graphql/mutations/groups/update.rb4
-rw-r--r--app/graphql/mutations/issues/create.rb19
-rw-r--r--app/graphql/mutations/issues/set_confidential.rb4
-rw-r--r--app/graphql/mutations/issues/set_escalation_status.rb6
-rw-r--r--app/graphql/mutations/jira_import/import_users.rb4
-rw-r--r--app/graphql/mutations/jira_import/start.rb4
-rw-r--r--app/graphql/mutations/labels/create.rb4
-rw-r--r--app/graphql/mutations/merge_requests/accept.rb12
-rw-r--r--app/graphql/mutations/merge_requests/create.rb4
-rw-r--r--app/graphql/mutations/namespace/package_settings/update.rb4
-rw-r--r--app/graphql/mutations/release_asset_links/create.rb7
-rw-r--r--app/graphql/mutations/snippets/create.rb5
-rw-r--r--app/graphql/mutations/snippets/update.rb5
-rw-r--r--app/graphql/mutations/user_preferences/update.rb28
-rw-r--r--app/graphql/mutations/work_items/create.rb18
-rw-r--r--app/graphql/mutations/work_items/delete.rb47
-rw-r--r--app/graphql/mutations/work_items/update.rb61
40 files changed, 241 insertions, 133 deletions
diff --git a/app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb b/app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb
index c4f91d0c15c..b1db355aa40 100644
--- a/app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb
+++ b/app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb
@@ -8,7 +8,7 @@ module Mutations
ADMIN_MESSAGE = 'You must be an admin to use this mutation'
- ::Gitlab::ApplicationContext::KNOWN_KEYS.each do |key|
+ ::Gitlab::ApplicationContext.known_keys.each do |key|
argument key,
GraphQL::Types::String,
required: false,
diff --git a/app/graphql/mutations/alert_management/http_integration/create.rb b/app/graphql/mutations/alert_management/http_integration/create.rb
index 04840ac43bd..f8d1a383706 100644
--- a/app/graphql/mutations/alert_management/http_integration/create.rb
+++ b/app/graphql/mutations/alert_management/http_integration/create.rb
@@ -4,10 +4,10 @@ module Mutations
module AlertManagement
module HttpIntegration
class Create < HttpIntegrationBase
- include FindsProject
-
graphql_name 'HttpIntegrationCreate'
+ include FindsProject
+
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Project to create the integration in.'
diff --git a/app/graphql/mutations/alert_management/prometheus_integration/create.rb b/app/graphql/mutations/alert_management/prometheus_integration/create.rb
index 0153bd0e42a..9c3aefce033 100644
--- a/app/graphql/mutations/alert_management/prometheus_integration/create.rb
+++ b/app/graphql/mutations/alert_management/prometheus_integration/create.rb
@@ -4,10 +4,10 @@ module Mutations
module AlertManagement
module PrometheusIntegration
class Create < PrometheusIntegrationBase
- include FindsProject
-
graphql_name 'PrometheusIntegrationCreate'
+ include FindsProject
+
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Project to create the integration in.'
diff --git a/app/graphql/mutations/boards/create.rb b/app/graphql/mutations/boards/create.rb
index 080bf7c6e79..773ba08a291 100644
--- a/app/graphql/mutations/boards/create.rb
+++ b/app/graphql/mutations/boards/create.rb
@@ -3,10 +3,9 @@
module Mutations
module Boards
class Create < ::Mutations::BaseMutation
- include Mutations::ResolvesResourceParent
-
graphql_name 'CreateBoard'
+ include Mutations::ResolvesResourceParent
include Mutations::Boards::CommonMutationArguments
field :board,
diff --git a/app/graphql/mutations/branches/create.rb b/app/graphql/mutations/branches/create.rb
index 078c84bcdc0..b851622bfde 100644
--- a/app/graphql/mutations/branches/create.rb
+++ b/app/graphql/mutations/branches/create.rb
@@ -3,10 +3,10 @@
module Mutations
module Branches
class Create < BaseMutation
- include FindsProject
-
graphql_name 'CreateBranch'
+ include FindsProject
+
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Project full path the branch is associated with.'
diff --git a/app/graphql/mutations/ci/ci_cd_settings_update.rb b/app/graphql/mutations/ci/ci_cd_settings_update.rb
index 7bd38bc2998..dec90ced962 100644
--- a/app/graphql/mutations/ci/ci_cd_settings_update.rb
+++ b/app/graphql/mutations/ci/ci_cd_settings_update.rb
@@ -3,10 +3,10 @@
module Mutations
module Ci
class CiCdSettingsUpdate < BaseMutation
- include FindsProject
-
graphql_name 'CiCdSettingsUpdate'
+ include FindsProject
+
authorize :admin_project
argument :full_path, GraphQL::Types::ID,
diff --git a/app/graphql/mutations/ci/job_token_scope/add_project.rb b/app/graphql/mutations/ci/job_token_scope/add_project.rb
index 41adcae2c82..e16c08cb116 100644
--- a/app/graphql/mutations/ci/job_token_scope/add_project.rb
+++ b/app/graphql/mutations/ci/job_token_scope/add_project.rb
@@ -4,10 +4,10 @@ module Mutations
module Ci
module JobTokenScope
class AddProject < BaseMutation
- include FindsProject
-
graphql_name 'CiJobTokenScopeAddProject'
+ include FindsProject
+
authorize :admin_project
argument :project_path, GraphQL::Types::ID,
diff --git a/app/graphql/mutations/ci/job_token_scope/remove_project.rb b/app/graphql/mutations/ci/job_token_scope/remove_project.rb
index dd6b2358dd5..f503b4f2f7a 100644
--- a/app/graphql/mutations/ci/job_token_scope/remove_project.rb
+++ b/app/graphql/mutations/ci/job_token_scope/remove_project.rb
@@ -4,10 +4,10 @@ module Mutations
module Ci
module JobTokenScope
class RemoveProject < BaseMutation
- include FindsProject
-
graphql_name 'CiJobTokenScopeRemoveProject'
+ include FindsProject
+
authorize :admin_project
argument :project_path, GraphQL::Types::ID,
diff --git a/app/graphql/mutations/ci/runner/delete.rb b/app/graphql/mutations/ci/runner/delete.rb
index 88dc426398b..21c3d55881c 100644
--- a/app/graphql/mutations/ci/runner/delete.rb
+++ b/app/graphql/mutations/ci/runner/delete.rb
@@ -20,7 +20,7 @@ module Mutations
error = authenticate_delete_runner!(runner)
return { errors: [error] } if error
- runner.destroy!
+ ::Ci::UnregisterRunnerService.new(runner).execute
{ errors: runner.errors.full_messages }
end
diff --git a/app/graphql/mutations/ci/runner/update.rb b/app/graphql/mutations/ci/runner/update.rb
index e37ab1081f9..e6123b4283a 100644
--- a/app/graphql/mutations/ci/runner/update.rb
+++ b/app/graphql/mutations/ci/runner/update.rb
@@ -28,7 +28,12 @@ module Mutations
argument :active, GraphQL::Types::Boolean,
required: false,
- description: 'Indicates the runner is allowed to receive jobs.'
+ description: 'Indicates the runner is allowed to receive jobs.',
+ deprecated: { reason: :renamed, replacement: 'paused', milestone: '14.8' }
+
+ argument :paused, GraphQL::Types::Boolean,
+ required: false,
+ description: 'Indicates the runner is not allowed to receive jobs.'
argument :locked, GraphQL::Types::Boolean, required: false,
description: 'Indicates the runner is locked.'
diff --git a/app/graphql/mutations/clusters/agents/create.rb b/app/graphql/mutations/clusters/agents/create.rb
index 0896cc7b203..deaa9c2d656 100644
--- a/app/graphql/mutations/clusters/agents/create.rb
+++ b/app/graphql/mutations/clusters/agents/create.rb
@@ -4,12 +4,12 @@ module Mutations
module Clusters
module Agents
class Create < BaseMutation
+ graphql_name 'CreateClusterAgent'
+
include FindsProject
authorize :create_cluster
- graphql_name 'CreateClusterAgent'
-
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Full path of the associated project for this cluster agent.'
diff --git a/app/graphql/mutations/commits/create.rb b/app/graphql/mutations/commits/create.rb
index 3eb1912dbc4..00ec64becc8 100644
--- a/app/graphql/mutations/commits/create.rb
+++ b/app/graphql/mutations/commits/create.rb
@@ -3,6 +3,8 @@
module Mutations
module Commits
class Create < BaseMutation
+ graphql_name 'CommitCreate'
+
include FindsProject
class UrlHelpers
@@ -10,8 +12,6 @@ module Mutations
include Gitlab::Routing
end
- graphql_name 'CommitCreate'
-
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Project full path the branch is associated with.'
diff --git a/app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb b/app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb
deleted file mode 100644
index f1ae54aa014..00000000000
--- a/app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# frozen_string_literal: true
-
-module Mutations
- # This concern is deprecated and will be deleted in 14.6
- #
- # Use the SpamProtection concern instead.
- module CanMutateSpammable
- extend ActiveSupport::Concern
-
- DEPRECATION_NOTICE = {
- reason: 'Use spam protection with HTTP headers instead',
- milestone: '13.11'
- }.freeze
-
- included do
- argument :captcha_response, GraphQL::Types::String,
- required: false,
- deprecated: DEPRECATION_NOTICE,
- description: 'Valid CAPTCHA response value obtained by using the provided captchaSiteKey with a CAPTCHA API to present a challenge to be solved on the client. Required to resubmit if the previous operation returned "NeedsCaptchaResponse: true".'
-
- argument :spam_log_id, GraphQL::Types::Int,
- required: false,
- deprecated: DEPRECATION_NOTICE,
- description: 'Spam log ID which must be passed along with a valid CAPTCHA response for the operation to be completed. Required to resubmit if the previous operation returned "NeedsCaptchaResponse: true".'
-
- field :spam,
- GraphQL::Types::Boolean,
- null: true,
- deprecated: DEPRECATION_NOTICE,
- description: 'Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response.'
-
- field :needs_captcha_response,
- GraphQL::Types::Boolean,
- null: true,
- deprecated: DEPRECATION_NOTICE,
- description: 'Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true.'
-
- field :spam_log_id,
- GraphQL::Types::Int,
- null: true,
- deprecated: DEPRECATION_NOTICE,
- description: 'Spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true.'
-
- field :captcha_site_key,
- GraphQL::Types::String,
- null: true,
- deprecated: DEPRECATION_NOTICE,
- description: 'CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because "NeedsCaptchaResponse" is true.'
- end
- end
-end
diff --git a/app/graphql/mutations/container_expiration_policies/update.rb b/app/graphql/mutations/container_expiration_policies/update.rb
index db4acadfc38..762058acf3d 100644
--- a/app/graphql/mutations/container_expiration_policies/update.rb
+++ b/app/graphql/mutations/container_expiration_policies/update.rb
@@ -3,10 +3,10 @@
module Mutations
module ContainerExpirationPolicies
class Update < Mutations::BaseMutation
- include FindsProject
-
graphql_name 'UpdateContainerExpirationPolicy'
+ include FindsProject
+
authorize :destroy_container_image
argument :project_path,
diff --git a/app/graphql/mutations/container_repositories/destroy_tags.rb b/app/graphql/mutations/container_repositories/destroy_tags.rb
index c2737820d22..7777f903516 100644
--- a/app/graphql/mutations/container_repositories/destroy_tags.rb
+++ b/app/graphql/mutations/container_repositories/destroy_tags.rb
@@ -3,12 +3,11 @@
module Mutations
module ContainerRepositories
class DestroyTags < ::Mutations::ContainerRepositories::DestroyBase
- LIMIT = 20
+ graphql_name 'DestroyContainerRepositoryTags'
+ LIMIT = 20
TOO_MANY_TAGS_ERROR_MESSAGE = "Number of tags is greater than #{LIMIT}"
- graphql_name 'DestroyContainerRepositoryTags'
-
authorize :destroy_container_image
argument :id,
diff --git a/app/graphql/mutations/custom_emoji/create.rb b/app/graphql/mutations/custom_emoji/create.rb
index ad392d6c814..269ea6c9999 100644
--- a/app/graphql/mutations/custom_emoji/create.rb
+++ b/app/graphql/mutations/custom_emoji/create.rb
@@ -3,10 +3,10 @@
module Mutations
module CustomEmoji
class Create < BaseMutation
- include Mutations::ResolvesGroup
-
graphql_name 'CreateCustomEmoji'
+ include Mutations::ResolvesGroup
+
authorize :create_custom_emoji
field :custom_emoji,
diff --git a/app/graphql/mutations/customer_relations/contacts/create.rb b/app/graphql/mutations/customer_relations/contacts/create.rb
index 3495f30f227..96dc047c3db 100644
--- a/app/graphql/mutations/customer_relations/contacts/create.rb
+++ b/app/graphql/mutations/customer_relations/contacts/create.rb
@@ -4,11 +4,11 @@ module Mutations
module CustomerRelations
module Contacts
class Create < BaseMutation
+ graphql_name 'CustomerRelationsContactCreate'
+
include ResolvesIds
include Gitlab::Graphql::Authorize::AuthorizeResource
- graphql_name 'CustomerRelationsContactCreate'
-
field :contact,
Types::CustomerRelations::ContactType,
null: true,
diff --git a/app/graphql/mutations/customer_relations/contacts/update.rb b/app/graphql/mutations/customer_relations/contacts/update.rb
index e2f671058f0..a3abf37f21f 100644
--- a/app/graphql/mutations/customer_relations/contacts/update.rb
+++ b/app/graphql/mutations/customer_relations/contacts/update.rb
@@ -4,10 +4,10 @@ module Mutations
module CustomerRelations
module Contacts
class Update < Mutations::BaseMutation
- include ResolvesIds
-
graphql_name 'CustomerRelationsContactUpdate'
+ include ResolvesIds
+
authorize :admin_crm_contact
field :contact,
diff --git a/app/graphql/mutations/customer_relations/organizations/create.rb b/app/graphql/mutations/customer_relations/organizations/create.rb
index 17e0e9ad459..43c50a9fb30 100644
--- a/app/graphql/mutations/customer_relations/organizations/create.rb
+++ b/app/graphql/mutations/customer_relations/organizations/create.rb
@@ -4,11 +4,11 @@ module Mutations
module CustomerRelations
module Organizations
class Create < BaseMutation
+ graphql_name 'CustomerRelationsOrganizationCreate'
+
include ResolvesIds
include Gitlab::Graphql::Authorize::AuthorizeResource
- graphql_name 'CustomerRelationsOrganizationCreate'
-
field :organization,
Types::CustomerRelations::OrganizationType,
null: true,
diff --git a/app/graphql/mutations/customer_relations/organizations/update.rb b/app/graphql/mutations/customer_relations/organizations/update.rb
index 21fcf565239..0c05541dbd7 100644
--- a/app/graphql/mutations/customer_relations/organizations/update.rb
+++ b/app/graphql/mutations/customer_relations/organizations/update.rb
@@ -4,10 +4,10 @@ module Mutations
module CustomerRelations
module Organizations
class Update < Mutations::BaseMutation
- include ResolvesIds
-
graphql_name 'CustomerRelationsOrganizationUpdate'
+ include ResolvesIds
+
authorize :admin_crm_organization
field :organization,
diff --git a/app/graphql/mutations/dependency_proxy/group_settings/update.rb b/app/graphql/mutations/dependency_proxy/group_settings/update.rb
index d10e43cde29..65c919db3c3 100644
--- a/app/graphql/mutations/dependency_proxy/group_settings/update.rb
+++ b/app/graphql/mutations/dependency_proxy/group_settings/update.rb
@@ -4,10 +4,10 @@ module Mutations
module DependencyProxy
module GroupSettings
class Update < Mutations::BaseMutation
- include Mutations::ResolvesGroup
-
graphql_name 'UpdateDependencyProxySettings'
+ include Mutations::ResolvesGroup
+
authorize :admin_dependency_proxy
argument :group_path,
diff --git a/app/graphql/mutations/dependency_proxy/image_ttl_group_policy/update.rb b/app/graphql/mutations/dependency_proxy/image_ttl_group_policy/update.rb
index a5eb114b2da..79d7a93c4e2 100644
--- a/app/graphql/mutations/dependency_proxy/image_ttl_group_policy/update.rb
+++ b/app/graphql/mutations/dependency_proxy/image_ttl_group_policy/update.rb
@@ -4,10 +4,10 @@ module Mutations
module DependencyProxy
module ImageTtlGroupPolicy
class Update < Mutations::BaseMutation
- include Mutations::ResolvesGroup
-
graphql_name 'UpdateDependencyProxyImageTtlGroupPolicy'
+ include Mutations::ResolvesGroup
+
authorize :admin_dependency_proxy
argument :group_path,
diff --git a/app/graphql/mutations/design_management/delete.rb b/app/graphql/mutations/design_management/delete.rb
index 4e9f0aad934..9e643110628 100644
--- a/app/graphql/mutations/design_management/delete.rb
+++ b/app/graphql/mutations/design_management/delete.rb
@@ -3,10 +3,10 @@
module Mutations
module DesignManagement
class Delete < Base
- Errors = ::Gitlab::Graphql::Errors
-
graphql_name "DesignManagementDelete"
+ Errors = ::Gitlab::Graphql::Errors
+
argument :filenames, [GraphQL::Types::String],
required: true,
description: "Filenames of the designs to delete.",
diff --git a/app/graphql/mutations/groups/update.rb b/app/graphql/mutations/groups/update.rb
index 9c5628a57cd..be7a14d0b43 100644
--- a/app/graphql/mutations/groups/update.rb
+++ b/app/graphql/mutations/groups/update.rb
@@ -3,10 +3,10 @@
module Mutations
module Groups
class Update < Mutations::BaseMutation
- include Mutations::ResolvesGroup
-
graphql_name 'GroupUpdate'
+ include Mutations::ResolvesGroup
+
authorize :admin_group
field :group, Types::GroupType,
diff --git a/app/graphql/mutations/issues/create.rb b/app/graphql/mutations/issues/create.rb
index 72b03cc27c2..6bf8caf82d7 100644
--- a/app/graphql/mutations/issues/create.rb
+++ b/app/graphql/mutations/issues/create.rb
@@ -3,12 +3,12 @@
module Mutations
module Issues
class Create < BaseMutation
+ graphql_name 'CreateIssue'
+
include Mutations::SpamProtection
include FindsProject
include CommonMutationArguments
- graphql_name 'CreateIssue'
-
authorize :create_issue
argument :project_path, GraphQL::Types::ID,
@@ -51,6 +51,14 @@ module Mutations
required: false,
description: 'Array of user IDs to assign to the issue.'
+ argument :move_before_id, ::Types::GlobalIDType[::Issue],
+ required: false,
+ description: 'Global ID of issue that should be placed before the current issue.'
+
+ argument :move_after_id, ::Types::GlobalIDType[::Issue],
+ required: false,
+ description: 'Global ID of issue that should be placed after the current issue.'
+
field :issue,
Types::IssueType,
null: true,
@@ -93,6 +101,13 @@ module Mutations
params[:assignee_ids] &&= params[:assignee_ids].map { |assignee_id| assignee_id&.model_id }
params[:label_ids] &&= params[:label_ids].map { |label_id| label_id&.model_id }
+ if params[:move_before_id].present? || params[:move_after_id].present?
+ params[:move_between_ids] = [
+ params.delete(:move_before_id)&.model_id,
+ params.delete(:move_after_id)&.model_id
+ ]
+ end
+
params
end
diff --git a/app/graphql/mutations/issues/set_confidential.rb b/app/graphql/mutations/issues/set_confidential.rb
index 35e629ddc90..abfd6fec0bd 100644
--- a/app/graphql/mutations/issues/set_confidential.rb
+++ b/app/graphql/mutations/issues/set_confidential.rb
@@ -3,10 +3,10 @@
module Mutations
module Issues
class SetConfidential < Base
- include Mutations::SpamProtection
-
graphql_name 'IssueSetConfidential'
+ include Mutations::SpamProtection
+
argument :confidential,
GraphQL::Types::Boolean,
required: true,
diff --git a/app/graphql/mutations/issues/set_escalation_status.rb b/app/graphql/mutations/issues/set_escalation_status.rb
index 6073b73277b..4f3fcb4886d 100644
--- a/app/graphql/mutations/issues/set_escalation_status.rb
+++ b/app/graphql/mutations/issues/set_escalation_status.rb
@@ -14,7 +14,7 @@ module Mutations
project = issue.project
authorize_escalation_status!(project)
- check_feature_availability!(project, issue)
+ check_feature_availability!(issue)
::Issues::UpdateService.new(
project: project,
@@ -36,8 +36,8 @@ module Mutations
raise_resource_not_available_error!
end
- def check_feature_availability!(project, issue)
- return if Feature.enabled?(:incident_escalations, project) && issue.supports_escalation?
+ def check_feature_availability!(issue)
+ return if issue.supports_escalation?
raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature unavailable for provided issue'
end
diff --git a/app/graphql/mutations/jira_import/import_users.rb b/app/graphql/mutations/jira_import/import_users.rb
index 8d82a058dd0..b3874caee61 100644
--- a/app/graphql/mutations/jira_import/import_users.rb
+++ b/app/graphql/mutations/jira_import/import_users.rb
@@ -3,10 +3,10 @@
module Mutations
module JiraImport
class ImportUsers < BaseMutation
- include FindsProject
-
graphql_name 'JiraImportUsers'
+ include FindsProject
+
authorize :admin_project
field :jira_users,
diff --git a/app/graphql/mutations/jira_import/start.rb b/app/graphql/mutations/jira_import/start.rb
index 4929d6f394a..ea071c45bcf 100644
--- a/app/graphql/mutations/jira_import/start.rb
+++ b/app/graphql/mutations/jira_import/start.rb
@@ -3,10 +3,10 @@
module Mutations
module JiraImport
class Start < BaseMutation
- include FindsProject
-
graphql_name 'JiraImportStart'
+ include FindsProject
+
authorize :admin_project
field :jira_import,
diff --git a/app/graphql/mutations/labels/create.rb b/app/graphql/mutations/labels/create.rb
index cb3ba7939ae..3cd41dc01de 100644
--- a/app/graphql/mutations/labels/create.rb
+++ b/app/graphql/mutations/labels/create.rb
@@ -3,10 +3,10 @@
module Mutations
module Labels
class Create < BaseMutation
- include Mutations::ResolvesResourceParent
-
graphql_name 'LabelCreate'
+ include Mutations::ResolvesResourceParent
+
field :label,
Types::LabelType,
null: true,
diff --git a/app/graphql/mutations/merge_requests/accept.rb b/app/graphql/mutations/merge_requests/accept.rb
index 7ce850901af..ebd9e2b8fdd 100644
--- a/app/graphql/mutations/merge_requests/accept.rb
+++ b/app/graphql/mutations/merge_requests/accept.rb
@@ -3,12 +3,6 @@
module Mutations
module MergeRequests
class Accept < Base
- NOT_MERGEABLE = 'This branch cannot be merged'
- HOOKS_VALIDATION_ERROR = 'Pre-merge hooks failed'
- SHA_MISMATCH = 'The merge-head is not at the anticipated SHA'
- MERGE_FAILED = 'The merge failed'
- ALREADY_SCHEDULED = 'The merge request is already scheduled to be merged'
-
graphql_name 'MergeRequestAccept'
authorize :accept_merge_request
description <<~DESC
@@ -17,6 +11,12 @@ module Mutations
immediately if possible, or using one of the automatic merge strategies.
DESC
+ NOT_MERGEABLE = 'This branch cannot be merged'
+ HOOKS_VALIDATION_ERROR = 'Pre-merge hooks failed'
+ SHA_MISMATCH = 'The merge-head is not at the anticipated SHA'
+ MERGE_FAILED = 'The merge failed'
+ ALREADY_SCHEDULED = 'The merge request is already scheduled to be merged'
+
argument :strategy,
::Types::MergeStrategyEnum,
required: false,
diff --git a/app/graphql/mutations/merge_requests/create.rb b/app/graphql/mutations/merge_requests/create.rb
index dc1d5a22bc9..2883c02a671 100644
--- a/app/graphql/mutations/merge_requests/create.rb
+++ b/app/graphql/mutations/merge_requests/create.rb
@@ -3,10 +3,10 @@
module Mutations
module MergeRequests
class Create < BaseMutation
- include FindsProject
-
graphql_name 'MergeRequestCreate'
+ include FindsProject
+
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Project full path the merge request is associated with.'
diff --git a/app/graphql/mutations/namespace/package_settings/update.rb b/app/graphql/mutations/namespace/package_settings/update.rb
index 400169d6b64..934b75193d7 100644
--- a/app/graphql/mutations/namespace/package_settings/update.rb
+++ b/app/graphql/mutations/namespace/package_settings/update.rb
@@ -4,10 +4,10 @@ module Mutations
module Namespace
module PackageSettings
class Update < Mutations::BaseMutation
- include Mutations::ResolvesNamespace
-
graphql_name 'UpdateNamespacePackageSettings'
+ include Mutations::ResolvesNamespace
+
authorize :create_package_settings
argument :namespace_path,
diff --git a/app/graphql/mutations/release_asset_links/create.rb b/app/graphql/mutations/release_asset_links/create.rb
index db486640507..f6445514ce9 100644
--- a/app/graphql/mutations/release_asset_links/create.rb
+++ b/app/graphql/mutations/release_asset_links/create.rb
@@ -3,14 +3,13 @@
module Mutations
module ReleaseAssetLinks
class Create < BaseMutation
- include FindsProject
-
graphql_name 'ReleaseAssetLinkCreate'
- authorize :create_release
-
+ include FindsProject
include Types::ReleaseAssetLinkSharedInputArguments
+ authorize :create_release
+
argument :project_path, GraphQL::Types::ID,
required: true,
description: 'Full path of the project the asset link is associated with.'
diff --git a/app/graphql/mutations/snippets/create.rb b/app/graphql/mutations/snippets/create.rb
index c01b0e4a01b..2921a77b86d 100644
--- a/app/graphql/mutations/snippets/create.rb
+++ b/app/graphql/mutations/snippets/create.rb
@@ -3,14 +3,13 @@
module Mutations
module Snippets
class Create < BaseMutation
+ graphql_name 'CreateSnippet'
+
include ServiceCompatibility
- include CanMutateSpammable
include Mutations::SpamProtection
authorize :create_snippet
- graphql_name 'CreateSnippet'
-
field :snippet,
Types::SnippetType,
null: true,
diff --git a/app/graphql/mutations/snippets/update.rb b/app/graphql/mutations/snippets/update.rb
index 9ecaa8d4bf2..2a2941c5328 100644
--- a/app/graphql/mutations/snippets/update.rb
+++ b/app/graphql/mutations/snippets/update.rb
@@ -3,12 +3,11 @@
module Mutations
module Snippets
class Update < Base
+ graphql_name 'UpdateSnippet'
+
include ServiceCompatibility
- include CanMutateSpammable
include Mutations::SpamProtection
- graphql_name 'UpdateSnippet'
-
argument :id, ::Types::GlobalIDType[::Snippet],
required: true,
description: 'Global ID of the snippet to update.'
diff --git a/app/graphql/mutations/user_preferences/update.rb b/app/graphql/mutations/user_preferences/update.rb
new file mode 100644
index 00000000000..c92c6d725b7
--- /dev/null
+++ b/app/graphql/mutations/user_preferences/update.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Mutations
+ module UserPreferences
+ class Update < BaseMutation
+ graphql_name 'UserPreferencesUpdate'
+
+ argument :issues_sort, Types::IssueSortEnum,
+ required: false,
+ description: 'Sort order for issue lists.'
+
+ field :user_preferences,
+ Types::UserPreferencesType,
+ null: true,
+ description: 'User preferences after mutation.'
+
+ def resolve(**attributes)
+ user_preferences = current_user.user_preference
+ user_preferences.update(attributes)
+
+ {
+ user_preferences: user_preferences.valid? ? user_preferences : nil,
+ errors: errors_on_object(user_preferences)
+ }
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/work_items/create.rb b/app/graphql/mutations/work_items/create.rb
index 88b8cefd8d2..81454db62b1 100644
--- a/app/graphql/mutations/work_items/create.rb
+++ b/app/graphql/mutations/work_items/create.rb
@@ -3,10 +3,13 @@
module Mutations
module WorkItems
class Create < BaseMutation
+ graphql_name 'WorkItemCreate'
+
include Mutations::SpamProtection
include FindsProject
- graphql_name 'WorkItemCreate'
+ description "Creates a work item." \
+ " Available only when feature flag `work_items` is enabled. The feature is experimental and is subject to change without notice."
authorize :create_work_item
@@ -29,16 +32,21 @@ module Mutations
def resolve(project_path:, **attributes)
project = authorized_find!(project_path)
+
+ unless Feature.enabled?(:work_items, project)
+ return { errors: ['`work_items` feature flag disabled for this project'] }
+ end
+
params = global_id_compatibility_params(attributes).merge(author_id: current_user.id)
spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
- work_item = ::WorkItems::CreateService.new(project: project, current_user: current_user, params: params, spam_params: spam_params).execute
+ create_result = ::WorkItems::CreateService.new(project: project, current_user: current_user, params: params, spam_params: spam_params).execute
- check_spam_action_response!(work_item)
+ check_spam_action_response!(create_result[:work_item]) if create_result[:work_item]
{
- work_item: work_item.valid? ? work_item : nil,
- errors: errors_on_object(work_item)
+ work_item: create_result.success? ? create_result[:work_item] : nil,
+ errors: create_result.errors
}
end
diff --git a/app/graphql/mutations/work_items/delete.rb b/app/graphql/mutations/work_items/delete.rb
new file mode 100644
index 00000000000..71792a802c0
--- /dev/null
+++ b/app/graphql/mutations/work_items/delete.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Mutations
+ module WorkItems
+ class Delete < BaseMutation
+ graphql_name 'WorkItemDelete'
+ description "Deletes a work item." \
+ " Available only when feature flag `work_items` is enabled. The feature is experimental and is subject to change without notice."
+
+ authorize :delete_work_item
+
+ argument :id, ::Types::GlobalIDType[::WorkItem],
+ required: true,
+ description: 'Global ID of the work item.'
+
+ field :project, Types::ProjectType,
+ null: true,
+ description: 'Project the deleted work item belonged to.'
+
+ def resolve(id:)
+ work_item = authorized_find!(id: id)
+
+ unless Feature.enabled?(:work_items, work_item.project)
+ return { errors: ['`work_items` feature flag disabled for this project'] }
+ end
+
+ result = ::WorkItems::DeleteService.new(
+ project: work_item.project,
+ current_user: current_user
+ ).execute(work_item)
+
+ {
+ project: result.success? ? work_item.project : nil,
+ errors: result.errors
+ }
+ end
+
+ private
+
+ def find_object(id:)
+ # TODO: Remove coercion when working on https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = ::Types::GlobalIDType[::WorkItem].coerce_isolated_input(id)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/work_items/update.rb b/app/graphql/mutations/work_items/update.rb
new file mode 100644
index 00000000000..3ab9ba2d502
--- /dev/null
+++ b/app/graphql/mutations/work_items/update.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module Mutations
+ module WorkItems
+ class Update < BaseMutation
+ graphql_name 'WorkItemUpdate'
+ description "Updates a work item by Global ID." \
+ " Available only when feature flag `work_items` is enabled. The feature is experimental and is subject to change without notice."
+
+ include Mutations::SpamProtection
+
+ authorize :update_work_item
+
+ argument :id, ::Types::GlobalIDType[::WorkItem],
+ required: true,
+ description: 'Global ID of the work item.'
+ argument :state_event, Types::WorkItems::StateEventEnum,
+ description: 'Close or reopen a work item.',
+ required: false
+ argument :title, GraphQL::Types::String,
+ required: false,
+ description: copy_field_description(Types::WorkItemType, :title)
+
+ field :work_item, Types::WorkItemType,
+ null: true,
+ description: 'Updated work item.'
+
+ def resolve(id:, **attributes)
+ work_item = authorized_find!(id: id)
+
+ unless Feature.enabled?(:work_items, work_item.project)
+ return { errors: ['`work_items` feature flag disabled for this project'] }
+ end
+
+ spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
+
+ ::WorkItems::UpdateService.new(
+ project: work_item.project,
+ current_user: current_user,
+ params: attributes,
+ spam_params: spam_params
+ ).execute(work_item)
+
+ check_spam_action_response!(work_item)
+
+ {
+ work_item: work_item.valid? ? work_item : nil,
+ errors: errors_on_object(work_item)
+ }
+ end
+
+ private
+
+ def find_object(id:)
+ # TODO: Remove coercion when working on https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = ::Types::GlobalIDType[::WorkItem].coerce_isolated_input(id)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+end