summaryrefslogtreecommitdiff
path: root/app/graphql/resolvers/environments/last_deployment_resolver.rb
blob: 76f8011267384f0b782b38c1819043c215e7af70 (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
# frozen_string_literal: true

module Resolvers
  module Environments
    class LastDeploymentResolver < BaseResolver
      argument :status,
               Types::DeploymentStatusEnum,
               required: true,
               description: 'Status of the Deployment.'

      type Types::DeploymentType, null: true

      def resolve(status:)
        return unless object.present? && object.is_a?(::Environment)

        validate!(status)

        find_last_deployment(status)
      end

      private

      def find_last_deployment(status)
        BatchLoader::GraphQL.for(object).batch(key: status) do |environments, loader, args|
          association_name = "last_#{args[:key]}_deployment".to_sym

          Preloaders::Environments::DeploymentPreloader.new(environments)
            .execute_with_union(association_name, {})

          environments.each do |environment|
            loader.call(environment, environment.public_send(association_name)) # rubocop:disable GitlabSecurity/PublicSend
          end
        end
      end

      def validate!(status)
        unless Deployment::FINISHED_STATUSES.include?(status.to_sym) ||
            Deployment::UPCOMING_STATUSES.include?(status.to_sym)
          raise Gitlab::Graphql::Errors::ArgumentError, "\"#{status}\" status is not supported."
        end
      end
    end
  end
end