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