ryu39/sendgrid_actionmailer_adapter

View on GitHub
lib/sendgrid_actionmailer_adapter/converters/personalizations.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

require 'sendgrid-ruby'

module SendGridActionMailerAdapter
  module Converters
    class Personalizations
      def validate(mail)
        error_messages = []
        if mail.to_addrs.empty?
          error_messages << "'to_addrs' must not be empty."
        end
        error_messages
      end

      def convert(mail)
        # Separate emails per each To address.
        # Cc and Bcc addresses are shared with each emails.
        cc_addrs = mail[:cc]&.addrs
        bcc_addrs = mail[:bcc]&.addrs
        mail[:to].addrs.map do |to_addr|
          to_personalization(to_addr, cc_addrs, bcc_addrs)
        end
      end

      def assign_attributes(sendgrid_mail, value)
        Array(value).each do |personalization|
          sendgrid_mail.add_personalization(personalization)
        end
      end

      private

      def to_personalization(to_addr, cc_addrs, bcc_addrs)
        ::SendGrid::Personalization.new.tap do |p|
          p.add_to(::SendGrid::Email.new(email: to_addr.address, name: to_addr.display_name))
          Array(cc_addrs).each do |addr|
            p.add_cc(::SendGrid::Email.new(email: addr.address, name: addr.display_name))
          end
          Array(bcc_addrs).each do |addr|
            p.add_bcc(::SendGrid::Email.new(email: addr.address, name: addr.display_name))
          end
        end
      end
    end
  end
end