Made messages more thread-like (replies, editing, etc.)

This commit is contained in:
MrYummy
2017-06-15 14:27:42 +02:00
parent 80026caebc
commit 9b50ec652c
21 changed files with 380 additions and 21 deletions

View File

@@ -4,12 +4,34 @@ class Message < ActiveRecord::Base
belongs_to :user_sender, class_name: "User", foreign_key: "user_sender_id"
belongs_to :user_target, class_name: "User", foreign_key: "user_target_id"
belongs_to :user_editor, class_name: "User", foreign_key: "user_editor_id"
belongs_to :user_hidden, class_name: "User", foreign_key: "user_hidden_id"
validates_presence_of :user_sender, :user_target, :text, :subject
validates_length_of :text, in: 1..8000
validates_length_of :subject, in: 1..2000
has_many :messagereplies
accepts_nested_attributes_for :messagereplies
before_destroy :do_destroy?
def do_destroy?
unless user_hidden || user_sender == user_target
update_attributes(user_hidden: User.current)
return false
else
return true
end
end
def to_s
subject
end
def sender
@sender ||= if self.user_sender.present?
user_sender
@@ -26,6 +48,18 @@ class Message < ActiveRecord::Base
end
end
def editor
@editor ||= (self.user_editor || User.first)
end
def edited?
!!user_editor_id
end
def replies
messagereplies
end
def send_new_message_mail
begin
mail = RedstonerMailer.new_message_mail(user_target, self)

View File

@@ -0,0 +1,67 @@
class Messagereply < ActiveRecord::Base
include MailerHelper
include UsersHelper
belongs_to :message
belongs_to :user_author, class_name: "User", foreign_key: "user_author_id"
belongs_to :user_editor, class_name: "User", foreign_key: "user_editor_id"
validates_presence_of :text
validates_length_of :text, in: 1..8000
def get_message
message
end
def author
@author ||= if self.user_author.present?
user_author
else
User.first
end
end
def editor
# can be nil
@editor ||= user_editor
end
def edited?
!!user_editor_id
end
def send_new_reply_mail(old_content = "")
users = mentions(content) - mentions(old_content)
# thread + replies
posts = message.replies.to_a
posts << message if message.author.mail_own_message_reply?
# only send "reply" mail when reply is new
unless old_content.present?
posts.each do |post|
# don't send mail to the author of this reply, don't send to banned/disabled users
if post.author != author && post.author.normal? && post.author.confirmed? # &&
users << post.author if post.author.mail_other_thread_reply?
end
end
end
# making sure we don't send multiple mails to the same user
users.uniq!
mails = []
users.each do |usr|
begin
mails << RedstonerMailer.new_thread_reply_mail(usr, self)
rescue => e
Rails.logger.error "---"
Rails.logger.error "WARNING: Failed to create new_thread_reply_mail (view) for reply#: #{@self.id}, user: #{@user.name}, #{@user.email}"
Rails.logger.error e.message
Rails.logger.error "---"
end
end
background_mailer(mails)
end
end

View File

@@ -24,6 +24,8 @@ class User < ActiveRecord::Base
has_many :blogposts
has_many :comments
cattr_accessor :current
# foo.bar.is?(current_user)
def is? (user)
self == user