1# frozen_string_literal: true
2
3module Resolvers
4  module DesignManagement
5    module Version
6      # Resolver for DesignAtVersion objects given an implicit version context
7      class DesignsAtVersionResolver < BaseResolver
8        include Gitlab::Graphql::Authorize::AuthorizeResource
9
10        type Types::DesignManagement::DesignAtVersionType, null: true
11
12        authorize :read_design
13
14        DesignID = ::Types::GlobalIDType[::DesignManagement::Design]
15
16        argument :ids, [DesignID],
17                 required: false,
18                 description: 'Filters designs by their ID.'
19        argument :filenames,
20                 [GraphQL::Types::String],
21                 required: false,
22                 description: 'Filters designs by their filename.'
23
24        def self.single
25          ::Resolvers::DesignManagement::Version::DesignAtVersionResolver
26        end
27
28        def resolve(ids: nil, filenames: nil)
29          find(ids, filenames).execute.map { |d| make(d) }
30        end
31
32        private
33
34        def find(ids, filenames)
35          ::DesignManagement::DesignsFinder.new(issue, current_user,
36                                                ids: design_ids(ids),
37                                                filenames: filenames,
38                                                visible_at_version: version)
39        end
40
41        def design_ids(gids)
42          return if gids.nil?
43
44          # TODO: remove this line when the compatibility layer is removed
45          # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
46          gids = gids.map { |id| DesignID.coerce_isolated_input(id) }
47          gids.map(&:model_id)
48        end
49
50        def issue
51          version.issue
52        end
53
54        def version
55          object
56        end
57
58        def make(design)
59          ::DesignManagement::DesignAtVersion.new(design: design, version: version)
60        end
61      end
62    end
63  end
64end
65