diff --git a/app/models/notification.rb b/app/models/notification.rb index e7ada3399..f70991d80 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -73,6 +73,9 @@ class Notification < ApplicationRecord 'admin.report': { filterable: false, }.freeze, + quote: { + filterable: true, + }.freeze, }.freeze TYPES = PROPERTIES.keys.freeze @@ -81,6 +84,7 @@ class Notification < ApplicationRecord status: :status, reblog: [status: :reblog], mention: [mention: :status], + quote: [quote: :status], favourite: [favourite: :status], poll: [poll: :status], update: :status, @@ -102,6 +106,7 @@ class Notification < ApplicationRecord belongs_to :account_relationship_severance_event, inverse_of: false belongs_to :account_warning, inverse_of: false belongs_to :generated_annual_report, inverse_of: false + belongs_to :quote, inverse_of: :notification end validates :type, inclusion: { in: TYPES } @@ -122,6 +127,8 @@ class Notification < ApplicationRecord favourite&.status when :mention mention&.status + when :quote + quote&.status when :poll poll&.status end @@ -174,6 +181,8 @@ class Notification < ApplicationRecord notification.mention.status = cached_status when :poll notification.poll.status = cached_status + when :quote + notification.quote.status = cached_status end end @@ -192,7 +201,7 @@ class Notification < ApplicationRecord return unless new_record? case activity_type - when 'Status', 'Follow', 'Favourite', 'FollowRequest', 'Poll', 'Report' + when 'Status', 'Follow', 'Favourite', 'FollowRequest', 'Poll', 'Report', 'Quote' self.from_account_id = activity&.account_id when 'Mention' self.from_account_id = activity&.status&.account_id diff --git a/app/models/notification_request.rb b/app/models/notification_request.rb index eb9ff93ab..d95fb58b4 100644 --- a/app/models/notification_request.rb +++ b/app/models/notification_request.rb @@ -49,6 +49,6 @@ class NotificationRequest < ApplicationRecord private def prepare_notifications_count - self.notifications_count = Notification.where(account: account, from_account: from_account, type: :mention, filtered: true).limit(MAX_MEANINGFUL_COUNT).count + self.notifications_count = Notification.where(account: account, from_account: from_account, type: [:mention, :quote], filtered: true).limit(MAX_MEANINGFUL_COUNT).count end end diff --git a/app/models/quote.rb b/app/models/quote.rb index b844805da..4ee5e4d41 100644 --- a/app/models/quote.rb +++ b/app/models/quote.rb @@ -19,6 +19,8 @@ class Quote < ApplicationRecord include Paginable + has_one :notification, as: :activity, dependent: :destroy + BACKGROUND_REFRESH_INTERVAL = 1.week.freeze REFRESH_DEADLINE = 6.hours diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb index 320bc8696..033bc1c04 100644 --- a/app/serializers/rest/notification_serializer.rb +++ b/app/serializers/rest/notification_serializer.rb @@ -21,7 +21,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer end def status_type? - [:favourite, :reblog, :status, :mention, :poll, :update].include?(object.type) + [:favourite, :reblog, :status, :mention, :poll, :update, :quote].include?(object.type) end def report_type? diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index f3aa479c1..41a4e210e 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -40,6 +40,7 @@ class FanOutOnWriteService < BaseService deliver_to_self! unless @options[:skip_notifications] + notify_quoted_account! notify_mentioned_accounts! notify_about_update! if update? end @@ -69,6 +70,12 @@ class FanOutOnWriteService < BaseService FeedManager.instance.push_to_home(@account, @status, update: update?) if @account.local? end + def notify_quoted_account! + return unless @status.quote&.quoted_account&.local? && @status.quote&.accepted? + + LocalNotificationWorker.perform_async(@status.quote.quoted_account_id, @status.quote.id, 'Quote', 'quote') + end + def notify_mentioned_accounts! @status.active_mentions.where.not(id: @options[:silenced_account_ids] || []).joins(:account).merge(Account.local).select(:id, :account_id).reorder(nil).find_in_batches do |mentions| LocalNotificationWorker.push_bulk(mentions) do |mention| diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index f820f969a..95563698f 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -247,7 +247,7 @@ class NotifyService < BaseService end def update_notification_request! - return unless @notification.type == :mention + return unless %i(mention quote).include?(@notification.type) notification_request = NotificationRequest.find_or_initialize_by(account_id: @recipient.id, from_account_id: @notification.from_account_id) notification_request.last_status_id = @notification.target_status.id