32 lines
1004 B
Ruby
32 lines
1004 B
Ruby
class SendMailingRecipientJob < ApplicationJob
|
|
queue_as :mailers
|
|
|
|
def perform(recipient_id)
|
|
recipient = MailingRecipient.find_by(id: recipient_id)
|
|
return if recipient.nil?
|
|
|
|
mailing = recipient.mailing
|
|
return unless mailing.sending?
|
|
return unless recipient.pending? || recipient.status == "queued"
|
|
|
|
clock = Mailings::SendClock.new(mailing)
|
|
unless clock.open?
|
|
mailing.enqueue_next_recipient!(recipient, from: clock.next_open_at)
|
|
return
|
|
end
|
|
|
|
if mailing.next_send_at.present? && mailing.next_send_at > Time.current
|
|
wait = mailing.next_send_at - Time.current
|
|
self.class.set(wait: wait).perform_later(recipient.id) if wait <= 2.minutes
|
|
return
|
|
end
|
|
|
|
if recipient.pending? && Mailings::OutboundQueue.enqueue(recipient)
|
|
nxt = mailing.mailing_recipients.pending.order(:id).first
|
|
mailing.enqueue_next_recipient!(nxt, from: Time.current + mailing.interval_seconds.seconds)
|
|
end
|
|
|
|
DrainOutboundJob.perform_later
|
|
end
|
|
end
|