gitlab-org--gitlab-foss/app/graphql/resolvers/environments/last_deployment_resolver.rb

45 lines
1.3 KiB
Ruby

# 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