summaryrefslogtreecommitdiff
path: root/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb
blob: 5ccb2f3e3110a76c6fbeb080488afbaec6a6b5a4 (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
# frozen_string_literal: true

module Resolvers
  module DesignManagement
    module Version
      # Resolver for DesignAtVersion objects given an implicit version context
      class DesignsAtVersionResolver < BaseResolver
        include Gitlab::Graphql::Authorize::AuthorizeResource

        type Types::DesignManagement::DesignAtVersionType, null: true

        authorize :read_design

        argument :ids,
                 [GraphQL::ID_TYPE],
                 required: false,
                 description: 'Filters designs by their ID'
        argument :filenames,
                 [GraphQL::STRING_TYPE],
                 required: false,
                 description: 'Filters designs by their filename'

        def self.single
          ::Resolvers::DesignManagement::Version::DesignAtVersionResolver
        end

        def resolve(ids: nil, filenames: nil)
          find(ids, filenames).execute.map { |d| make(d) }
        end

        private

        def find(ids, filenames)
          ids = ids&.map { |id| parse_design_id(id).model_id }

          ::DesignManagement::DesignsFinder.new(issue, current_user,
                                                ids: ids,
                                                filenames: filenames,
                                                visible_at_version: version)
        end

        def parse_design_id(id)
          GitlabSchema.parse_gid(id, expected_type: ::DesignManagement::Design)
        end

        def issue
          version.issue
        end

        def version
          object
        end

        def make(design)
          ::DesignManagement::DesignAtVersion.new(design: design, version: version)
        end
      end
    end
  end
end