dmails: allow marking dmails as unread.

* Add ability to mark dmails as unread.
* Fix users.unread_dmail_count to not count deleted dmails.
* Fix show action so that API calls don't mark dmails as read.
* Don't show the unread dmail notice on the /dmails page itself.
* Stop using users.has_mail flag.
This commit is contained in:
evazion
2020-01-31 15:47:58 -06:00
parent 067c6a10e7
commit 6468df6d44
12 changed files with 107 additions and 50 deletions

View File

@@ -14,7 +14,7 @@ class Dmail < ApplicationRecord
belongs_to :from, :class_name => "User"
after_initialize :initialize_attributes, if: :new_record?
after_create :update_recipient
after_save :update_unread_dmail_count
after_commit :send_email, on: :create
api_attributes including: [:key]
@@ -152,6 +152,10 @@ class Dmail < ApplicationRecord
include FactoryMethods
extend SearchMethods
def self.mark_all_as_read
unread.update(is_read: true)
end
def validate_sender_is_not_banned
if from.try(:is_banned?)
errors[:base] << "Sender is banned and cannot send messages"
@@ -168,13 +172,6 @@ class Dmail < ApplicationRecord
end
end
def mark_as_read!
update_column(:is_read, true)
owner.dmails.unread.count.tap do |unread_count|
owner.update(has_mail: (unread_count > 0), unread_dmail_count: unread_count)
end
end
def is_automated?
from == User.system
end
@@ -187,9 +184,12 @@ class Dmail < ApplicationRecord
owner == to
end
def update_recipient
if is_recipient? && !is_deleted? && !is_read?
to.update(has_mail: true, unread_dmail_count: to.dmails.unread.count)
def update_unread_dmail_count
return unless saved_change_to_id? || saved_change_to_is_read? || saved_change_to_is_deleted?
owner.with_lock do
unread_count = owner.dmails.active.unread.count
owner.update!(unread_dmail_count: unread_count)
end
end

View File

@@ -35,6 +35,7 @@ class User < ApplicationRecord
# - has_saved_searches
# - opt_out_tracking
# - enable_recommended_posts
# - has_mail
BOOLEAN_ATTRIBUTES = %w(
is_banned
has_mail
@@ -798,14 +799,6 @@ class User < ApplicationRecord
CurrentUser.as(self, &block)
end
def dmail_count
if has_mail?
"(#{unread_dmail_count})"
else
""
end
end
def reportable_by?(user)
ModerationReport.enabled? && user.is_builder? && id != user.id && !is_moderator?
end