lib/acts-as-messageable/model.rb in acts-as-messageable-0.4.5 vs lib/acts-as-messageable/model.rb in acts-as-messageable-0.4.6
- old
+ new
@@ -8,71 +8,72 @@
module ClassMethods
mattr_accessor :messages_class_name
# Method make ActiveRecord::Base object messageable
# @param [Symbol] :table_name - table name for messages
+ # @param [String] :class_name - message class name
+ # @param [Array, Symbol] :required - required fields in message
+ # @param [Symbol] :dependent - dependent option from ActiveRecord has_many method
def acts_as_messageable(options = {})
has_many :received_messages_relation,
:as => :received_messageable,
:class_name => options[:class_name] || "ActsAsMessageable::Message",
- :dependent => :nullify
+ :dependent => options[:dependent] || :nullify
has_many :sent_messages_relation,
:as => :sent_messageable,
:class_name => options[:class_name] || "ActsAsMessageable::Message",
- :dependent => :nullify
+ :dependent => options[:dependent] || :nullify
self.messages_class_name = (options[:class_name] || "ActsAsMessageable::Message").constantize
if self.messages_class_name.respond_to?(:table_name=)
self.messages_class_name.table_name = (options[:table_name] || "messages")
else
self.messages_class_name.set_table_name(options[:table_name] || "messages")
ActiveSupport::Deprecation.warn("Calling set_table_name is deprecated. Please use `self.table_name = 'the_name'` instead.")
end
- if options[:required].is_a? Symbol
- self.messages_class_name.required = [options[:required]]
- elsif options[:required].is_a? Array
- self.messages_class_name.required = options[:required]
- else
- self.messages_class_name.required = [:topic, :body]
- end
-
+ self.messages_class_name.required = Array.wrap(options[:required] || [:topic, :body])
self.messages_class_name.validates_presence_of self.messages_class_name.required
+
include ActsAsMessageable::Model::InstanceMethods
end
+ # Method recognize real object class
+ # @return [ActiveRecord::Base] class or relation object
def resolve_active_record_ancestor
self.reflect_on_association(:received_messages_relation).active_record
end
end
module InstanceMethods
- # Get all messages connected with user
# @return [ActiveRecord::Relation] all messages connected with user
def messages(trash = false)
result = self.class.messages_class_name.connected_with(self, trash)
result.relation_context = self
result
end
+ # @return [ActiveRecord::Relation] returns all messages from inbox
def received_messages
result = received_messages_relation.scoped.where(:recipient_delete => false)
result.relation_context = self
result
end
+ # @return [ActiveRecord::Relation] returns all messages from outbox
def sent_messages
result = sent_messages_relation.scoped.where(:sender_delete => false)
result.relation_context = self
result
end
+ # @return [ActiveRecord::Relation] returns all messages from trash
def deleted_messages
messages true
end
# Method sens message to another user
@@ -80,13 +81,14 @@
# @param [String] topic
# @param [String] body
#
# @return [ActsAsMessageable::Message] the message object
def send_message(to, *args)
+ message_attributes = {}
+
case args.first
when String
- message_attributes = {}
self.class.messages_class_name.required.each_with_index do |attribute, index|
message_attributes[attribute] = args[index]
end
when Hash
message_attributes = args.first
@@ -98,39 +100,57 @@
to.received_messages_relation << message
message
end
+ # Reply to given message
+ # @param [ActsAsMessageable::Message] message
+ # @param [String] topic
+ # @param [String] body
+ #
+ # @return [ActsAsMessageable::Message] a message that is a response to a given message
def reply_to(message, *args)
current_user = self
-
- if message.participant?(current_user)
+
+ if message.participant?(current_user)
reply_message = send_message(message.from, *args)
reply_message.parent = message
reply_message.save
reply_message
end
end
+ # Mark message as deleted
def delete_message(message)
current_user = self
- if message.received_messageable == current_user
- unless message.recipient_delete
- message.update_attributes!(:recipient_delete => true)
+ case current_user
+ when message.to
+ attribute = message.recipient_delete ? :recipient_permanent_delete : :recipient_delete
+ when message.from
+ attribute = message.sender_delete ? :sender_permanent_delete : :sender_delete
else
- message.update_attributes!(:recipient_permanent_delete => true)
- end
- elsif message.sent_messageable == current_user
- unless message.sender_delete
- message.update_attributes!(:sender_delete => true)
- else
- message.update_attributes!(:sender_permanent_delete => true)
- end
+ raise "#{current_user} can't delete this message"
end
+
+ message.update_attributes!(attribute => true)
end
- end
+ # Mark message as restored
+ def restore_message(message)
+ current_user = self
+ case current_user
+ when message.to
+ attribute = :recipient_delete
+ when message.from
+ attribute = :sender_delete
+ else
+ raise "#{current_user} can't delete this message"
+ end
+
+ message.update_attributes!(attribute => false)
+ end
+ end
end
end