# frozen_string_literal: true

module Deployments
  class OlderDeploymentsDropService
    attr_reader :deployment

    def initialize(deployment_id)
      @deployment = Deployment.find_by_id(deployment_id)
    end

    def execute
      return unless @deployment&.running?

      older_deployments.find_each do |older_deployment|
        Gitlab::OptimisticLocking.retry_lock(older_deployment.deployable) do |deployable|
          deployable.drop(:forward_deployment_failure)
        end
      rescue => e
        Gitlab::ErrorTracking.track_exception(e, subject_id: @deployment.id, deployment_id: older_deployment.id)
      end
    end

    private

    def older_deployments
      @deployment
        .environment
        .active_deployments
        .older_than(@deployment)
        .with_deployable
    end
  end
end
