diff --git a/app/javascript/packs/admin/billboards.jsx b/app/javascript/packs/admin/billboards.jsx
index 88421b577..eaa0057b5 100644
--- a/app/javascript/packs/admin/billboards.jsx
+++ b/app/javascript/packs/admin/billboards.jsx
@@ -151,6 +151,8 @@ document.ready.then(() => {
'feed_first',
'feed_second',
'feed_third',
+ 'digest_first',
+ 'digest_second',
];
if (targetedTagPlacements.includes(select.value)) {
diff --git a/app/mailers/digest_mailer.rb b/app/mailers/digest_mailer.rb
index f32f457cd..08c1c9bf5 100644
--- a/app/mailers/digest_mailer.rb
+++ b/app/mailers/digest_mailer.rb
@@ -4,6 +4,7 @@ class DigestMailer < ApplicationMailer
def digest_email
@user = params[:user]
@articles = params[:articles]
+ @billboards = params[:billboards]
@unsubscribe = generate_unsubscribe_token(@user.id, :email_digest_periodic)
subject = generate_title
diff --git a/app/models/billboard.rb b/app/models/billboard.rb
index bf963a477..cd5034424 100644
--- a/app/models/billboard.rb
+++ b/app/models/billboard.rb
@@ -11,13 +11,16 @@ class Billboard < ApplicationRecord
sidebar_right
sidebar_right_second
sidebar_right_third
- feed_first feed_second
+ feed_first
+ feed_second
feed_third
home_hero
page_fixed_bottom
post_fixed_bottom
post_sidebar
- post_comments].freeze
+ post_comments
+ digest_first
+ digest_second].freeze
ALLOWED_PLACEMENT_AREAS_HUMAN_READABLE = ["Sidebar Left (First Position)",
"Sidebar Left (Second Position)",
"Sidebar Right (Home first position)",
@@ -30,7 +33,9 @@ class Billboard < ApplicationRecord
"Fixed Bottom (Page)",
"Fixed Bottom (Individual Post)",
"Sidebar Right (Individual Post)",
- "Below the comment section"].freeze
+ "Below the comment section",
+ "Digest Email First",
+ "Digest Email Second"].freeze
HOME_FEED_PLACEMENTS = %w[feed_first feed_second feed_third].freeze
diff --git a/app/views/mailers/digest_mailer/digest_email.html.erb b/app/views/mailers/digest_mailer/digest_email.html.erb
index d07a0deaf..4c3dc2fdb 100644
--- a/app/views/mailers/digest_mailer/digest_email.html.erb
+++ b/app/views/mailers/digest_mailer/digest_email.html.erb
@@ -16,10 +16,27 @@
+ <% if @billboards&.first&.present? %>
+
+
+
+ |
+
+
+ |
+ <%= @billboards.first.processed_html.html_safe %>
+ |
+
+
+
+
+ |
+
+ <% end %>
<% @articles.each_with_index do |article, i| %>
- | px 0px 0px; text-align: left;">
+ | px 2px 0px; text-align: left;">
<%= article.title.strip %>
<%= truncate(article.description, length: 180) %>
@@ -42,6 +59,19 @@
|
+ <% if @billboards&.second&.present? %>
+
+ |
+ <%= @billboards.second.processed_html.html_safe %>
+ |
+
+
+
+
+ |
+
+
+ <% end %>
|
diff --git a/app/workers/emails/send_user_digest_worker.rb b/app/workers/emails/send_user_digest_worker.rb
index 3ddf5d661..3b32b06c6 100644
--- a/app/workers/emails/send_user_digest_worker.rb
+++ b/app/workers/emails/send_user_digest_worker.rb
@@ -9,10 +9,20 @@ module Emails
return unless user&.notification_setting&.email_digest_periodic? && user&.registered?
articles = EmailDigestArticleCollector.new(user).articles_to_send
+ tags = user.cached_followed_tag_names&.first(12)
+ first_billboard = Billboard.for_display(area: "digest_first",
+ user_id: user.id,
+ user_tags: tags,
+ user_signed_in: true)
+ second_billboard = Billboard.for_display(area: "digest_second",
+ user_id: user.id,
+ user_tags: tags,
+ user_signed_in: true)
return unless articles.any?
begin
- DigestMailer.with(user: user, articles: articles.to_a).digest_email.deliver_now
+ DigestMailer.with(user: user, articles: articles.to_a, billboards: [first_billboard, second_billboard])
+ .digest_email.deliver_now
rescue StandardError => e
Honeybadger.context({ user_id: user.id, article_ids: articles.map(&:id) })
Honeybadger.notify(e)
diff --git a/spec/mailers/digest_mailer_spec.rb b/spec/mailers/digest_mailer_spec.rb
index 61b2e7ebd..242bc3fb3 100644
--- a/spec/mailers/digest_mailer_spec.rb
+++ b/spec/mailers/digest_mailer_spec.rb
@@ -33,5 +33,15 @@ RSpec.describe DigestMailer do
expect(smtpapi_header).to have_key("category")
expect(smtpapi_header["category"]).to include("Digest Email")
end
+
+ it "includes billboard html in body" do
+ bb_1 = create(:billboard, placement_area: "digest_first", published: true, approved: true)
+ bb_2 = create(:billboard, placement_area: "digest_second", published: true, approved: true)
+
+ email = described_class.with(user: user, articles: [article], billboards: [bb_1, bb_2]).digest_email
+
+ expect(email.body.encoded).to include(bb_1.processed_html)
+ expect(email.body.encoded).to include(bb_2.processed_html)
+ end
end
end
diff --git a/spec/mailers/previews/digest_mailer_preview.rb b/spec/mailers/previews/digest_mailer_preview.rb
index b99f302f0..1794988d7 100644
--- a/spec/mailers/previews/digest_mailer_preview.rb
+++ b/spec/mailers/previews/digest_mailer_preview.rb
@@ -1,6 +1,16 @@
# Preview all emails at http://localhost:3000/rails/mailers/digest_mailer
class DigestMailerPreview < ActionMailer::Preview
def digest_email
- DigestMailer.with(user: User.last, articles: Article.all).digest_email
+ user = User.last
+ tags = user.cached_followed_tag_names&.first(12)
+ first_billboard = Billboard.for_display(area: "digest_first",
+ user_id: user.id,
+ user_tags: tags,
+ user_signed_in: true)
+ second_billboard = Billboard.for_display(area: "digest_second",
+ user_id: user.id,
+ user_tags: tags,
+ user_signed_in: true)
+ DigestMailer.with(user: user, articles: Article.all, billboards: [first_billboard, second_billboard]).digest_email
end
end
diff --git a/spec/workers/emails/send_user_digest_worker_spec.rb b/spec/workers/emails/send_user_digest_worker_spec.rb
index 912ca19cc..5ef4c4214 100644
--- a/spec/workers/emails/send_user_digest_worker_spec.rb
+++ b/spec/workers/emails/send_user_digest_worker_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Emails::SendUserDigestWorker, type: :worker do
worker.perform(user.id)
- expect(DigestMailer).to have_received(:with).with(user: user, articles: Array)
+ expect(DigestMailer).to have_received(:with).with(user: user, articles: Array, billboards: Array)
expect(mailer).to have_received(:digest_email)
expect(message_delivery).to have_received(:deliver_now)
end
@@ -48,6 +48,18 @@ RSpec.describe Emails::SendUserDigestWorker, type: :worker do
expect(DigestMailer).not_to have_received(:with)
end
+
+ it "includes billboards" do
+ create_list(:article, 3, user_id: author.id, public_reactions_count: 20, score: 20)
+ bb_1 = create(:billboard, placement_area: "digest_first", published: true, approved: true)
+ bb_2 = create(:billboard, placement_area: "digest_second", published: true, approved: true)
+
+ worker.perform(user.id)
+
+ expect(DigestMailer).to have_received(:with) do |args|
+ expect(args[:billboards]).to contain_exactly(bb_1, bb_2)
+ end
+ end
end
end
end
|