summaryrefslogtreecommitdiff
path: root/app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb
blob: c4f91d0c15cac8c5e614dc683bf5570919a959da (plain)
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
# frozen_string_literal: true

module Mutations
  module Admin
    module SidekiqQueues
      class DeleteJobs < BaseMutation
        graphql_name 'AdminSidekiqQueuesDeleteJobs'

        ADMIN_MESSAGE = 'You must be an admin to use this mutation'

        ::Gitlab::ApplicationContext::KNOWN_KEYS.each do |key|
          argument key,
                   GraphQL::Types::String,
                   required: false,
                   description: "Delete jobs matching #{key} in the context metadata."
        end

        argument ::Gitlab::SidekiqQueue::WORKER_KEY,
                 GraphQL::Types::String,
                 required: false,
                 description: 'Delete jobs with the given worker class.'

        argument :queue_name,
                 GraphQL::Types::String,
                 required: true,
                 description: 'Name of the queue to delete jobs from.'

        field :result,
              Types::Admin::SidekiqQueues::DeleteJobsResponseType,
              null: true,
              description: 'Information about the status of the deletion request.'

        def ready?(**args)
          unless current_user&.admin?
            raise Gitlab::Graphql::Errors::ResourceNotAvailable, ADMIN_MESSAGE
          end

          super
        end

        def resolve(queue_name:, **args)
          {
            result: Gitlab::SidekiqQueue.new(queue_name).drop_jobs!(args, timeout: 30),
            errors: []
          }
        rescue Gitlab::SidekiqQueue::NoMetadataError
          {
            result: nil,
            errors: ['No metadata provided']
          }
        rescue Gitlab::SidekiqQueue::InvalidQueueError
          raise Gitlab::Graphql::Errors::ResourceNotAvailable, "Queue #{queue_name} not found"
        end
      end
    end
  end
end