@@ -5,9 +5,14 @@ module BetterTogether
55 class EventReminderSchedulerJob < ApplicationJob
66 queue_as :notifications
77
8- def perform ( event )
8+ retry_on StandardError , wait : :polynomially_longer , attempts : 5
9+ discard_on ActiveRecord ::RecordNotFound
10+
11+ def perform ( event_or_id )
12+ event = find_event ( event_or_id )
913 return unless event_valid? ( event )
1014 return if event_in_past? ( event )
15+ return unless event_has_attendees? ( event )
1116
1217 cancel_existing_reminders ( event )
1318 schedule_reminders ( event )
@@ -16,6 +21,14 @@ def perform(event)
1621
1722 private
1823
24+ def find_event ( event_or_id )
25+ return event_or_id if event_or_id . is_a? ( BetterTogether ::Event )
26+
27+ BetterTogether ::Event . find ( event_or_id ) if event_or_id . present?
28+ rescue ActiveRecord ::RecordNotFound
29+ nil
30+ end
31+
1932 def event_valid? ( event )
2033 event . present? && event . starts_at . present?
2134 end
@@ -24,9 +37,14 @@ def event_in_past?(event)
2437 event . starts_at <= Time . current
2538 end
2639
40+ def event_has_attendees? ( event )
41+ event . event_attendances . any?
42+ end
43+
2744 def schedule_reminders ( event )
2845 schedule_24_hour_reminder ( event ) if should_schedule_24_hour_reminder? ( event )
2946 schedule_1_hour_reminder ( event ) if should_schedule_1_hour_reminder? ( event )
47+ schedule_start_time_reminder ( event ) if should_schedule_start_time_reminder? ( event )
3048 end
3149
3250 def should_schedule_24_hour_reminder? ( event )
@@ -37,20 +55,41 @@ def should_schedule_1_hour_reminder?(event)
3755 event . starts_at > 1 . hour . from_now
3856 end
3957
58+ def should_schedule_start_time_reminder? ( event )
59+ event . starts_at > Time . current
60+ end
61+
4062 def schedule_24_hour_reminder ( event )
4163 EventReminderJob . set ( wait_until : event . starts_at - 24 . hours )
42- . perform_later ( event , '24_hours' )
64+ . perform_later ( event . id )
4365 end
4466
4567 def schedule_1_hour_reminder ( event )
4668 EventReminderJob . set ( wait_until : event . starts_at - 1 . hour )
47- . perform_later ( event , '1_hour' )
69+ . perform_later ( event . id )
70+ end
71+
72+ def schedule_start_time_reminder ( event )
73+ EventReminderJob . set ( wait_until : event . starts_at )
74+ . perform_later ( event . id )
4875 end
4976
5077 def log_completion ( event )
5178 Rails . logger . info "Scheduled reminders for event #{ event . identifier } "
5279 end
5380
81+ def reminder_intervals
82+ [ 24 . hours , 1 . hour , 0 . seconds ]
83+ end
84+
85+ def schedule_future_reminder? ( event_id , reminder_time )
86+ return false if reminder_time <= Time . current
87+
88+ EventReminderJob . set ( wait_until : reminder_time )
89+ . perform_later ( event_id )
90+ true
91+ end
92+
5493 def cancel_existing_reminders ( event )
5594 # Find and cancel existing reminder jobs for this event
5695 # This is a simplified approach - in production you might want to use
0 commit comments