*Note: OStatus URIs are invalid for ActivityPub. But we have them for as long as we want to keep old OStatus-sourced content and as long as we remain OStatus-compatible.* - In Announce handling, if object URI is not a URL, fallback to object URL - Do not use specialized ThreadResolveWorker, rely on generalized handling - When serializing notes, if parent's URI is not a URL, use parent's URL
		
			
				
	
	
		
			123 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class ActivityPub::NoteSerializer < ActiveModel::Serializer
 | |
|   attributes :id, :type, :summary, :content,
 | |
|              :in_reply_to, :published, :url,
 | |
|              :attributed_to, :to, :cc, :sensitive
 | |
| 
 | |
|   has_many :media_attachments, key: :attachment
 | |
|   has_many :virtual_tags, key: :tag
 | |
| 
 | |
|   attribute :atom_uri, key: '_:atomUri', if: :local?
 | |
| 
 | |
|   def id
 | |
|     ActivityPub::TagManager.instance.uri_for(object)
 | |
|   end
 | |
| 
 | |
|   def type
 | |
|     'Note'
 | |
|   end
 | |
| 
 | |
|   def summary
 | |
|     object.spoiler_text.presence
 | |
|   end
 | |
| 
 | |
|   def content
 | |
|     Formatter.instance.format(object)
 | |
|   end
 | |
| 
 | |
|   def in_reply_to
 | |
|     return unless object.reply?
 | |
| 
 | |
|     if object.thread.uri.nil? || object.thread.uri.start_with?('http')
 | |
|       ActivityPub::TagManager.instance.uri_for(object.thread)
 | |
|     else
 | |
|       object.thread.url
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def published
 | |
|     object.created_at.iso8601
 | |
|   end
 | |
| 
 | |
|   def url
 | |
|     ActivityPub::TagManager.instance.url_for(object)
 | |
|   end
 | |
| 
 | |
|   def attributed_to
 | |
|     ActivityPub::TagManager.instance.uri_for(object.account)
 | |
|   end
 | |
| 
 | |
|   def to
 | |
|     ActivityPub::TagManager.instance.to(object)
 | |
|   end
 | |
| 
 | |
|   def cc
 | |
|     ActivityPub::TagManager.instance.cc(object)
 | |
|   end
 | |
| 
 | |
|   def virtual_tags
 | |
|     object.mentions + object.tags
 | |
|   end
 | |
| 
 | |
|   def atom_uri
 | |
|     ::TagManager.instance.uri_for(object)
 | |
|   end
 | |
| 
 | |
|   def local?
 | |
|     object.account.local?
 | |
|   end
 | |
| 
 | |
|   class MediaAttachmentSerializer < ActiveModel::Serializer
 | |
|     include RoutingHelper
 | |
| 
 | |
|     attributes :type, :media_type, :url
 | |
| 
 | |
|     def type
 | |
|       'Document'
 | |
|     end
 | |
| 
 | |
|     def media_type
 | |
|       object.file_content_type
 | |
|     end
 | |
| 
 | |
|     def url
 | |
|       object.local? ? full_asset_url(object.file.url(:original, false)) : object.remote_url
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   class MentionSerializer < ActiveModel::Serializer
 | |
|     attributes :type, :href, :name
 | |
| 
 | |
|     def type
 | |
|       'Mention'
 | |
|     end
 | |
| 
 | |
|     def href
 | |
|       ActivityPub::TagManager.instance.uri_for(object.account)
 | |
|     end
 | |
| 
 | |
|     def name
 | |
|       "@#{object.account.acct}"
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   class TagSerializer < ActiveModel::Serializer
 | |
|     include RoutingHelper
 | |
| 
 | |
|     attributes :type, :href, :name
 | |
| 
 | |
|     def type
 | |
|       'Hashtag'
 | |
|     end
 | |
| 
 | |
|     def href
 | |
|       tag_url(object)
 | |
|     end
 | |
| 
 | |
|     def name
 | |
|       "##{object.name}"
 | |
|     end
 | |
|   end
 | |
| end
 |