2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
class PostActionNotifier
|
2014-03-17 22:12:07 -04:00
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
def self.disable
|
|
|
|
@disabled = true
|
2016-03-04 06:55:49 -05:00
|
|
|
end
|
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
def self.enable
|
|
|
|
@disabled = false
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
def self.alerter
|
|
|
|
@alerter ||= PostAlerter.new
|
2013-02-07 10:45:24 -05:00
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
def self.refresh_like_notification(post, read)
|
2018-01-17 14:36:20 -05:00
|
|
|
return unless post && post.user_id && post.topic
|
2016-03-04 06:55:49 -05:00
|
|
|
|
|
|
|
usernames = post.post_actions.where(post_action_type_id: PostActionType.types[:like])
|
|
|
|
.joins(:user)
|
|
|
|
.order('post_actions.created_at desc')
|
|
|
|
.where('post_actions.created_at > ?', 1.day.ago)
|
|
|
|
.pluck(:username)
|
|
|
|
|
|
|
|
if usernames.length > 0
|
|
|
|
data = {
|
|
|
|
topic_title: post.topic.title,
|
|
|
|
username: usernames[0],
|
|
|
|
display_username: usernames[0],
|
|
|
|
username2: usernames[1],
|
|
|
|
count: usernames.length
|
|
|
|
}
|
|
|
|
Notification.create(
|
|
|
|
notification_type: Notification.types[:liked],
|
|
|
|
topic_id: post.topic_id,
|
|
|
|
post_number: post.post_number,
|
|
|
|
user_id: post.user_id,
|
|
|
|
read: read,
|
|
|
|
data: data.to_json
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
def self.post_action_deleted(post_action)
|
|
|
|
return if @disabled
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
# We only care about deleting post actions for now
|
2013-02-28 13:54:12 -05:00
|
|
|
return if post_action.deleted_at.blank?
|
2016-03-04 06:55:49 -05:00
|
|
|
|
|
|
|
if post_action.post_action_type_id == PostActionType.types[:like] && post_action.post
|
|
|
|
|
|
|
|
read = true
|
|
|
|
|
|
|
|
Notification.where(
|
|
|
|
topic_id: post_action.post.topic_id,
|
|
|
|
user_id: post_action.post.user_id,
|
|
|
|
post_number: post_action.post.post_number,
|
|
|
|
notification_type: Notification.types[:liked]
|
|
|
|
).each do |notification|
|
|
|
|
read = false unless notification.read
|
|
|
|
notification.destroy
|
|
|
|
end
|
|
|
|
|
|
|
|
refresh_like_notification(post_action.post, read)
|
|
|
|
else
|
|
|
|
# not using destroy_all cause we want stuff to trigger
|
|
|
|
Notification.where(post_action_id: post_action.id).each(&:destroy)
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
def self.post_action_created(post_action)
|
|
|
|
return if @disabled
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
# We only notify on likes for now
|
|
|
|
return unless post_action.is_like?
|
|
|
|
|
|
|
|
post = post_action.post
|
2013-02-07 10:45:24 -05:00
|
|
|
return if post_action.user.blank?
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2019-01-16 03:17:04 -05:00
|
|
|
alerter.create_notification(
|
|
|
|
post.user,
|
|
|
|
Notification.types[:liked],
|
|
|
|
post,
|
|
|
|
display_username: post_action.user.username,
|
|
|
|
post_action_id: post_action.id,
|
|
|
|
user_id: post_action.user_id
|
|
|
|
)
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2016-12-22 00:46:22 -05:00
|
|
|
def self.after_create_post_revision(post_revision)
|
|
|
|
return if @disabled
|
2016-03-04 06:55:49 -05:00
|
|
|
|
2013-12-11 21:41:34 -05:00
|
|
|
post = post_revision.post
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2014-01-06 02:12:51 -05:00
|
|
|
return unless post
|
2013-12-11 21:41:34 -05:00
|
|
|
return if post_revision.user.blank?
|
2018-05-15 14:50:31 -04:00
|
|
|
return if post.topic.blank?
|
2013-02-05 14:16:51 -05:00
|
|
|
return if post.topic.private_message?
|
2019-07-31 10:50:41 -04:00
|
|
|
return if SiteSetting.disable_system_edit_notifications && post_revision.user_id == Discourse::SYSTEM_USER_ID
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2019-05-08 03:58:08 -04:00
|
|
|
user_ids = []
|
|
|
|
|
2019-05-08 03:18:56 -04:00
|
|
|
if post_revision.user_id != post.user_id
|
2019-05-08 03:58:08 -04:00
|
|
|
user_ids << post.user_id
|
2019-05-08 03:18:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
if post.wiki && post.is_first_post?
|
2019-05-08 03:58:08 -04:00
|
|
|
user_ids.concat(
|
|
|
|
TopicUser.watching(post.topic_id)
|
|
|
|
.where.not(user_id: post_revision.user_id)
|
|
|
|
.where(topic: post.topic)
|
|
|
|
.pluck(:user_id)
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
if user_ids.present?
|
2019-05-16 01:47:51 -04:00
|
|
|
DB.after_commit do
|
|
|
|
Jobs.enqueue(:notify_post_revision,
|
|
|
|
user_ids: user_ids,
|
|
|
|
post_revision_id: post_revision.id
|
|
|
|
)
|
|
|
|
end
|
2019-05-08 03:18:56 -04:00
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
2013-02-07 10:45:24 -05:00
|
|
|
|
2018-04-06 17:37:29 -04:00
|
|
|
def self.after_post_unhide(post, flaggers)
|
|
|
|
return if @disabled || post.last_editor.blank? || flaggers.blank?
|
|
|
|
|
|
|
|
flaggers.each do |flagger|
|
|
|
|
alerter.create_notification(
|
|
|
|
flagger,
|
|
|
|
Notification.types[:edited],
|
|
|
|
post,
|
|
|
|
display_username: post.last_editor.username,
|
|
|
|
acting_user_id: post.last_editor.id
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|