45 lines
1.3 KiB
Ruby
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
|