module SimpleMessenger::MessageAdditions

Public Class Methods

included(message_model) click to toggle source
# File lib/simple_messenger/message_additions.rb, line 5
def self.included(message_model)
  message_model.belongs_to :sender, polymorphic: true
  message_model.belongs_to :receiver, polymorphic: true

  message_model.scope :unviewed, -> { message_model.where(viewed: false) }

  # Using ARel find all the messages where the model is sender or receiver.
  message_model.scope :all_for, ->(model) {
    message_model.where(
      ((message_model.arel_table[:sender_id].eq model.id).
          and(message_model.arel_table[:sender_type].eq model.class.to_s)).
        or((message_model.arel_table[:receiver_id].eq model.id).
          and(message_model.arel_table[:receiver_type].eq model.class.to_s))
    )
  }

  # Find a conversations between 2 models by joining all_for on both.
  message_model.scope :between, ->(models) {
    message_model.all_for(models.first).all_for(models.last)
  }

  message_model.validates_presence_of :sender_id, :sender_type,
    :receiver_id, :receiver_type

  # When given an array of messages, this will return a list of all the ids of the
  # models that have interacted together. Useful for creating a list of objects
  # which a given object has communicated with.
  #
  # remove is optional and takes a fixnum, object or array of either and will remove
  # it's id from the list. Useful for sending a current_user in to get a unique
  # list of other users which they have communicated with.
  def message_model.uniq_member_ids_for(msgs, remove: nil)
    ids = msgs.map { |m| [m.receiver_id, m.sender_id] }.flatten.uniq
    ids -= case
    when remove.respond_to?(:first)
      # If remove is an array, check for ActiveRecord object, if not return the element
      remove.first.respond_to?(:id) ? remove.map(&:id) : remove
    else
      # Check for ActiveRecord object, otherwise return the passed object
      [remove.respond_to?(:id) ? remove.id : remove].flatten
    end if remove
    ids
  end

  # Check if the message has been read by the recipient for highlighting
  # in a conversation. Without the check for the user being the recipient,
  # the messages that she sent would return true.
  def read?(obj)
    obj != receiver || viewed?
  end

  # This will return the other member in the communication then the one
  # provided. Note: still struggling with a good name for this method.
  def member_who_is_not(obj)
    case obj
    when sender
      receiver
    when receiver
      sender
    else
      raise SimpleMessenger::NotInvolved
    end
  end
end

Public Instance Methods

member_who_is_not(obj) click to toggle source

This will return the other member in the communication then the one provided. Note: still struggling with a good name for this method.

# File lib/simple_messenger/message_additions.rb, line 58
def member_who_is_not(obj)
  case obj
  when sender
    receiver
  when receiver
    sender
  else
    raise SimpleMessenger::NotInvolved
  end
end
read?(obj) click to toggle source

Check if the message has been read by the recipient for highlighting in a conversation. Without the check for the user being the recipient, the messages that she sent would return true.

# File lib/simple_messenger/message_additions.rb, line 52
def read?(obj)
  obj != receiver || viewed?
end