From 0ce69bd4665d56114ab861eb195988f94a5ef589 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 9 Apr 2025 14:49:03 +0200 Subject: [PATCH] [WiP] Quote post filtering --- app/lib/status_cache_hydrator.rb | 2 ++ app/models/status.rb | 4 ++++ app/presenters/status_relationships_presenter.rb | 3 +++ app/serializers/rest/quote_serializer.rb | 8 +++++++- app/serializers/rest/shallow_quote_serializer.rb | 8 +++++++- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/lib/status_cache_hydrator.rb b/app/lib/status_cache_hydrator.rb index 676e9e62a07..dab9b4cd93e 100644 --- a/app/lib/status_cache_hydrator.rb +++ b/app/lib/status_cache_hydrator.rb @@ -6,6 +6,8 @@ class StatusCacheHydrator end def hydrate(account_id) + # TODO: handle quotes + # The cache of the serialized hash is generated by the fan-out-on-write service payload = Rails.cache.fetch("fan-out/#{@status.id}") { InlineRenderer.render(@status, nil, :status) } diff --git a/app/models/status.rb b/app/models/status.rb index f1540b7e413..5b8598e78c8 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -348,6 +348,10 @@ class Status < ApplicationRecord end class << self + def quoted_status_ids(status_ids) + Quote.where(status_id: status_ids).pluck(:quoted_status_id).compact + end + def favourites_map(status_ids, account_id) Favourite.select(:status_id).where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true } end diff --git a/app/presenters/status_relationships_presenter.rb b/app/presenters/status_relationships_presenter.rb index 5d53040fb25..6dbe62c43b8 100644 --- a/app/presenters/status_relationships_presenter.rb +++ b/app/presenters/status_relationships_presenter.rb @@ -17,6 +17,9 @@ class StatusRelationshipsPresenter else statuses = statuses.compact status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id] }.uniq.compact + quoted_ids = Status.quoted_status_ids(status_ids) + status_ids = (status_ids + quoted_ids).uniq + # TODO: pinnable_status_ids, conversation_ids, and filters_map are not built with quoted_ids at this point conversation_ids = statuses.filter_map(&:conversation_id).uniq pinnable_status_ids = statuses.map(&:proper).filter_map { |s| s.id if s.account_id == current_account_id && PINNABLE_VISIBILITIES.include?(s.visibility) } diff --git a/app/serializers/rest/quote_serializer.rb b/app/serializers/rest/quote_serializer.rb index 5399554ec86..64e6f12c72a 100644 --- a/app/serializers/rest/quote_serializer.rb +++ b/app/serializers/rest/quote_serializer.rb @@ -6,6 +6,12 @@ class REST::QuoteSerializer < ActiveModel::Serializer has_one :quoted_status, serializer: REST::ShallowStatusSerializer def quoted_status - object.quoted_status if object.accepted? + return unless object.accepted? + + quoted_status = object.quoted_status + return if quoted_status.nil? + + status_filter = StatusFilter.new(quoted_status, current_user&.account, instance_options[:relationships] || {}) + quoted_status unless status_filter.filtered? end end diff --git a/app/serializers/rest/shallow_quote_serializer.rb b/app/serializers/rest/shallow_quote_serializer.rb index 7a5d682b093..7abadc223c3 100644 --- a/app/serializers/rest/shallow_quote_serializer.rb +++ b/app/serializers/rest/shallow_quote_serializer.rb @@ -4,6 +4,12 @@ class REST::ShallowQuoteSerializer < ActiveModel::Serializer attributes :state, :quoted_status_id def quoted_status_id - object.quoted_status&.id&.to_s if object.accepted? + return unless object.accepted? + + quoted_status = object.quoted_status + return if quoted_status.nil? + + status_filter = StatusFilter.new(quoted_status, current_user&.account, instance_options[:relationships] || {}) + quoted_status.id.to_s unless status_filter.filtered? end end