Add initial support for ingesting and verifying remote quote posts (#34370)
This commit is contained in:
		
							
								
								
									
										25
									
								
								app/serializers/rest/base_quote_serializer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								app/serializers/rest/base_quote_serializer.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class REST::BaseQuoteSerializer < ActiveModel::Serializer
 | 
			
		||||
  attributes :state
 | 
			
		||||
 | 
			
		||||
  def state
 | 
			
		||||
    return object.state unless object.accepted?
 | 
			
		||||
 | 
			
		||||
    # Extra states when a status is unavailable
 | 
			
		||||
    return 'deleted' if object.quoted_status.nil?
 | 
			
		||||
    return 'unauthorized' if status_filter.filtered?
 | 
			
		||||
 | 
			
		||||
    object.state
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def quoted_status
 | 
			
		||||
    object.quoted_status if object.accepted? && object.quoted_status.present? && !status_filter.filtered?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def status_filter
 | 
			
		||||
    @status_filter ||= StatusFilter.new(object.quoted_status, current_user&.account, instance_options[:relationships] || {})
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										5
									
								
								app/serializers/rest/quote_serializer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/serializers/rest/quote_serializer.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class REST::QuoteSerializer < REST::BaseQuoteSerializer
 | 
			
		||||
  has_one :quoted_status, serializer: REST::ShallowStatusSerializer
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										9
									
								
								app/serializers/rest/shallow_quote_serializer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/serializers/rest/shallow_quote_serializer.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class REST::ShallowQuoteSerializer < REST::BaseQuoteSerializer
 | 
			
		||||
  attribute :quoted_status_id
 | 
			
		||||
 | 
			
		||||
  def quoted_status_id
 | 
			
		||||
    quoted_status&.id&.to_s
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										9
									
								
								app/serializers/rest/shallow_status_serializer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/serializers/rest/shallow_status_serializer.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class REST::ShallowStatusSerializer < REST::StatusSerializer
 | 
			
		||||
  has_one :quote, key: :quote, serializer: REST::ShallowQuoteSerializer
 | 
			
		||||
 | 
			
		||||
  # It looks like redefining one `has_one` requires redefining all inherited ones
 | 
			
		||||
  has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
 | 
			
		||||
  has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
 | 
			
		||||
end
 | 
			
		||||
@@ -10,6 +10,8 @@ class REST::StatusEditSerializer < ActiveModel::Serializer
 | 
			
		||||
  has_many :ordered_media_attachments, key: :media_attachments, serializer: REST::MediaAttachmentSerializer
 | 
			
		||||
  has_many :emojis, serializer: REST::CustomEmojiSerializer
 | 
			
		||||
 | 
			
		||||
  has_one :quote, serializer: REST::QuoteSerializer, if: -> { object.quote_id.present? }
 | 
			
		||||
 | 
			
		||||
  attribute :poll, if: -> { object.poll_options.present? }
 | 
			
		||||
 | 
			
		||||
  def content
 | 
			
		||||
@@ -19,4 +21,8 @@ class REST::StatusEditSerializer < ActiveModel::Serializer
 | 
			
		||||
  def poll
 | 
			
		||||
    { options: object.poll_options.map { |title| { title: title } } }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def quote
 | 
			
		||||
    object.quote_id == status.quote&.id ? status.quote : Quote.new(state: :pending)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
 | 
			
		||||
  has_many :tags
 | 
			
		||||
  has_many :emojis, serializer: REST::CustomEmojiSerializer
 | 
			
		||||
 | 
			
		||||
  has_one :quote, key: :quote, serializer: REST::QuoteSerializer
 | 
			
		||||
  has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
 | 
			
		||||
  has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user