Sha256: 99a7f0772e8dc16fab8944b748be774d9a3a9926cf06d46d196f42ab205793bf

Contents?: true

Size: 1.67 KB

Versions: 8

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

module Heya
  module Campaigns
    # {Campaigns::Scheduler} schedules campaign jobs to run for each campaign.
    #
    # For each step in each campaign:
    #   1. Find users who haven't completed step, and are outside the `wait`
    #   window
    #   2. Match segment
    #   3. Create CampaignReceipt (excludes user in subsequent steps)
    #   4. Process job
    class Scheduler
      def run(user: nil)
        Heya.campaigns.each do |campaign|
          if campaign.steps.any?
            Queries::OrphanedMemberships.call(campaign).update_all(step_gid: campaign.steps.first.gid)
          end
        end

        Queries::MembershipsToProcess.call(user: user).find_each do |membership|
          step = GlobalID::Locator.locate(membership.step_gid)
          campaign = GlobalID::Locator.locate(membership.campaign_gid)
          process(campaign, step, membership.user)
          current_index = campaign.steps.index(step)
          if (next_step = campaign.steps[current_index + 1])
            membership.update(step_gid: next_step.gid)
          else
            membership.destroy
          end
        end
      end

      private

      def process(campaign, step, user)
        ActiveRecord::Base.transaction do
          return if CampaignReceipt.where(user: user, step_gid: step.gid).exists?

          if step.in_segment?(user)
            now = Time.now.utc
            Queries::MembershipsForUpdate.call(campaign, user).update_all(last_sent_at: now)
            CampaignReceipt.create!(user: user, step_gid: step.gid, sent_at: now)
            step.action.new(user: user, step: step).deliver_later
          end
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
heya-0.7.0 lib/heya/campaigns/scheduler.rb
heya-0.6.1 lib/heya/campaigns/scheduler.rb
heya-0.6.0 lib/heya/campaigns/scheduler.rb
heya-0.5.3 lib/heya/campaigns/scheduler.rb
heya-0.5.2 lib/heya/campaigns/scheduler.rb
heya-0.5.1 lib/heya/campaigns/scheduler.rb
heya-0.5.0 lib/heya/campaigns/scheduler.rb
heya-0.4.0 lib/heya/campaigns/scheduler.rb