docbrown/app/services/notifications/new_follower/send.rb
Anna Buianova 07ffb2e3be
Removed spammers from followers list (#20603)
* Remove spam and suspended users from followers list (api and dashboards)

* Fixed the api followers endpoint

* Fixed issue with follower_ids query
2024-02-08 13:57:15 +00:00

70 lines
2.5 KiB
Ruby

# send notifications about the new followers
module Notifications
module NewFollower
class Send
def self.call(...)
new(...).call
end
# @param follow_data [Hash]
# * :followable_id [Integer]
# * :followable_type [String] - "User" or "Organization"
# * :follower_id [Integer] - user id
def initialize(follow_data, is_read: false)
follow_data = FollowData.coerce(follow_data)
@followable_id = follow_data.followable_id # fetch(:followable_id)
@followable_type = follow_data.followable_type # fetch(:followable_type)
@follower_id = follow_data.follower_id # fetch(:follower_id)
@is_read = is_read
end
delegate :user_data, to: Notifications
def call
recent_follows = Follow.non_suspended(followable_type, followable_id)
.where("follows.created_at > ?", 24.hours.ago).order(created_at: :desc)
notification_params = { action: "Follow" }
case followable_type
when "User"
notification_params[:user_id] = followable_id
when "Organization"
notification_params[:organization_id] = followable_id
end
followers = User.where(id: recent_follows.map(&:follower_id))
aggregated_siblings = followers.map { |follower| user_data(follower) }
if aggregated_siblings.empty?
notification = Notification.find_by(notification_params)&.destroy
else
json_data = { user: user_data(follower), aggregated_siblings: aggregated_siblings }
notification = Notification.find_or_initialize_by(notification_params)
# we explicitly load the correct follow, to avoid incurring in the possibility of
# two different follows created at the same time
notifiable_follow = recent_follows.detect { |f| f.follower_id == @follower_id }
# if this method is called after a ".stop_following" the follower_id won't be
# present, hence, we load the most recent
notifiable_follow ||= recent_follows.first
notification.notifiable_id = notifiable_follow.id
notification.notifiable_type = "Follow"
notification.json_data = json_data
notification.notified_at = Time.current
notification.read = is_read
notification.save!
end
notification
end
private
attr_reader :followable_id, :followable_type, :follower_id, :is_read
def follower
User.find(follower_id)
end
end
end
end