ddd30f331c
* Add silent column to mentions * Save silent mentions in ActivityPub Create handler and optimize it Move networking calls out of the database transaction * Add "limited" visibility level masked as "private" in the API Unlike DMs, limited statuses are pushed into home feeds. The access control rules between direct and limited statuses is almost the same, except for counter and conversation logic * Ensure silent column is non-null, add spec * Ensure filters don't check silent mentions for blocks/mutes As those are "this person is also allowed to see" rather than "this person is involved", therefore does not warrant filtering * Clean up code * Use Status#active_mentions to limit returned mentions * Fix code style issues * Use Status#active_mentions in Notification And remove stream_entry eager-loading from Notification
167 lines
3.2 KiB
Ruby
167 lines
3.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ActivityPub::NoteSerializer < ActiveModel::Serializer
|
|
attributes :id, :type, :summary,
|
|
:in_reply_to, :published, :url,
|
|
:attributed_to, :to, :cc, :sensitive,
|
|
:atom_uri, :in_reply_to_atom_uri,
|
|
:conversation
|
|
|
|
attribute :content
|
|
attribute :content_map, if: :language?
|
|
|
|
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 content_map
|
|
{ object.language => Formatter.instance.format(object) }
|
|
end
|
|
|
|
def language?
|
|
object.language.present?
|
|
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.active_mentions.to_a.sort_by(&:id) + object.tags + object.emojis
|
|
end
|
|
|
|
def atom_uri
|
|
return unless object.local?
|
|
|
|
OStatus::TagManager.instance.uri_for(object)
|
|
end
|
|
|
|
def in_reply_to_atom_uri
|
|
return unless object.reply? && !object.thread.nil?
|
|
|
|
OStatus::TagManager.instance.uri_for(object.thread)
|
|
end
|
|
|
|
def conversation
|
|
return if object.conversation.nil?
|
|
|
|
if object.conversation.uri?
|
|
object.conversation.uri
|
|
else
|
|
OStatus::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, :name
|
|
attribute :focal_point, if: :focal_point?
|
|
|
|
def type
|
|
'Document'
|
|
end
|
|
|
|
def name
|
|
object.description
|
|
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
|
|
|
|
def focal_point?
|
|
object.file.meta.is_a?(Hash) && object.file.meta['focus'].is_a?(Hash)
|
|
end
|
|
|
|
def focal_point
|
|
[object.file.meta['focus']['x'], object.file.meta['focus']['y']]
|
|
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
|
|
|
|
class CustomEmojiSerializer < ActivityPub::EmojiSerializer
|
|
end
|
|
end
|