summaryrefslogtreecommitdiff
path: root/app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb
blob: 17f9b5b5637f6b059727d9e73c5ce46fd4d3397e (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
# 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'

        Labkit::Context::KNOWN_KEYS.each do |key|
          argument key,
                   GraphQL::STRING_TYPE,
                   required: false,
                   description: "Delete jobs matching #{key} in the context metadata"
        end

        argument :queue_name,
                 GraphQL::STRING_TYPE,
                 required: true,
                 description: 'The 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