c30e6433de
`Status#reply?` may returns true even if the thread is missing. e.g. the replied status was deleted or couldn't be fetched. Then it raises NoMethodError on various AP json serialization. This issue won't happen on Atom serialization because it checks thread existence using `StreamEntry#threaded?` instead.
141 lines
2.6 KiB
Ruby
141 lines
2.6 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,
|
|
:atom_uri, :in_reply_to_atom_uri,
|
|
:conversation
|
|
|
|
has_many :media_attachments, key: :attachment
|
|
has_many :virtual_tags, key: :tag
|
|
|
|
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? && !object.thread.nil?
|
|
|
|
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
|
|
return unless object.local?
|
|
|
|
::TagManager.instance.uri_for(object)
|
|
end
|
|
|
|
def in_reply_to_atom_uri
|
|
return unless object.reply? && !object.thread.nil?
|
|
|
|
::TagManager.instance.uri_for(object.thread)
|
|
end
|
|
|
|
def conversation
|
|
return if object.conversation.nil?
|
|
|
|
if object.conversation.uri?
|
|
object.conversation.uri
|
|
else
|
|
TagManager.instance.unique_tag(object.conversation.created_at, object.conversation.id, 'Conversation')
|
|
end
|
|
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
|