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