153 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class REST::StatusSerializer < ActiveModel::Serializer
 | |
|   attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
 | |
|              :sensitive, :spoiler_text, :visibility, :language,
 | |
|              :uri, :url, :replies_count, :reblogs_count,
 | |
|              :favourites_count
 | |
| 
 | |
|   attribute :favourited, if: :current_user?
 | |
|   attribute :reblogged, if: :current_user?
 | |
|   attribute :muted, if: :current_user?
 | |
|   attribute :pinned, if: :pinnable?
 | |
| 
 | |
|   attribute :content, unless: :source_requested?
 | |
|   attribute :text, if: :source_requested?
 | |
| 
 | |
|   belongs_to :reblog, serializer: REST::StatusSerializer
 | |
|   belongs_to :application, if: :show_application?
 | |
|   belongs_to :account, serializer: REST::AccountSerializer
 | |
| 
 | |
|   has_many :media_attachments, serializer: REST::MediaAttachmentSerializer
 | |
|   has_many :ordered_mentions, key: :mentions
 | |
|   has_many :tags
 | |
|   has_many :emojis, serializer: REST::CustomEmojiSerializer
 | |
| 
 | |
|   has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
 | |
|   has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
 | |
| 
 | |
|   def id
 | |
|     object.id.to_s
 | |
|   end
 | |
| 
 | |
|   def in_reply_to_id
 | |
|     object.in_reply_to_id&.to_s
 | |
|   end
 | |
| 
 | |
|   def in_reply_to_account_id
 | |
|     object.in_reply_to_account_id&.to_s
 | |
|   end
 | |
| 
 | |
|   def current_user?
 | |
|     !current_user.nil?
 | |
|   end
 | |
| 
 | |
|   def show_application?
 | |
|     object.account.user_shows_application? || (current_user? && current_user.account_id == object.account_id)
 | |
|   end
 | |
| 
 | |
|   def visibility
 | |
|     # This visibility is masked behind "private"
 | |
|     # to avoid API changes because there are no
 | |
|     # UX differences
 | |
|     if object.limited_visibility?
 | |
|       'private'
 | |
|     else
 | |
|       object.visibility
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def uri
 | |
|     ActivityPub::TagManager.instance.uri_for(object)
 | |
|   end
 | |
| 
 | |
|   def content
 | |
|     Formatter.instance.format(object)
 | |
|   end
 | |
| 
 | |
|   def url
 | |
|     ActivityPub::TagManager.instance.url_for(object)
 | |
|   end
 | |
| 
 | |
|   def favourited
 | |
|     if instance_options && instance_options[:relationships]
 | |
|       instance_options[:relationships].favourites_map[object.id] || false
 | |
|     else
 | |
|       current_user.account.favourited?(object)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def reblogged
 | |
|     if instance_options && instance_options[:relationships]
 | |
|       instance_options[:relationships].reblogs_map[object.id] || false
 | |
|     else
 | |
|       current_user.account.reblogged?(object)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def muted
 | |
|     if instance_options && instance_options[:relationships]
 | |
|       instance_options[:relationships].mutes_map[object.conversation_id] || false
 | |
|     else
 | |
|       current_user.account.muting_conversation?(object.conversation)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def pinned
 | |
|     if instance_options && instance_options[:relationships]
 | |
|       instance_options[:relationships].pins_map[object.id] || false
 | |
|     else
 | |
|       current_user.account.pinned?(object)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def pinnable?
 | |
|     current_user? &&
 | |
|       current_user.account_id == object.account_id &&
 | |
|       !object.reblog? &&
 | |
|       %w(public unlisted).include?(object.visibility)
 | |
|   end
 | |
| 
 | |
|   def source_requested?
 | |
|     instance_options[:source_requested]
 | |
|   end
 | |
| 
 | |
|   def ordered_mentions
 | |
|     object.active_mentions.to_a.sort_by(&:id)
 | |
|   end
 | |
| 
 | |
|   class ApplicationSerializer < ActiveModel::Serializer
 | |
|     attributes :name, :website
 | |
|   end
 | |
| 
 | |
|   class MentionSerializer < ActiveModel::Serializer
 | |
|     attributes :id, :username, :url, :acct
 | |
| 
 | |
|     def id
 | |
|       object.account_id.to_s
 | |
|     end
 | |
| 
 | |
|     def username
 | |
|       object.account_username
 | |
|     end
 | |
| 
 | |
|     def url
 | |
|       ActivityPub::TagManager.instance.url_for(object.account)
 | |
|     end
 | |
| 
 | |
|     def acct
 | |
|       object.account_acct
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   class TagSerializer < ActiveModel::Serializer
 | |
|     include RoutingHelper
 | |
| 
 | |
|     attributes :name, :url
 | |
| 
 | |
|     def url
 | |
|       tag_url(object)
 | |
|     end
 | |
|   end
 | |
| end
 |