Merge pull request #2492 from consul/fix_newsletter_send_performance

Fixed how newsletters controller and mailer handle recipients
This commit is contained in:
Alberto Calderón Queimadelos
2018-02-28 19:03:58 +01:00
committed by GitHub
3 changed files with 21 additions and 10 deletions

View File

@@ -48,7 +48,10 @@ class Admin::NewslettersController < Admin::BaseController
@newsletter = Newsletter.find(params[:id])
if @newsletter.valid?
Mailer.newsletter(@newsletter).deliver_later
@newsletter.list_of_recipients.each do |recipient|
Mailer.newsletter(@newsletter, recipient).deliver_later
end
@newsletter.update(sent_at: Time.current)
flash[:notice] = t("admin.newsletters.send_success")
else

View File

@@ -126,13 +126,11 @@ class Mailer < ApplicationMailer
end
end
def newsletter(newsletter)
def newsletter(newsletter, recipient)
@newsletter = newsletter
@email_to = newsletter.list_of_recipients
@email_to = recipient.email
@email_to.map(&:email).uniq.each do |recipient|
mail(to: recipient, from: @newsletter.from, subject: @newsletter.subject)
end
mail(to: @email_to, from: @newsletter.from, subject: @newsletter.subject)
end
private

View File

@@ -494,20 +494,30 @@ feature 'Emails' do
context "Newsletter" do
scenario "Send newsletter email to selected users" do
user_with_newsletter_in_segment_1 = create(:user, newsletter: true)
user_with_newsletter_in_segment_2 = create(:user, newsletter: true)
user_with_newsletter_not_in_segment = create(:user, newsletter: true)
user_without_newsletter_in_segment = create(:user, newsletter: false)
create(:proposal, author: user_with_newsletter_in_segment_1)
create(:proposal, author: user_with_newsletter_in_segment_2)
create(:proposal, author: user_without_newsletter_in_segment)
admin = create(:administrator)
login_as(admin.user)
visit new_admin_newsletter_path
fill_in_newsletter_form
fill_in_newsletter_form(segment_recipient: 'Proposal authors')
click_button "Create Newsletter"
expect(page).to have_content "Newsletter created successfully"
click_link "Send"
UserSegments.send(Newsletter.first.segment_recipient).each do |user|
expect(unread_emails_for(user.email).count).to eq 1
end
expect(unread_emails_for(user_with_newsletter_in_segment_1.email).count).to eq 1
expect(unread_emails_for(user_with_newsletter_in_segment_2.email).count).to eq 1
expect(unread_emails_for(user_with_newsletter_not_in_segment.email).count).to eq 0
expect(unread_emails_for(user_without_newsletter_in_segment.email).count).to eq 0
email = open_last_email
expect(email).to have_subject('This is a different subject')