1
0
mirror of https://github.com/mastodon/mastodon synced 2024-11-25 15:46:24 +09:00
mastodon/app/serializers/activitypub/note_serializer.rb
Eugen Rochko ddd30f331c
Improve support for aspects/circles (#8950)
* 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
2018-10-17 17:13:04 +02:00

168 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