lib/acts_as_messageable/message.rb in acts-as-messageable-0.5.0 vs lib/acts_as_messageable/message.rb in acts-as-messageable-1.0.0

- old
+ new

@@ -1,78 +1,135 @@ +# typed: strict # frozen_string_literal: true -require 'ancestry' - module ActsAsMessageable class Message < ::ActiveRecord::Base + extend T::Sig + include ActsAsMessageable::Scopes + include Ancestry::InstanceMethods has_ancestry belongs_to :received_messageable, polymorphic: true belongs_to :sent_messageable, polymorphic: true + sig { returns(T.nilable(T::Boolean)) } attr_accessor :removed, :restored cattr_accessor :required + sig { params(args: T.untyped, kwargs: T.untyped).void } + def initialize(*args, **kwargs) + @removed = T.let(false, T.nilable(T::Boolean)) + @restored = T.let(false, T.nilable(T::Boolean)) + + super + end + ActsAsMessageable.rails_api.new(self).attr_accessible( :topic, :body, :opened, :opened_at, :recipient_permanent_delete, :recipient_delete, :sender_permanent_delete, :sender_delete ) ActsAsMessageable.rails_api.new(self).default_scope('created_at desc') + # @return [Boolean] whether the message has been read + sig { returns(T::Boolean) } def open? opened? end + # @return [Boolean] whether the message has been read + # @see open? + sig { returns(T::Boolean) } def opened? opened_at.present? || super end + # Method open message (will mark message as read) + # @return [Boolean] whether the message has been open + sig { returns(T::Boolean) } def open ActsAsMessageable.rails_api.new(self).update_attributes!(opened_at: DateTime.now) ActsAsMessageable.rails_api.new(self).update_attributes!(opened: true) end alias mark_as_read open alias read open + # Method close message (will mark message as unread) + # @return [Boolean] whether the message has been closed + sig { returns(T::Boolean) } def close ActsAsMessageable.rails_api.new(self).update_attributes!(opened_at: nil) ActsAsMessageable.rails_api.new(self).update_attributes!(opened: false) end alias mark_as_unread close alias unread close - alias from sent_messageable - alias to received_messageable + sig { returns(ActiveRecord::Base) } + def from + sent_messageable + end + sig { returns(ActiveRecord::Base) } + def to + received_messageable + end + + # @param [ActiveRecord::Base] user + # @return [ActiveRecord::Base] real receiver of the mssage + sig { params(user: ActiveRecord::Base).returns(ActiveRecord::Base) } def real_receiver(user) user == from ? to : from end + # @return [Boolean] whether user is participant of group message + # @param [ActiveRecord::Base] user + sig { params(user: T.untyped).returns(T::Boolean) } def participant?(user) user.class.group_messages || (to == user) || (from == user) end + # @return [Object] conversation tree + sig { returns(T.untyped) } def conversation root.subtree end + # Method will mark message as removed + # @return [TrueClass] + sig { returns(TrueClass) } def delete self.removed = true end + # Method will mark message as removed + # @return [TrueClass] + sig { returns(TrueClass) } def restore self.restored = true end + # Reply to given message + # @param [Hash] args + # @option args [String] topic Topic of the message + # @option args [String] body Body of the message + # @return [ActsAsMessageable::Message] a message that is a response to a given message + # @return [Boolean] when user is not participant of the message + # @see ActsAsMessageable::Model::InstanceMethods#reply_to + sig do + params(args: T.any(T::Hash[String, String], + String)).returns(T.any(ActsAsMessageable::Message, T::Boolean, ActiveRecord::Base)) + end def reply(*args) - to.reply_to(self, *args) + T.unsafe(to).reply_to(self, *args) end + # Method will return list of users in the conversation + # @return [Array<ActiveRecord::Base>] users + sig { returns(T::Array[ActiveRecord::Base]) } def people conversation.map(&:from).uniq! end end end