Welcome to mirror list, hosted at ThFree Co, Russian Federation.

set_assignees.rb « alerts « alert_management « mutations « graphql « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 500e2b868b1210700e055f22c823c4c5519bac25 (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
58
# frozen_string_literal: true

module Mutations
  module AlertManagement
    module Alerts
      class SetAssignees < Base
        graphql_name 'AlertSetAssignees'

        argument :assignee_usernames,
                 [GraphQL::Types::String],
                 required: true,
                 description: 'Usernames to assign to the alert. Replaces existing assignees by default.'

        argument :operation_mode,
                 Types::MutationOperationModeEnum,
                 required: false,
                 description: 'Operation to perform. Defaults to REPLACE.'

        def resolve(args)
          alert = authorized_find!(project_path: args[:project_path], iid: args[:iid])
          result = set_assignees(alert, args[:assignee_usernames], args[:operation_mode])

          track_alert_events('incident_management_alert_assigned', alert)

          prepare_response(result)
        end

        private

        def set_assignees(alert, assignee_usernames, operation_mode)
          operation_mode ||= Types::MutationOperationModeEnum.enum[:replace]

          original_assignees = alert.assignees
          target_users = find_target_users(assignee_usernames)

          assignees = case Types::MutationOperationModeEnum.enum.key(operation_mode).to_sym
                      when :replace then target_users.uniq
                      when :append then (original_assignees + target_users).uniq
                      when :remove then (original_assignees - target_users)
                      end

          ::AlertManagement::Alerts::UpdateService.new(alert, current_user, assignees: assignees).execute
        end

        def find_target_users(assignee_usernames)
          UsersFinder.new(current_user, username: assignee_usernames).execute
        end

        def prepare_response(result)
          {
            alert: result.payload[:alert],
            errors: result.error? ? [result.message] : []
          }
        end
      end
    end
  end
end