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

create.rb « lists « boards « mutations « graphql « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4f545709ee9af7bd4652b3a4294dba2991be79af (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# frozen_string_literal: true

module Mutations
  module Boards
    module Lists
      class Create < Base
        graphql_name 'BoardListCreate'

        argument :backlog, GraphQL::BOOLEAN_TYPE,
                 required: false,
                 description: 'Create the backlog list'

        argument :label_id, ::Types::GlobalIDType[::Label],
                 required: false,
                 description: 'ID of an existing label'

        def ready?(**args)
          if args.slice(*mutually_exclusive_args).size != 1
            arg_str = mutually_exclusive_args.map { |x| x.to_s.camelize(:lower) }.join(' or ')
            raise Gitlab::Graphql::Errors::ArgumentError, "one and only one of #{arg_str} is required"
          end

          super
        end

        def resolve(**args)
          board  = authorized_find!(id: args[:board_id])
          params = create_list_params(args)

          authorize_list_type_resource!(board, params)

          list = create_list(board, params)

          {
            list: list.valid? ? list : nil,
            errors: errors_on_object(list)
          }
        end

        private

        def authorize_list_type_resource!(board, params)
          return unless params[:label_id]

          labels = ::Labels::AvailableLabelsService.new(current_user, board.resource_parent, params)
            .filter_labels_ids_in_param(:label_id)

          unless labels.present?
            raise Gitlab::Graphql::Errors::ArgumentError, 'Label not found!'
          end
        end

        def create_list(board, params)
          create_list_service =
            ::Boards::Lists::CreateService.new(board.resource_parent, current_user, params)

          create_list_service.execute(board)
        end

        def create_list_params(args)
          params = args.slice(*mutually_exclusive_args).with_indifferent_access
          params[:label_id] = GitlabSchema.parse_gid(params[:label_id]).model_id if params[:label_id]

          params
        end

        def mutually_exclusive_args
          [:backlog, :label_id]
        end
      end
    end
  end
end