@@ -15,19 +15,63 @@ def send_workshop_attendance_reminders(workshop)
1515 end
1616 handle_asynchronously :send_workshop_attendance_reminders
1717
18- def send_workshop_emails ( workshop , audience )
18+ def send_workshop_emails ( workshop , audience , initiator_id = nil )
1919 return 'The workshop is not invitable' unless workshop . invitable?
2020
21- invite_students_to_workshop ( workshop ) if audience . in? ( %w[ students everyone ] )
22- invite_coaches_to_workshop ( workshop ) if audience . in? ( %w[ coaches everyone ] )
21+ initiator = initiator_id ? Member . find_by ( id : initiator_id ) : nil
22+ logger = initiator ? InvitationLogger . new ( workshop , initiator , audience , :invite ) : nil
23+
24+ if logger
25+ begin
26+ logger . start_batch
27+ rescue ActiveRecord ::RecordNotUnique
28+ return 'A batch is already running for this workshop and audience'
29+ end
30+ end
31+
32+ total = 0
33+ begin
34+ if audience . in? ( %w[ students everyone ] )
35+ total += invite_students_to_workshop ( workshop , logger )
36+ end
37+ if audience . in? ( %w[ coaches everyone ] )
38+ total += invite_coaches_to_workshop ( workshop , logger )
39+ end
40+ logger &.finish_batch ( total )
41+ rescue StandardError => e
42+ logger &.fail_batch ( e )
43+ raise
44+ end
2345 end
2446 handle_asynchronously :send_workshop_emails
2547
26- def send_virtual_workshop_emails ( workshop , audience )
48+ def send_virtual_workshop_emails ( workshop , audience , initiator_id = nil )
2749 return 'The workshop is not invitable' unless workshop . invitable?
2850
29- invite_students_to_virtual_workshop ( workshop ) if audience . in? ( %w[ students everyone ] )
30- invite_coaches_to_virtual_workshop ( workshop ) if audience . in? ( %w[ coaches everyone ] )
51+ initiator = initiator_id ? Member . find_by ( id : initiator_id ) : nil
52+ logger = initiator ? InvitationLogger . new ( workshop , initiator , audience , :invite ) : nil
53+
54+ if logger
55+ begin
56+ logger . start_batch
57+ rescue ActiveRecord ::RecordNotUnique
58+ return 'A batch is already running for this workshop and audience'
59+ end
60+ end
61+
62+ total = 0
63+ begin
64+ if audience . in? ( %w[ students everyone ] )
65+ total += invite_students_to_virtual_workshop ( workshop , logger )
66+ end
67+ if audience . in? ( %w[ coaches everyone ] )
68+ total += invite_coaches_to_virtual_workshop ( workshop , logger )
69+ end
70+ logger &.finish_batch ( total )
71+ rescue StandardError => e
72+ logger &.fail_batch ( e )
73+ raise
74+ end
3175 end
3276 handle_asynchronously :send_virtual_workshop_emails
3377
@@ -66,32 +110,88 @@ def log_invitation_failure(workshop, member, role, error)
66110 )
67111 end
68112
69- def invite_coaches_to_virtual_workshop ( workshop )
113+ def invite_coaches_to_virtual_workshop ( workshop , logger = nil )
114+ count = 0
70115 chapter_coaches ( workshop . chapter ) . shuffle . each do |coach |
71- invitation = create_invitation ( workshop , coach , 'Coach' ) || next
72- VirtualWorkshopInvitationMailer . invite_coach ( workshop , coach , invitation ) . deliver_now
116+ invitation = create_invitation ( workshop , coach , 'Coach' )
117+ next unless invitation
118+
119+ count += 1
120+ if logger
121+ begin
122+ VirtualWorkshopInvitationMailer . invite_coach ( workshop , coach , invitation ) . deliver_now
123+ logger . log_success ( coach , invitation )
124+ rescue StandardError => e
125+ logger . log_failure ( coach , invitation , e )
126+ end
127+ else
128+ VirtualWorkshopInvitationMailer . invite_coach ( workshop , coach , invitation ) . deliver_now
129+ end
73130 end
131+ count
74132 end
75133
76- def invite_coaches_to_workshop ( workshop )
134+ def invite_coaches_to_workshop ( workshop , logger = nil )
135+ count = 0
77136 chapter_coaches ( workshop . chapter ) . shuffle . each do |coach |
78- invitation = create_invitation ( workshop , coach , 'Coach' ) || next
79- WorkshopInvitationMailer . invite_coach ( workshop , coach , invitation ) . deliver_now
137+ invitation = create_invitation ( workshop , coach , 'Coach' )
138+ next unless invitation
139+
140+ count += 1
141+ if logger
142+ begin
143+ WorkshopInvitationMailer . invite_coach ( workshop , coach , invitation ) . deliver_now
144+ logger . log_success ( coach , invitation )
145+ rescue StandardError => e
146+ logger . log_failure ( coach , invitation , e )
147+ end
148+ else
149+ WorkshopInvitationMailer . invite_coach ( workshop , coach , invitation ) . deliver_now
150+ end
80151 end
152+ count
81153 end
82154
83- def invite_students_to_virtual_workshop ( workshop )
155+ def invite_students_to_virtual_workshop ( workshop , logger = nil )
156+ count = 0
84157 chapter_students ( workshop . chapter ) . shuffle . each do |student |
85- invitation = create_invitation ( workshop , student , 'Student' ) || next
86- VirtualWorkshopInvitationMailer . invite_student ( workshop , student , invitation ) . deliver_now
158+ invitation = create_invitation ( workshop , student , 'Student' )
159+ next unless invitation
160+
161+ count += 1
162+ if logger
163+ begin
164+ VirtualWorkshopInvitationMailer . invite_student ( workshop , student , invitation ) . deliver_now
165+ logger . log_success ( student , invitation )
166+ rescue StandardError => e
167+ logger . log_failure ( student , invitation , e )
168+ end
169+ else
170+ VirtualWorkshopInvitationMailer . invite_student ( workshop , student , invitation ) . deliver_now
171+ end
87172 end
173+ count
88174 end
89175
90- def invite_students_to_workshop ( workshop )
176+ def invite_students_to_workshop ( workshop , logger = nil )
177+ count = 0
91178 chapter_students ( workshop . chapter ) . shuffle . each do |student |
92- invitation = create_invitation ( workshop , student , 'Student' ) || next
93- WorkshopInvitationMailer . invite_student ( workshop , student , invitation ) . deliver_now
179+ invitation = create_invitation ( workshop , student , 'Student' )
180+ next unless invitation
181+
182+ count += 1
183+ if logger
184+ begin
185+ WorkshopInvitationMailer . invite_student ( workshop , student , invitation ) . deliver_now
186+ logger . log_success ( student , invitation )
187+ rescue StandardError => e
188+ logger . log_failure ( student , invitation , e )
189+ end
190+ else
191+ WorkshopInvitationMailer . invite_student ( workshop , student , invitation ) . deliver_now
192+ end
94193 end
194+ count
95195 end
96196
97197 def retrieve_and_notify_waitlisted ( workshop , role :)
0 commit comments