Sha256: 9549994730dd97c278e9fc21f58638c303acac80fa8e6d27c15eba633528408d

Contents?: true

Size: 1.44 KB

Versions: 2

Compression:

Stored size: 1.44 KB

Contents

# frozen_string_literal: true

module ActionMailer
  module Balancer
    class DeliveryMethod
      attr_reader :delivery_methods, :weights_sum

      def initialize(settings = {})
        add_delivery_methods(settings)
      end

      def deliver!(message)
        delivery_method = choose_delivery_method
        message.delivery_method(
          ::ActionMailer::Base.delivery_methods[delivery_method[:method]],
          delivery_method[:settings]
        )
        message.deliver!
      end

      private

      def add_delivery_methods(settings)
        validate_settings!(settings)

        @delivery_methods = settings[:delivery_methods]
        @weights_sum = delivery_methods.sum do |method|
          unless method[:weight]
            raise ActionMailer::Balancer::SettingsError, "No weight set for delivery method #{method[:method]}"
          end

          method[:weight]
        end
      end

      def choose_delivery_method
        target = rand(1..weights_sum)
        delivery_methods.each do |method|
          return method if target <= method[:weight]

          target -= method[:weight]
        end
      end

      def validate_settings!(settings)
        raise ActionMailer::Balancer::SettingsError, 'No settings set' if settings.empty?

        return if settings[:delivery_methods].is_a?(Array) && !settings[:delivery_methods].empty?

        raise ActionMailer::Balancer::SettingsError, 'No delivery methods set'
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
actionmailer-balancer-1.1.0 lib/actionmailer/balancer/delivery_method.rb
actionmailer-balancer-1.0.0 lib/actionmailer/balancer/delivery_method.rb