module Newsletterable::Worker

Public Instance Methods

perform(subscription_id) click to toggle source
# File lib/newsletterable/worker.rb, line 7
def perform(subscription_id)
        @subscription = orm_adapter.query_subscription(id: subscription_id)

        if @subscription.nil?
                logger.warn "No subscription with id #{subscription_id} exists. Ignoring."
        else
                process
        end
end
process() click to toggle source
# File lib/newsletterable/worker.rb, line 17
def process
        logger.info "Processing mailing list subscription for #{@subscription.email}..."
        logger.debug "Status: [#{@subscription.state}]"

        case @subscription.state.to_sym
        when :pending || :error
                logger.info "Subscribing #{@subscription.email} to '#{@subscription.list}' list"
                logger.info "Trying to subscribe after previous error!" if @subscription.error?
                add(@subscription)
                @subscription.subscribed!
                @subscription.save!
        when :unsubscribed
                logger.info "Unsubscribing #{@subscription.email} from '#{@subscription.list}' list"
                remove(@subscription)
                @subscription.destroy!
        when :out_of_date
                logger.info "Updating subscription for #{@subscription.email}"
                update(@subscription)
                @subscription.old_email = nil
                @subscription.subscribed!
                @subscription.save!
        end

rescue Mailchimp::Error => ex
        logger.error "#{@subscription.email}: #{ex.message || 'Unknown error.'}"
        @subscription.error!
        @subscription.save
        raise
end

Private Instance Methods

add(subscription) click to toggle source
# File lib/newsletterable/worker.rb, line 57
def add(subscription)
        mailchimp.lists.subscribe(subscription.list, { email: subscription.email }, {}, 'html', false)
rescue Mailchimp::ListAlreadySubscribedError
        logger.warn "#{subscription.email} already subscribed to '#{subscription.list}'."
end
mailchimp() click to toggle source
# File lib/newsletterable/worker.rb, line 53
          def mailchimp
@mailchimp_api ||= Mailchimp::API.new(Newsletterable.configuration.api_key)
          end
orm_adapter() click to toggle source
# File lib/newsletterable/worker.rb, line 49
def orm_adapter
        @orm_adapter ||= OrmAdapters::Adapter.factory(Newsletterable.configuration.orm_adapter)
end
remove(subscription) click to toggle source
# File lib/newsletterable/worker.rb, line 63
def remove(subscription)
        mailchimp.lists.unsubscribe(subscription.list, { email: subscription.email })
rescue Mailchimp::ListNotSubscribedError
        logger.warn "#{subscription.email} is not subscribed to '#{subscription.list}'."
end
update(subscription) click to toggle source
# File lib/newsletterable/worker.rb, line 69
def update(subscription)
        raise UpdateError, "old_email required to update subscription for subscription #{subscription.id}." if subscription.old_email.nil?
        mailchimp.lists.subscribe(subscription.list, { email: subscription.old_email }, { 'new-email' => subscription.email }, 'html', true, true)
end