SumOfUs/Champaign

View on GitHub
app/services/eoy_donation_email.rb

Summary

Maintainability
A
0 mins
Test Coverage
class EoyDonationEmail
  include ActiveModel::Validations

  OPT_OUT_EOD_DONATION = 1
  OPT_IN_EOD_DONATION = 0

  attr_reader :akid, :actionkit_user_id, :member_first_name

  validates :akid, presence: true
  validates :actionkit_user_id, presence: true

  def initialize(akid)
    @akid = akid
    set_actionkit_user_id
  end

  def opt_out
    opt_in_or_out(OPT_OUT_EOD_DONATION)
  end

  def opt_in
    opt_in_or_out(OPT_IN_EOD_DONATION)
  end

  def member
    return nil unless actionkit_user_id

    @member ||= Member.find_by(actionkit_user_id: actionkit_user_id)
  end

  def confirmation_email_matched?(email)
    info = fetch_user_info
    return false unless info.present?

    @member_first_name = info[:first_name]

    info[:email].to_s.downcase == email.to_s.downcase
  end

  private

  def set_actionkit_user_id
    @actionkit_user_id ||= AkidParser.parse(@akid, Settings.action_kit.akid_secret)[:actionkit_user_id]
  end

  def opt_in_or_out(option)
    return false unless valid?

    updated_actionkit = update_action_kit(option)
    member.update(opt_out_eoy_donation: option) if member && updated_actionkit
    updated_actionkit
  end

  def fetch_user_info
    return {} unless actionkit_user_id.present?

    begin
      resp = ActionKit::Client.get("user/#{actionkit_user_id}", params: {})
      return {} unless resp.code == 200

      return resp.parsed_response.try(:with_indifferent_access)
    rescue StandardError => e
      Rails.logger.info "Error occurred while fetching actionkit user details. #{e.inspect}"
      return {}
    end
  end

  def update_action_kit(option)
    begin
      data = { fields: { opt_out_eoy_donation: option } }
      resp = ActionKitConnector.client.update_user(actionkit_user_id, data)
      status = resp.try(:code) == 204
    rescue StandardError => e
      Rails.logger.info "Error occurred while updating actionkit opt_out_eoy_donation field. #{e.inspect}"
      status = false
    end
    errors.add(:base, 'Error updating actionkit') && (return false) unless status
    status
  end
end