Skip to content

Commit c79b76d

Browse files
authored
[feature] Configure remaining automated emails from UI (#148)
* [feature] Configure remaining automated emails from UI * Raise error for bad triggers
1 parent faf2a9a commit c79b76d

16 files changed

+127
-108
lines changed

app/controllers/manage/bus_lists_controller.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,22 @@ def toggle_bus_captain
4444
is_bus_captain = params[:bus_captain] == "1"
4545
@questionnaire.update_attribute(:is_bus_captain, is_bus_captain)
4646
if @questionnaire.reload.is_bus_captain
47-
Mailer.delay.bus_captain_confirmation_email(@bus_list.id, @questionnaire.user.id)
47+
Message.queue_for_trigger("bus_list.new_captain_confirmation", @questionnaire.user.id)
4848
end
4949
redirect_to [:manage, @bus_list]
5050
end
5151

5252
def send_update_email
53+
if Message.for_trigger("bus_list.notes_update").empty?
54+
flash[:error] = 'Error: No automated message is configured for bus note updates!'
55+
redirect_to [:manage, @bus_list]
56+
return
57+
end
58+
5359
@bus_list.passengers.each do |passenger|
54-
Mailer.delay.bus_list_update_email(passenger.id)
60+
Message.queue_for_trigger("bus_list.notes_update", passenger.id).count
5561
end
62+
flash[:notice] = 'Bus notes update emails have been sent'
5663
redirect_to [:manage, @bus_list]
5764
end
5865

app/mailers/mail_preview.rb

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,5 @@ def bulk_message_email
44
message = Message.first
55
Mailer.bulk_message_email(message, User.first.id)
66
end
7-
8-
def incomplete_reminder_email
9-
Mailer.incomplete_reminder_email(User.without_questionnaire.first.id)
10-
end
11-
12-
def bus_captain_confirmation_email
13-
buslist = BusList.first
14-
Mailer.bus_captain_confirmation_email(buslist.id, buslist.captains.first.id)
15-
end
16-
17-
def bus_list_update_email
18-
Mailer.bus_list_update_email(BusList.first.passengers.first.id)
19-
end
207
end
218
end

app/mailers/mailer.rb

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ def bulk_message_email(message_id, user_id, message = nil, use_examples = false)
99
@user = User.find_by_id(user_id)
1010
@use_examples = use_examples
1111
return if @user.blank? || @message.blank?
12+
1213
mail(
1314
to: pretty_email(@user.full_name, @user.email),
1415
subject: @message.subject
@@ -18,31 +19,15 @@ def bulk_message_email(message_id, user_id, message = nil, use_examples = false)
1819
def incomplete_reminder_email(user_id)
1920
@user = User.find_by_id(user_id)
2021
return if @user.blank? || @user.admin? || @user.questionnaire || Time.now.to_date > Date.parse(HackathonConfig['last_day_to_apply'])
21-
mail(
22-
to: @user.email,
23-
subject: "Incomplete Application"
24-
)
25-
end
2622

27-
def bus_captain_confirmation_email(bus_list_id, user_id)
28-
@user = User.find_by_id(user_id)
29-
@questionnaire = @user.questionnaire
30-
@bus_list = BusList.find_by_id(bus_list_id)
31-
return if @user.blank? || @user.questionnaire.blank? || !@user.questionnaire.is_bus_captain? || @bus_list.blank?
32-
mail_questionnaire("You're a bus captain!")
33-
end
34-
35-
def bus_list_update_email(questionnaire_id)
36-
@questionnaire = Questionnaire.find_by_id(questionnaire_id)
37-
@bus_list = @questionnaire.bus_list
38-
return if @questionnaire.blank? || @questionnaire.user.blank? || @bus_list.blank?
39-
mail_questionnaire("Bus Update")
23+
Message.queue_for_trigger("user.24hr_incomplete_application", @user.id)
4024
end
4125

4226
private
4327

4428
def pretty_email(name, email)
4529
return email if name.blank?
30+
4631
"\"#{name}\" <#{email}>"
4732
end
4833

app/models/message.rb

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,31 @@ class Message < ApplicationRecord
1313
POSSIBLE_TYPES = ["bulk", "automated"].freeze
1414

1515
POSSIBLE_SIMPLE_RECIPIENTS = {
16-
"all" => "Everyone",
17-
"incomplete" => "Incomplete Applications",
18-
"complete" => "Complete Applications",
19-
"accepted" => "Accepted Applications",
20-
"denied" => "Denied Applications",
21-
"waitlisted" => "Waitlisted Applications",
22-
"late-waitlisted" => "Late, Waitlisted Applications",
23-
"rsvp-confirmed" => "RSVP Confirmed Attendees",
24-
"rsvp-denied" => "RSVP Denied Attendees",
25-
"checked-in" => "Checked-In Attendees",
26-
"non-checked-in" => "Non-Checked-In, Accepted & RSVP'd Applications",
27-
"non-checked-in-excluding" => "Non-Checked-In Applications, Excluding Accepted & RSVP'd"
16+
"all" => "Everyone",
17+
"incomplete" => "Incomplete Applications",
18+
"complete" => "Complete Applications",
19+
"accepted" => "Accepted Applications",
20+
"denied" => "Denied Applications",
21+
"waitlisted" => "Waitlisted Applications",
22+
"late-waitlisted" => "Late, Waitlisted Applications",
23+
"rsvp-confirmed" => "RSVP Confirmed Attendees",
24+
"rsvp-denied" => "RSVP Denied Attendees",
25+
"checked-in" => "Checked-In Attendees",
26+
"non-checked-in" => "Non-Checked-In, Accepted & RSVP'd Applications",
27+
"non-checked-in-excluding" => "Non-Checked-In Applications, Excluding Accepted & RSVP'd"
2828
}.freeze
2929

3030
POSSIBLE_TRIGGERS = {
31-
"questionnaire.pending" => "Questionnaire Status: Pending Review (new application)",
32-
"questionnaire.accepted" => "Questionnaire Status: Accepted",
33-
"questionnaire.waitlist" => "Questionnaire Status: Waitlisted",
34-
"questionnaire.denied" => "Questionnaire Status: Denied",
35-
"questionnaire.late_waitlist" => "Questionnaire Status: Waitlisted, Late",
31+
"questionnaire.pending" => "Questionnaire Status: Pending Review (new application)",
32+
"questionnaire.accepted" => "Questionnaire Status: Accepted",
33+
"questionnaire.waitlist" => "Questionnaire Status: Waitlisted",
34+
"questionnaire.denied" => "Questionnaire Status: Denied",
35+
"questionnaire.late_waitlist" => "Questionnaire Status: Waitlisted, Late",
3636
"questionnaire.rsvp_confirmed" => "Questionnaire Status: RSVP Confirmed",
37-
"questionnaire.rsvp_denied" => "Questionnaire Status: RSVP Denied"
37+
"questionnaire.rsvp_denied" => "Questionnaire Status: RSVP Denied",
38+
"user.24hr_incomplete_application" => "User: Incomplete application (24 hours later)",
39+
"bus_list.new_captain_confirmation" => "Bus List: New captain confirmation",
40+
"bus_list.notes_update" => "Bus List: Updated notes (manually triggered)"
3841
}.freeze
3942

4043
serialize :recipients, Array
@@ -107,6 +110,7 @@ def status
107110
return "delivered" if delivered?
108111
return "started" if started?
109112
return "queued" if queued?
113+
110114
"drafted"
111115
end
112116

@@ -160,9 +164,14 @@ def possible_recipients
160164
recipients
161165
end
162166

167+
def self.for_trigger(trigger)
168+
raise ArgumentError, "Unknown trigger: #{trigger}" unless POSSIBLE_TRIGGERS.include?(trigger)
169+
170+
Message.where(trigger: trigger)
171+
end
172+
163173
def self.queue_for_trigger(trigger, user_id)
164-
messages_to_queue = Message.where(trigger: trigger)
165-
messages_to_queue.map { |message| Mailer.delay.bulk_message_email(message.id, user_id) }
174+
for_trigger(trigger).map { |message| Mailer.delay.bulk_message_email(message.id, user_id) }
166175
end
167176

168177
def self.bulk

app/views/mailer/bus_captain_confirmation_email.html.erb

Lines changed: 0 additions & 12 deletions
This file was deleted.

app/views/mailer/bus_list_update_email.html.erb

Lines changed: 0 additions & 7 deletions
This file was deleted.

app/views/mailer/incomplete_reminder_email.html.erb

Lines changed: 0 additions & 6 deletions
This file was deleted.

config/template_variables.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,7 @@ variables:
5050
description: Full URL to the RSVP denial page. Useful for a one-click RSVP link.
5151
use_value_as_example: true
5252
value: Rails.application.routes.url_helpers.deny_rsvp_url(Rails.application.config.action_mailer.default_url_options)
53+
bus_captain_url:
54+
description: Full URL to the Bus Captain page. Useful for bus captains to view & check-in passengers.
55+
use_value_as_example: True
56+
value: Rails.application.routes.url_helpers.bus_list_url(Rails.application.config.action_mailer.default_url_options)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
## You're a bus captain!
2+
3+
Hey {{first_name}},
4+
5+
Thanks for volunteering to be a bus captain! We know most people just want to hop on &amp; off the bus, but coordinating busses isn't that easy. Thanks to you, this bus to {{hackathon_name}} can be a success!
6+
7+
We've provided a portal to view all bus passengers for your bus, as well as provide important information about being a captain. <strong>Please take a look!</strong>
8+
9+
<a href="{{bus_captain_url}}" class="button">Bus List »</a><br />
10+
<small><i>Link not working? Go to {{bus_captain_url}}</i></small>
11+
12+
This will be the central source of truth for passengers &amp; bus information, in addition to anything you hear from our travel director.
13+
14+
This also means your <strong>name, email, and phone number</strong> are visible to everyone riding the bus. This information is taken straight from your {{hackathon_name}} application, so please make sure it is up to date! You can check this at [{{apply_url}}]({{apply_url}})
15+
16+
Again, thank you so much for being a bus captain! If you have any questions at all, feel free to reach out. We can't wait to see you at {{hackathon_name}}!
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Bus Update
2+
3+
Hey {{first_name}},
4+
5+
There's been an update to your bus - see below!
6+
7+
As always, up-to-date bus info &amp; captains are available at [{{rsvp_url}}]({{rsvp_url}})
8+
9+
<hr />
10+
11+
{{bus_list_notes}}

0 commit comments

Comments
 (0)