Module: Bible270::DailyReminders

Defined in:
lib/bible270/daily_reminders.rb

Overview

Delivers one reminder for each reader whose dated plan has an unfinished reading and whose chosen local reminder time has arrived. Scheduling belongs to the host application; repeated runs on the same local date are safe.

Class Method Summary collapse

Class Method Details

.deliver(at: Time.now) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/bible270/daily_reminders.rb', line 13

def deliver(at: Time.now)
  return 0 unless Bible270.config.daily_reminders?

  unless Reader.daily_reminder_columns?
    Rails.logger.error(
      '[bible270] daily reminders unavailable: run bible270:install:migrations and db:migrate'
    )
    return 0
  end

  local_time = local_time_for(at)
  return 0 unless local_time.respond_to?(:to_date)

  date = local_time.to_date
  sent = 0
  Reader.daily_reminder_recipients(on: date).find_each do |reader|
    next unless reader.daily_reminder_due_at?(local_time)

    day = Plan.day_for(date, reader.effective_start_date, clamp: false)
    next unless Plan.valid_day?(day)
    next if reader.day_complete?(day)

    delivery = NoticeMailer.daily_reminder(reader_id: reader.id, day: day, on: date)
    next unless delivery.message.perform_deliveries

    delivery.deliver_now
    reader.update_column(:last_daily_reminder_sent_on, date)
    sent += 1
  rescue StandardError => e
    Rails.logger.error(
      "[bible270] daily reminder for reader #{reader.id} failed: #{e.class}: #{e.message}"
    )
  end
  sent
end

.local_time_for(at) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/bible270/daily_reminders.rb', line 49

def local_time_for(at)
  return nil if at.nil?

  Bible270.local_time(at)
rescue StandardError
  nil
end