Skip to content

Commit f650d12

Browse files
committed
Iterate on newsletter sending logic
1 parent d28b35e commit f650d12

File tree

7 files changed

+35
-20
lines changed

7 files changed

+35
-20
lines changed

app/controllers/admin/newsletters_controller.rb

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
class Admin::NewslettersController < ApplicationController
2-
before_action :set_newsletter, only: %i[show edit update destroy deliver]
3-
42
# GET /admin/newsletters
53
def index
64
@newsletters = Newsletter.all
75
end
86

97
# GET /admin/newsletters/1
108
def show
9+
@newsletter = Newsletter.find(params[:id])
1110
end
1211

1312
# GET /admin/newsletters/new
@@ -17,6 +16,7 @@ def new
1716

1817
# GET /admin/newsletters/1/edit
1918
def edit
19+
@newsletter = Newsletter.find(params[:id])
2020
end
2121

2222
# POST /admin/newsletters
@@ -32,6 +32,8 @@ def create
3232

3333
# PATCH/PUT /admin/newsletters/1
3434
def update
35+
@newsletter = Newsletter.find(params[:id])
36+
3537
if @newsletter.update(newsletter_params)
3638
redirect_to [:admin, @newsletter], notice: "Newsletter was successfully updated.", status: :see_other
3739
else
@@ -41,32 +43,31 @@ def update
4143

4244
# DELETE /admin/newsletters/1
4345
def destroy
46+
@newsletter = Newsletter.find(params[:id])
47+
4448
@newsletter.destroy!
49+
4550
redirect_to admin_newsletters_path, notice: "Newsletter was successfully destroyed.", status: :see_other
4651
end
4752

4853
# PATCH /admin/newsletters/1/deliver
4954
def deliver
5055
@newsletter = Newsletter.find(params[:id])
56+
5157
recipients = deliver_live? ? User.subscribers : User.test_recipients
5258
label = deliver_live? ? "LIVE" : "TEST"
5359

5460
if recipients.empty?
55-
return redirect_to [:admin, @newsletter], alert: "No recipients found."
61+
return redirect_to [:admin, @newsletter], alert: "No recipients fond."
5662
end
5763

58-
NewsletterNotifier.deliver_to(recipients, newsletter: @newsletter)
64+
NewsletterNotifier.deliver_to(recipients, newsletter: @newsletter, live: deliver_live?)
5965

6066
redirect_to [:admin, @newsletter], notice: "[#{label}] Newsletter was successfully delivered."
6167
end
6268

6369
private
6470

65-
# Use callbacks to share common setup or constraints between actions.
66-
def set_newsletter
67-
@newsletter = Newsletter.find(params[:id])
68-
end
69-
7071
# Only allow a list of trusted parameters through.
7172
def newsletter_params
7273
params.fetch(:newsletter, {}).permit(:title, :content)

app/notifiers/newsletter_notifier.rb

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
class NewsletterNotifier < NotificationEvent
2-
def self.deliver_to(users, newsletter:, **)
3-
new(params: {newsletter_id: newsletter.id}).deliver(users, **)
2+
Error = Class.new(StandardError)
3+
4+
def self.deliver_to(users, newsletter:, live: false, **)
5+
new(params: {newsletter_id: newsletter.id, live:}).deliver(users, **)
46
end
57

68
def deliver_notifications_in_bulk
@@ -9,16 +11,18 @@ def deliver_notifications_in_bulk
911

1012
PostmarkClient.deliver_messages(messages)
1113

12-
newsletter.touch(:sent_at)
14+
newsletter.touch(:sent_at) if deliver_live?
1315
end
1416

1517
private
1618

17-
def postmark_client
18-
@postmark_client ||= Postmark::ApiClient.new(Rails.configuration.settings.postmark_api_token)
19+
def deliver_live?
20+
!!params[:live]
1921
end
2022

2123
def build_newsletter_messages(newsletter)
24+
assert_test_recipients!
25+
2226
recipients.find_each.filter_map do |user|
2327
if !user.confirmed?
2428
log_skip(newsletter, user, "user not confirmed")
@@ -39,4 +43,14 @@ def build_newsletter_messages(newsletter)
3943
def log_skip(newsletter, user, reason)
4044
Rails.logger.info "#[#{self.class}] Skipping delivery of newsletter #{newsletter.id} for: #{user.class.name}##{user.id}#{reason}"
4145
end
46+
47+
def assert_test_recipients!
48+
return if deliver_live?
49+
50+
test_recipients = User.test_recipients.pluck(:email)
51+
52+
if recipients.any? { |user| test_recipients.exclude?(user.email) }
53+
raise Error, "Attempted to deliver test newsletter to non-test recipients: #{id}"
54+
end
55+
end
4256
end

app/views/admin/newsletters/show.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<%= render Pages::Header.new(title: "Admin: #{@newsletter.title}") %>
22
<div class="section-content container py-gap">
33
<div class="flex gap-x-2">
4-
<%= button_to "Send Test", deliver_admin_newsletter_path(@newsletter), class: "button secondary" %>
5-
<%= button_to "Send Live", deliver_admin_newsletter_path(@newsletter, live: true), class: "button primary" %>
4+
<%= button_to "Send Test", deliver_admin_newsletter_path(@newsletter), method: :patch, class: "button secondary" %>
5+
<%= button_to "Send Live", deliver_admin_newsletter_path(@newsletter, live: true), method: :patch, class: "button primary" %>
66
</div>
77

88
<%= render @newsletter %>

app/views/application/_flash.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<% flash.each do |flash_type, message| %>
2-
<div class="flash__message flash_#{flash_type}">
2+
<div class="flash__message flash__#{flash_type}">
33
<%= message %>
44
</div>
55
<% end %>

config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484

8585
resources :newsletters do
8686
member do
87-
post :deliver
87+
patch :deliver
8888
end
8989
end
9090

spec/factories/newsletters.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
content { Faker::Markdown.sandwich(sentences: 3) }
55

66
trait :sent do
7-
sent_at { 1.day.ago }
7+
sent_at { |n| n.days.ago }
88
end
99
end
1010
end

spec/mailers/emails/newsletter_mailer_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
end
1414

1515
it "renders the body" do
16-
expect(mail.body.encoded).to match(Markdown::Base.new(newsletter.content).call)
16+
expect(mail.body.encoded).to match(newsletter.content.split("\n").first)
1717
end
1818
end
1919
end

0 commit comments

Comments
 (0)