discourse/app/models/user_email_observer.rb

86 lines
1.9 KiB
Ruby
Raw Normal View History

2013-02-06 03:16:51 +08:00
class UserEmailObserver < ActiveRecord::Observer
observe :notification
class EmailUser
attr_reader :notification
2013-07-22 00:50:01 +08:00
def initialize(notification)
@notification = notification
end
def mentioned
enqueue :user_mentioned
2013-02-06 03:16:51 +08:00
end
def posted
enqueue :user_posted
end
2013-02-06 03:16:51 +08:00
def quoted
enqueue :user_quoted
end
def replied
enqueue :user_replied
end
def private_message
enqueue_private :user_private_message
end
def invited_to_private_message
enqueue :user_invited_to_private_message
end
def invited_to_topic
enqueue :user_invited_to_topic
end
private
def enqueue(type)
return unless notification.user.email_direct?
Jobs.enqueue_in(delay,
:user_email,
type: type,
user_id: notification.user_id,
notification_id: notification.id)
end
def enqueue_private(type)
return unless (notification.user.email_direct? && notification.user.email_private_messages?)
Jobs.enqueue_in(delay,
:user_email,
type: type,
user_id: notification.user_id,
notification_id: notification.id)
end
def delay
2013-08-27 09:52:09 +08:00
SiteSetting.email_time_window_mins.minutes
end
2013-02-06 03:16:51 +08:00
end
def after_commit(notification)
2014-02-18 00:44:28 +08:00
transaction_includes_action = notification.send(:transaction_include_any_action?, [:create])
delegate_to_email_user notification if transaction_includes_action
2013-02-06 03:16:51 +08:00
end
private
def extract_notification_type(notification)
Notification.types[notification.notification_type]
end
def delegate_to_email_user(notification)
email_user = EmailUser.new(notification)
email_method = extract_notification_type notification
email_user.send(email_method) if email_user.respond_to? email_method
2013-02-06 03:16:51 +08:00
end
end