Class: Heya::Campaigns::Scheduler
- Inherits:
-
Object
- Object
- Heya::Campaigns::Scheduler
- Defined in:
- lib/heya/campaigns/scheduler.rb
Overview
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 Method Summary collapse
Instance Method Summary collapse
Class Method Details
.process(campaign, step, user) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/heya/campaigns/scheduler.rb', line 33 def self.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::CampaignMembershipsForUpdate.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 else CampaignReceipt.create!(user: user, step_gid: step.gid) end end end |
Instance Method Details
#run ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/heya/campaigns/scheduler.rb', line 14 def run Heya.campaigns.each do |campaign| Queries::OrphanedCampaignMemberships.call(campaign).delete_all campaign.steps.each do |step| Queries::UsersForStep.call(campaign, step).find_each do |user| self.class.process(campaign, step, user) end end if (last_step = campaign.steps.last) CampaignMembership.where( user: Queries::UsersCompletedStep.call(campaign, last_step), campaign_gid: campaign.gid ).delete_all end end end |