Sha256: 14c5f19f2b7c488215bf8318e0b3b30128b36dd372f551f4a4ef95ee6998ff40

Contents?: true

Size: 1.57 KB

Versions: 4

Compression:

Stored size: 1.57 KB

Contents

# frozen_string_literal: true
module Thredded
  class NotifyMentionedUsers
    def initialize(post)
      @post = post
    end

    def run
      members = at_notifiable_members
      return unless members.present?

      user_emails = members.map(&:email)
      (post.private_topic_post? ? PrivatePostMailer : PostMailer)
        .at_notification(post.id, user_emails)
        .deliver_later
      MembersMarkedNotified.new(post, members).run
    end

    def at_notifiable_members
      user_names = AtNotificationExtractor.new(post.content).run
      members    = post.readers_from_user_names(user_names).to_a

      members.delete post.user
      members = exclude_previously_notified(members)
      members = exclude_those_that_are_not_private(members)
      members = exclude_those_opting_out_of_at_notifications(members)

      members
    end

    private

    attr_reader :post

    def exclude_those_opting_out_of_at_notifications(members)
      members.select do |member|
        member.thredded_user_preference.notify_on_mention? &&
          (private_topic? || member.thredded_user_messageboard_preferences.in(post.messageboard).notify_on_mention?)
      end
    end

    def exclude_those_that_are_not_private(members)
      members.reject { |member| private_topic? && post.postable.users.exclude?(member) }
    end

    def exclude_previously_notified(members)
      emails_notified = Thredded::PostNotification.where(post: post).pluck(:email)
      members.reject { |member| emails_notified.include? member.email }
    end

    def private_topic?
      post.private_topic_post?
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
thredded-0.4.0 app/commands/thredded/notify_mentioned_users.rb
thredded-0.3.2 app/commands/thredded/notify_mentioned_users.rb
thredded-0.3.1 app/commands/thredded/notify_mentioned_users.rb
thredded-0.3.0 app/commands/thredded/notify_mentioned_users.rb