queue emails right away if a user is not online, no point waiting.

This commit is contained in:
Sam 2013-08-26 14:55:35 +10:00
parent bb3725cfca
commit 322b5c236c
2 changed files with 28 additions and 9 deletions

View File

@ -36,7 +36,9 @@ class UserEmailObserver < ActiveRecord::Observer
def enqueue(type) def enqueue(type)
return unless notification.user.email_direct? return unless notification.user.email_direct?
Jobs.enqueue_in(SiteSetting.email_time_window_mins.minutes,
Jobs.enqueue_in(delay,
:user_email, :user_email,
type: type, type: type,
user_id: notification.user_id, user_id: notification.user_id,
@ -45,12 +47,22 @@ class UserEmailObserver < ActiveRecord::Observer
def enqueue_private(type) def enqueue_private(type)
return unless (notification.user.email_direct? && notification.user.email_private_messages?) return unless (notification.user.email_direct? && notification.user.email_private_messages?)
Jobs.enqueue_in(SiteSetting.email_time_window_mins.minutes, Jobs.enqueue_in(delay,
:user_email, :user_email,
type: type, type: type,
user_id: notification.user_id, user_id: notification.user_id,
notification_id: notification.id) notification_id: notification.id)
end end
def delay
mins = SiteSetting.email_time_window_mins.minutes
if notification.user &&
(!notification.user.last_seen_at || notification.user.last_seen_at < mins.ago)
0
else
mins
end
end
end end
def after_commit(notification) def after_commit(notification)
@ -65,6 +77,7 @@ class UserEmailObserver < ActiveRecord::Observer
private private
def extract_notification_type(notification) def extract_notification_type(notification)
Notification.types[notification.notification_type] Notification.types[notification.notification_type]
end end

View File

@ -8,6 +8,12 @@ describe UserEmailObserver do
let!(:notification) { Fabricate(:notification, user: user) } let!(:notification) { Fabricate(:notification, user: user) }
it "enqueues a job for the email" do it "enqueues a job for the email" do
Jobs.expects(:enqueue_in).with(0, :user_email, type: :user_mentioned, user_id: notification.user_id, notification_id: notification.id)
UserEmailObserver.send(:new).after_commit(notification)
end
it "enqueue a delayed job for users that are online" do
user.last_seen_at = 1.minute.ago
Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, type: :user_mentioned, user_id: notification.user_id, notification_id: notification.id) Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, type: :user_mentioned, user_id: notification.user_id, notification_id: notification.id)
UserEmailObserver.send(:new).after_commit(notification) UserEmailObserver.send(:new).after_commit(notification)
end end
@ -26,7 +32,7 @@ describe UserEmailObserver do
let!(:notification) { Fabricate(:notification, user: user, notification_type: 9) } let!(:notification) { Fabricate(:notification, user: user, notification_type: 9) }
it "enqueues a job for the email" do it "enqueues a job for the email" do
Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, type: :user_posted, user_id: notification.user_id, notification_id: notification.id) Jobs.expects(:enqueue_in).with(0, :user_email, type: :user_posted, user_id: notification.user_id, notification_id: notification.id)
UserEmailObserver.send(:new).after_commit(notification) UserEmailObserver.send(:new).after_commit(notification)
end end
@ -44,7 +50,7 @@ describe UserEmailObserver do
let!(:notification) { Fabricate(:notification, user: user, notification_type: 2) } let!(:notification) { Fabricate(:notification, user: user, notification_type: 2) }
it "enqueues a job for the email" do it "enqueues a job for the email" do
Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, type: :user_replied, user_id: notification.user_id, notification_id: notification.id) Jobs.expects(:enqueue_in).with(0, :user_email, type: :user_replied, user_id: notification.user_id, notification_id: notification.id)
UserEmailObserver.send(:new).after_commit(notification) UserEmailObserver.send(:new).after_commit(notification)
end end
@ -62,13 +68,13 @@ describe UserEmailObserver do
let!(:notification) { Fabricate(:notification, user: user, notification_type: 3) } let!(:notification) { Fabricate(:notification, user: user, notification_type: 3) }
it "enqueues a job for the email" do it "enqueues a job for the email" do
Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, type: :user_quoted, user_id: notification.user_id, notification_id: notification.id) Jobs.expects(:enqueue_in).with(0, :user_email, type: :user_quoted, user_id: notification.user_id, notification_id: notification.id)
UserEmailObserver.send(:new).after_commit(notification) UserEmailObserver.send(:new).after_commit(notification)
end end
it "doesn't enqueue an email if the user has mention emails disabled" do it "doesn't enqueue an email if the user has mention emails disabled" do
user.expects(:email_direct?).returns(false) user.expects(:email_direct?).returns(false)
Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, has_entry(type: :user_quoted)).never Jobs.expects(:enqueue_in).with(0, :user_email, has_entry(type: :user_quoted)).never
UserEmailObserver.send(:new).after_commit(notification) UserEmailObserver.send(:new).after_commit(notification)
end end
@ -80,16 +86,16 @@ describe UserEmailObserver do
let!(:notification) { Fabricate(:notification, user: user, notification_type: 7) } let!(:notification) { Fabricate(:notification, user: user, notification_type: 7) }
it "enqueues a job for the email" do it "enqueues a job for the email" do
Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, type: :user_invited_to_private_message, user_id: notification.user_id, notification_id: notification.id) Jobs.expects(:enqueue_in).with(0, :user_email, type: :user_invited_to_private_message, user_id: notification.user_id, notification_id: notification.id)
UserEmailObserver.send(:new).after_commit(notification) UserEmailObserver.send(:new).after_commit(notification)
end end
it "doesn't enqueue an email if the user has mention emails disabled" do it "doesn't enqueue an email if the user has mention emails disabled" do
user.expects(:email_direct?).returns(false) user.expects(:email_direct?).returns(false)
Jobs.expects(:enqueue_in).with(SiteSetting.email_time_window_mins.minutes, :user_email, has_entry(type: :user_invited_to_private_message)).never Jobs.expects(:enqueue_in).with(0, :user_email, has_entry(type: :user_invited_to_private_message)).never
UserEmailObserver.send(:new).after_commit(notification) UserEmailObserver.send(:new).after_commit(notification)
end end
end end
end end