Gab Social. All are welcome.
This commit is contained in:
19
app/serializers/activitypub/accept_follow_serializer.rb
Normal file
19
app/serializers/activitypub/accept_follow_serializer.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::AcceptFollowSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
|
||||
has_one :object, serializer: ActivityPub::FollowSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.target_account), '#accepts/follows/', object.id].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Accept'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.target_account)
|
||||
end
|
||||
end
|
||||
51
app/serializers/activitypub/activity_serializer.rb
Normal file
51
app/serializers/activitypub/activity_serializer.rb
Normal file
@@ -0,0 +1,51 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::ActivitySerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor, :published, :to, :cc
|
||||
|
||||
has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, if: :serialize_object?
|
||||
attribute :proper_uri, key: :object, unless: :serialize_object?
|
||||
attribute :atom_uri, if: :announce?
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.activity_uri_for(object)
|
||||
end
|
||||
|
||||
def type
|
||||
announce? ? 'Announce' : 'Create'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def published
|
||||
object.created_at.iso8601
|
||||
end
|
||||
|
||||
def to
|
||||
ActivityPub::TagManager.instance.to(object)
|
||||
end
|
||||
|
||||
def cc
|
||||
ActivityPub::TagManager.instance.cc(object)
|
||||
end
|
||||
|
||||
def proper_uri
|
||||
ActivityPub::TagManager.instance.uri_for(object.proper)
|
||||
end
|
||||
|
||||
def atom_uri
|
||||
OStatus::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def announce?
|
||||
object.reblog?
|
||||
end
|
||||
|
||||
def serialize_object?
|
||||
return true unless announce?
|
||||
# Serialize private self-reposts of local gabs
|
||||
object.account == object.proper.account && object.proper.private_visibility? && object.local?
|
||||
end
|
||||
end
|
||||
181
app/serializers/activitypub/actor_serializer.rb
Normal file
181
app/serializers/activitypub/actor_serializer.rb
Normal file
@@ -0,0 +1,181 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::ActorSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
context :security
|
||||
|
||||
context_extensions :manually_approves_followers, :featured, :also_known_as,
|
||||
:moved_to, :property_value, :hashtag, :emoji, :identity_proof
|
||||
|
||||
attributes :id, :type, :following, :followers,
|
||||
:inbox, :outbox, :featured,
|
||||
:preferred_username, :name, :summary,
|
||||
:url, :manually_approves_followers
|
||||
|
||||
has_one :public_key, serializer: ActivityPub::PublicKeySerializer
|
||||
|
||||
has_many :virtual_tags, key: :tag
|
||||
has_many :virtual_attachments, key: :attachment
|
||||
|
||||
attribute :moved_to, if: :moved?
|
||||
attribute :also_known_as, if: :also_known_as?
|
||||
|
||||
class EndpointsSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :shared_inbox
|
||||
|
||||
def shared_inbox
|
||||
inbox_url
|
||||
end
|
||||
end
|
||||
|
||||
has_one :endpoints, serializer: EndpointsSerializer
|
||||
|
||||
has_one :icon, serializer: ActivityPub::ImageSerializer, if: :avatar_exists?
|
||||
has_one :image, serializer: ActivityPub::ImageSerializer, if: :header_exists?
|
||||
|
||||
delegate :moved?, to: :object
|
||||
|
||||
def id
|
||||
account_url(object)
|
||||
end
|
||||
|
||||
def type
|
||||
object.bot? ? 'Service' : 'Person'
|
||||
end
|
||||
|
||||
def following
|
||||
account_following_index_url(object)
|
||||
end
|
||||
|
||||
def followers
|
||||
account_followers_url(object)
|
||||
end
|
||||
|
||||
def inbox
|
||||
account_inbox_url(object)
|
||||
end
|
||||
|
||||
def outbox
|
||||
account_outbox_url(object)
|
||||
end
|
||||
|
||||
def featured
|
||||
account_collection_url(object, :featured)
|
||||
end
|
||||
|
||||
def endpoints
|
||||
object
|
||||
end
|
||||
|
||||
def preferred_username
|
||||
object.username
|
||||
end
|
||||
|
||||
def name
|
||||
object.display_name
|
||||
end
|
||||
|
||||
def summary
|
||||
Formatter.instance.simplified_format(object)
|
||||
end
|
||||
|
||||
def icon
|
||||
object.avatar
|
||||
end
|
||||
|
||||
def image
|
||||
object.header
|
||||
end
|
||||
|
||||
def public_key
|
||||
object
|
||||
end
|
||||
|
||||
def url
|
||||
short_account_url(object)
|
||||
end
|
||||
|
||||
def avatar_exists?
|
||||
object.avatar?
|
||||
end
|
||||
|
||||
def header_exists?
|
||||
object.header?
|
||||
end
|
||||
|
||||
def manually_approves_followers
|
||||
object.locked
|
||||
end
|
||||
|
||||
def virtual_tags
|
||||
object.emojis + object.tags
|
||||
end
|
||||
|
||||
def virtual_attachments
|
||||
object.fields + object.identity_proofs.active
|
||||
end
|
||||
|
||||
def moved_to
|
||||
ActivityPub::TagManager.instance.uri_for(object.moved_to_account)
|
||||
end
|
||||
|
||||
def also_known_as?
|
||||
!object.also_known_as.empty?
|
||||
end
|
||||
|
||||
class CustomEmojiSerializer < ActivityPub::EmojiSerializer
|
||||
end
|
||||
|
||||
class TagSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :type, :href, :name
|
||||
|
||||
def type
|
||||
'Hashtag'
|
||||
end
|
||||
|
||||
def href
|
||||
explore_hashtag_url(object)
|
||||
end
|
||||
|
||||
def name
|
||||
"##{object.name}"
|
||||
end
|
||||
end
|
||||
|
||||
class Account::FieldSerializer < ActivityPub::Serializer
|
||||
attributes :type, :name, :value
|
||||
|
||||
def type
|
||||
'PropertyValue'
|
||||
end
|
||||
|
||||
def value
|
||||
Formatter.instance.format_field(object.account, object.value)
|
||||
end
|
||||
end
|
||||
|
||||
class AccountIdentityProofSerializer < ActivityPub::Serializer
|
||||
attributes :type, :name, :signature_algorithm, :signature_value
|
||||
|
||||
def type
|
||||
'IdentityProof'
|
||||
end
|
||||
|
||||
def name
|
||||
object.provider_username
|
||||
end
|
||||
|
||||
def signature_algorithm
|
||||
object.provider
|
||||
end
|
||||
|
||||
def signature_value
|
||||
object.token
|
||||
end
|
||||
end
|
||||
end
|
||||
24
app/serializers/activitypub/add_serializer.rb
Normal file
24
app/serializers/activitypub/add_serializer.rb
Normal file
@@ -0,0 +1,24 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::AddSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :type, :actor, :target
|
||||
attribute :proper_object, key: :object
|
||||
|
||||
def type
|
||||
'Add'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def proper_object
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def target
|
||||
account_collection_url(object.account, :featured)
|
||||
end
|
||||
end
|
||||
22
app/serializers/activitypub/block_serializer.rb
Normal file
22
app/serializers/activitypub/block_serializer.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::BlockSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
attribute :virtual_object, key: :object
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object) || [ActivityPub::TagManager.instance.uri_for(object.account), '#blocks/', object.id].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Block'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def virtual_object
|
||||
ActivityPub::TagManager.instance.uri_for(object.target_account)
|
||||
end
|
||||
end
|
||||
43
app/serializers/activitypub/collection_serializer.rb
Normal file
43
app/serializers/activitypub/collection_serializer.rb
Normal file
@@ -0,0 +1,43 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::CollectionSerializer < ActivityPub::Serializer
|
||||
def self.serializer_for(model, options)
|
||||
return ActivityPub::NoteSerializer if model.class.name == 'Status'
|
||||
return ActivityPub::CollectionSerializer if model.class.name == 'ActivityPub::CollectionPresenter'
|
||||
super
|
||||
end
|
||||
|
||||
attribute :id, if: -> { object.id.present? }
|
||||
attribute :type
|
||||
attribute :total_items, if: -> { object.size.present? }
|
||||
attribute :next, if: -> { object.next.present? }
|
||||
attribute :prev, if: -> { object.prev.present? }
|
||||
attribute :part_of, if: -> { object.part_of.present? }
|
||||
|
||||
has_one :first, if: -> { object.first.present? }
|
||||
has_one :last, if: -> { object.last.present? }
|
||||
has_many :items, key: :items, if: -> { (!object.items.nil? || page?) && !ordered? }
|
||||
has_many :items, key: :ordered_items, if: -> { (!object.items.nil? || page?) && ordered? }
|
||||
|
||||
def type
|
||||
if page?
|
||||
ordered? ? 'OrderedCollectionPage' : 'CollectionPage'
|
||||
else
|
||||
ordered? ? 'OrderedCollection' : 'Collection'
|
||||
end
|
||||
end
|
||||
|
||||
def total_items
|
||||
object.size
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def ordered?
|
||||
object.type == :ordered
|
||||
end
|
||||
|
||||
def page?
|
||||
object.part_of.present? || object.page.present?
|
||||
end
|
||||
end
|
||||
26
app/serializers/activitypub/delete_actor_serializer.rb
Normal file
26
app/serializers/activitypub/delete_actor_serializer.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::DeleteActorSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor, :to
|
||||
attribute :virtual_object, key: :object
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object), '#delete'].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Delete'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def virtual_object
|
||||
actor
|
||||
end
|
||||
|
||||
def to
|
||||
[ActivityPub::TagManager::COLLECTIONS[:public]]
|
||||
end
|
||||
end
|
||||
41
app/serializers/activitypub/delete_serializer.rb
Normal file
41
app/serializers/activitypub/delete_serializer.rb
Normal file
@@ -0,0 +1,41 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::DeleteSerializer < ActivityPub::Serializer
|
||||
class TombstoneSerializer < ActivityPub::Serializer
|
||||
context_extensions :atom_uri
|
||||
|
||||
attributes :id, :type, :atom_uri
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def type
|
||||
'Tombstone'
|
||||
end
|
||||
|
||||
def atom_uri
|
||||
OStatus::TagManager.instance.uri_for(object)
|
||||
end
|
||||
end
|
||||
|
||||
attributes :id, :type, :actor, :to
|
||||
|
||||
has_one :object, serializer: TombstoneSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object), '#delete'].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Delete'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def to
|
||||
[ActivityPub::TagManager::COLLECTIONS[:public]]
|
||||
end
|
||||
end
|
||||
31
app/serializers/activitypub/emoji_serializer.rb
Normal file
31
app/serializers/activitypub/emoji_serializer.rb
Normal file
@@ -0,0 +1,31 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::EmojiSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
context_extensions :emoji
|
||||
|
||||
attributes :id, :type, :name, :updated
|
||||
|
||||
has_one :icon, serializer: ActivityPub::ImageSerializer
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def type
|
||||
'Emoji'
|
||||
end
|
||||
|
||||
def icon
|
||||
object.image
|
||||
end
|
||||
|
||||
def updated
|
||||
object.updated_at.iso8601
|
||||
end
|
||||
|
||||
def name
|
||||
":#{object.shortcode}:"
|
||||
end
|
||||
end
|
||||
26
app/serializers/activitypub/flag_serializer.rb
Normal file
26
app/serializers/activitypub/flag_serializer.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::FlagSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor, :content
|
||||
attribute :virtual_object, key: :object
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def type
|
||||
'Flag'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(instance_options[:account] || object.account)
|
||||
end
|
||||
|
||||
def virtual_object
|
||||
[ActivityPub::TagManager.instance.uri_for(object.target_account)] + object.statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) }
|
||||
end
|
||||
|
||||
def content
|
||||
object.comment
|
||||
end
|
||||
end
|
||||
22
app/serializers/activitypub/follow_serializer.rb
Normal file
22
app/serializers/activitypub/follow_serializer.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::FollowSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
attribute :virtual_object, key: :object
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object) || [ActivityPub::TagManager.instance.uri_for(object.account), '#follows/', object.id].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Follow'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def virtual_object
|
||||
ActivityPub::TagManager.instance.uri_for(object.target_account)
|
||||
end
|
||||
end
|
||||
30
app/serializers/activitypub/image_serializer.rb
Normal file
30
app/serializers/activitypub/image_serializer.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::ImageSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
context_extensions :focal_point
|
||||
|
||||
attributes :type, :media_type, :url
|
||||
attribute :focal_point, if: :focal_point?
|
||||
|
||||
def type
|
||||
'Image'
|
||||
end
|
||||
|
||||
def url
|
||||
full_asset_url(object.url(:original))
|
||||
end
|
||||
|
||||
def media_type
|
||||
object.content_type
|
||||
end
|
||||
|
||||
def focal_point?
|
||||
object.respond_to?(:meta) && object.meta.is_a?(Hash) && object.meta['focus'].is_a?(Hash)
|
||||
end
|
||||
|
||||
def focal_point
|
||||
[object.meta['focus']['x'], object.meta['focus']['y']]
|
||||
end
|
||||
end
|
||||
22
app/serializers/activitypub/like_serializer.rb
Normal file
22
app/serializers/activitypub/like_serializer.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::LikeSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
attribute :virtual_object, key: :object
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.account), '#likes/', object.id].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Like'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def virtual_object
|
||||
ActivityPub::TagManager.instance.uri_for(object.status)
|
||||
end
|
||||
end
|
||||
250
app/serializers/activitypub/note_serializer.rb
Normal file
250
app/serializers/activitypub/note_serializer.rb
Normal file
@@ -0,0 +1,250 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::NoteSerializer < ActivityPub::Serializer
|
||||
context_extensions :atom_uri, :conversation, :sensitive,
|
||||
:hashtag, :emoji, :focal_point, :blurhash
|
||||
|
||||
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
|
||||
|
||||
has_one :replies, serializer: ActivityPub::CollectionSerializer, if: :local?
|
||||
|
||||
has_many :poll_options, key: :one_of, if: :poll_and_not_multiple?
|
||||
has_many :poll_options, key: :any_of, if: :poll_and_multiple?
|
||||
|
||||
attribute :end_time, if: :poll_and_expires?
|
||||
attribute :closed, if: :poll_and_expired?
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def type
|
||||
object.preloadable_poll ? 'Question' : '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 replies
|
||||
replies = object.self_replies(5).pluck(:id, :uri)
|
||||
last_id = replies.last&.first
|
||||
|
||||
ActivityPub::CollectionPresenter.new(
|
||||
type: :unordered,
|
||||
id: ActivityPub::TagManager.instance.replies_uri_for(object),
|
||||
first: ActivityPub::CollectionPresenter.new(
|
||||
type: :unordered,
|
||||
part_of: ActivityPub::TagManager.instance.replies_uri_for(object),
|
||||
items: replies.map(&:second),
|
||||
next: last_id ? ActivityPub::TagManager.instance.replies_uri_for(object, page: true, min_id: last_id) : nil
|
||||
)
|
||||
)
|
||||
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
|
||||
|
||||
def poll_options
|
||||
object.preloadable_poll.loaded_options
|
||||
end
|
||||
|
||||
def poll_and_multiple?
|
||||
object.preloadable_poll&.multiple?
|
||||
end
|
||||
|
||||
def poll_and_not_multiple?
|
||||
object.preloadable_poll && !object.preloadable_poll.multiple?
|
||||
end
|
||||
|
||||
def closed
|
||||
object.preloadable_poll.expires_at.iso8601
|
||||
end
|
||||
|
||||
alias end_time closed
|
||||
|
||||
def poll_and_expires?
|
||||
object.preloadable_poll&.expires_at&.present?
|
||||
end
|
||||
|
||||
def poll_and_expired?
|
||||
object.preloadable_poll&.expired?
|
||||
end
|
||||
|
||||
class MediaAttachmentSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :type, :media_type, :url, :name, :blurhash
|
||||
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 < ActivityPub::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 < ActivityPub::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
|
||||
|
||||
class OptionSerializer < ActivityPub::Serializer
|
||||
class RepliesSerializer < ActivityPub::Serializer
|
||||
attributes :type, :total_items
|
||||
|
||||
def type
|
||||
'Collection'
|
||||
end
|
||||
|
||||
def total_items
|
||||
object.votes_count
|
||||
end
|
||||
end
|
||||
|
||||
attributes :type, :name
|
||||
|
||||
has_one :replies, serializer: ActivityPub::NoteSerializer::OptionSerializer::RepliesSerializer
|
||||
|
||||
def type
|
||||
'Note'
|
||||
end
|
||||
|
||||
def name
|
||||
object.title
|
||||
end
|
||||
|
||||
def replies
|
||||
object
|
||||
end
|
||||
end
|
||||
end
|
||||
8
app/serializers/activitypub/outbox_serializer.rb
Normal file
8
app/serializers/activitypub/outbox_serializer.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::OutboxSerializer < ActivityPub::CollectionSerializer
|
||||
def self.serializer_for(model, options)
|
||||
return ActivityPub::ActivitySerializer if model.is_a?(Status)
|
||||
super
|
||||
end
|
||||
end
|
||||
19
app/serializers/activitypub/public_key_serializer.rb
Normal file
19
app/serializers/activitypub/public_key_serializer.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::PublicKeySerializer < ActivityPub::Serializer
|
||||
context :security
|
||||
|
||||
attributes :id, :owner, :public_key_pem
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object), '#main-key'].join
|
||||
end
|
||||
|
||||
def owner
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def public_key_pem
|
||||
object.public_key
|
||||
end
|
||||
end
|
||||
19
app/serializers/activitypub/reject_follow_serializer.rb
Normal file
19
app/serializers/activitypub/reject_follow_serializer.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::RejectFollowSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
|
||||
has_one :object, serializer: ActivityPub::FollowSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.target_account), '#rejects/follows/', object.id].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Reject'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.target_account)
|
||||
end
|
||||
end
|
||||
24
app/serializers/activitypub/remove_serializer.rb
Normal file
24
app/serializers/activitypub/remove_serializer.rb
Normal file
@@ -0,0 +1,24 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::RemoveSerializer < ActivityPub::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :type, :actor, :target
|
||||
attribute :proper_object, key: :object
|
||||
|
||||
def type
|
||||
'Remove'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def proper_object
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def target
|
||||
account_collection_url(object.account, :featured)
|
||||
end
|
||||
end
|
||||
23
app/serializers/activitypub/undo_announce_serializer.rb
Normal file
23
app/serializers/activitypub/undo_announce_serializer.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::UndoAnnounceSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor, :to
|
||||
|
||||
has_one :object, serializer: ActivityPub::ActivitySerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.account), '#announces/', object.id, '/undo'].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Undo'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def to
|
||||
[ActivityPub::TagManager::COLLECTIONS[:public]]
|
||||
end
|
||||
end
|
||||
19
app/serializers/activitypub/undo_block_serializer.rb
Normal file
19
app/serializers/activitypub/undo_block_serializer.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::UndoBlockSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
|
||||
has_one :object, serializer: ActivityPub::BlockSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.account), '#blocks/', object.id, '/undo'].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Undo'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
end
|
||||
19
app/serializers/activitypub/undo_follow_serializer.rb
Normal file
19
app/serializers/activitypub/undo_follow_serializer.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::UndoFollowSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
|
||||
has_one :object, serializer: ActivityPub::FollowSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.account), '#follows/', object.id, '/undo'].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Undo'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
end
|
||||
19
app/serializers/activitypub/undo_like_serializer.rb
Normal file
19
app/serializers/activitypub/undo_like_serializer.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::UndoLikeSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor
|
||||
|
||||
has_one :object, serializer: ActivityPub::LikeSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.account), '#likes/', object.id, '/undo'].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Undo'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
end
|
||||
27
app/serializers/activitypub/update_poll_serializer.rb
Normal file
27
app/serializers/activitypub/update_poll_serializer.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::UpdatePollSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor, :to
|
||||
|
||||
has_one :object, serializer: ActivityPub::NoteSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object), '#updates/', object.preloadable_poll.updated_at.to_i].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Update'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def to
|
||||
ActivityPub::TagManager.instance.to(object)
|
||||
end
|
||||
|
||||
def cc
|
||||
ActivityPub::TagManager.instance.cc(object)
|
||||
end
|
||||
end
|
||||
23
app/serializers/activitypub/update_serializer.rb
Normal file
23
app/serializers/activitypub/update_serializer.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::UpdateSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :actor, :to
|
||||
|
||||
has_one :object, serializer: ActivityPub::ActorSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object), '#updates/', object.updated_at.to_i].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Update'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def to
|
||||
[ActivityPub::TagManager::COLLECTIONS[:public]]
|
||||
end
|
||||
end
|
||||
52
app/serializers/activitypub/vote_serializer.rb
Normal file
52
app/serializers/activitypub/vote_serializer.rb
Normal file
@@ -0,0 +1,52 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::VoteSerializer < ActivityPub::Serializer
|
||||
class NoteSerializer < ActivityPub::Serializer
|
||||
attributes :id, :type, :name, :attributed_to,
|
||||
:in_reply_to, :to
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object) || [ActivityPub::TagManager.instance.uri_for(object.account), '#votes/', object.id].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Note'
|
||||
end
|
||||
|
||||
def name
|
||||
object.poll.options[object.choice.to_i]
|
||||
end
|
||||
|
||||
def attributed_to
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def in_reply_to
|
||||
ActivityPub::TagManager.instance.uri_for(object.poll.status)
|
||||
end
|
||||
|
||||
def to
|
||||
ActivityPub::TagManager.instance.uri_for(object.poll.account)
|
||||
end
|
||||
end
|
||||
|
||||
attributes :id, :type, :actor, :to
|
||||
|
||||
has_one :object, serializer: ActivityPub::VoteSerializer::NoteSerializer
|
||||
|
||||
def id
|
||||
[ActivityPub::TagManager.instance.uri_for(object.account), '#votes/', object.id, '/activity'].join
|
||||
end
|
||||
|
||||
def type
|
||||
'Create'
|
||||
end
|
||||
|
||||
def actor
|
||||
ActivityPub::TagManager.instance.uri_for(object.account)
|
||||
end
|
||||
|
||||
def to
|
||||
ActivityPub::TagManager.instance.uri_for(object.poll.account)
|
||||
end
|
||||
end
|
||||
72
app/serializers/initial_state_serializer.rb
Normal file
72
app/serializers/initial_state_serializer.rb
Normal file
@@ -0,0 +1,72 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class InitialStateSerializer < ActiveModel::Serializer
|
||||
attributes :meta, :compose, :accounts,
|
||||
:media_attachments, :settings
|
||||
|
||||
has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer
|
||||
|
||||
def meta
|
||||
store = {
|
||||
streaming_api_base_url: Rails.configuration.x.streaming_api_base_url,
|
||||
access_token: object.token,
|
||||
locale: I18n.locale,
|
||||
domain: Rails.configuration.x.local_domain,
|
||||
admin: object.admin&.id&.to_s,
|
||||
search_enabled: Chewy.enabled?,
|
||||
repository: GabSocial::Version.repository,
|
||||
source_url: GabSocial::Version.source_url,
|
||||
version: GabSocial::Version.to_s,
|
||||
invites_enabled: Setting.min_invite_role == 'user',
|
||||
mascot: instance_presenter.mascot&.file&.url,
|
||||
profile_directory: Setting.profile_directory,
|
||||
}
|
||||
|
||||
if object.current_account
|
||||
store[:username] = object.current_account.username
|
||||
store[:me] = object.current_account.id.to_s
|
||||
store[:unfollow_modal] = object.current_account.user.setting_unfollow_modal
|
||||
store[:boost_modal] = object.current_account.user.setting_boost_modal
|
||||
store[:delete_modal] = object.current_account.user.setting_delete_modal
|
||||
store[:auto_play_gif] = object.current_account.user.setting_auto_play_gif
|
||||
store[:display_media] = object.current_account.user.setting_display_media
|
||||
store[:expand_spoilers] = object.current_account.user.setting_expand_spoilers
|
||||
store[:reduce_motion] = object.current_account.user.setting_reduce_motion
|
||||
store[:advanced_layout] = object.current_account.user.setting_advanced_layout
|
||||
store[:is_staff] = object.current_account.user.staff?
|
||||
end
|
||||
|
||||
store
|
||||
end
|
||||
|
||||
def compose
|
||||
store = {}
|
||||
|
||||
if object.current_account
|
||||
store[:me] = object.current_account.id.to_s
|
||||
store[:default_privacy] = object.current_account.user.setting_default_privacy
|
||||
store[:default_sensitive] = object.current_account.user.setting_default_sensitive
|
||||
end
|
||||
|
||||
store[:text] = object.text if object.text
|
||||
|
||||
store
|
||||
end
|
||||
|
||||
def accounts
|
||||
store = {}
|
||||
store[object.current_account.id.to_s] = ActiveModelSerializers::SerializableResource.new(object.current_account, serializer: REST::AccountSerializer) if object.current_account
|
||||
store[object.admin.id.to_s] = ActiveModelSerializers::SerializableResource.new(object.admin, serializer: REST::AccountSerializer) if object.admin
|
||||
store
|
||||
end
|
||||
|
||||
def media_attachments
|
||||
{ accept_content_types: MediaAttachment::IMAGE_FILE_EXTENSIONS + MediaAttachment::VIDEO_FILE_EXTENSIONS + MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def instance_presenter
|
||||
@instance_presenter ||= InstancePresenter.new
|
||||
end
|
||||
end
|
||||
65
app/serializers/manifest_serializer.rb
Normal file
65
app/serializers/manifest_serializer.rb
Normal file
@@ -0,0 +1,65 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ManifestSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
include ActionView::Helpers::TextHelper
|
||||
|
||||
attributes :name, :short_name, :description,
|
||||
:icons, :theme_color, :background_color,
|
||||
:display, :start_url, :scope,
|
||||
:share_target
|
||||
|
||||
def name
|
||||
object.site_title
|
||||
end
|
||||
|
||||
def short_name
|
||||
object.site_title
|
||||
end
|
||||
|
||||
def description
|
||||
strip_tags(object.site_short_description.presence || I18n.t('about.about_gabsocial_html'))
|
||||
end
|
||||
|
||||
def icons
|
||||
[
|
||||
{
|
||||
src: '/android-chrome-192x192.png',
|
||||
sizes: '192x192',
|
||||
type: 'image/png',
|
||||
},
|
||||
]
|
||||
end
|
||||
|
||||
def theme_color
|
||||
'#282c37'
|
||||
end
|
||||
|
||||
def background_color
|
||||
'#191b22'
|
||||
end
|
||||
|
||||
def display
|
||||
'standalone'
|
||||
end
|
||||
|
||||
def start_url
|
||||
'/home'
|
||||
end
|
||||
|
||||
def scope
|
||||
root_url
|
||||
end
|
||||
|
||||
def share_target
|
||||
{
|
||||
url_template: 'share?title={title}&text={text}&url={url}',
|
||||
action: 'share',
|
||||
params: {
|
||||
title: 'title',
|
||||
text: 'text',
|
||||
url: 'url',
|
||||
},
|
||||
}
|
||||
end
|
||||
end
|
||||
59
app/serializers/oembed_serializer.rb
Normal file
59
app/serializers/oembed_serializer.rb
Normal file
@@ -0,0 +1,59 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class OEmbedSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
include ActionView::Helpers::TagHelper
|
||||
|
||||
attributes :type, :version, :title, :author_name,
|
||||
:author_url, :provider_name, :provider_url,
|
||||
:cache_age, :html, :width, :height
|
||||
|
||||
def type
|
||||
'rich'
|
||||
end
|
||||
|
||||
def version
|
||||
'1.0'
|
||||
end
|
||||
|
||||
def author_name
|
||||
object.account.display_name.presence || object.account.username
|
||||
end
|
||||
|
||||
def author_url
|
||||
short_account_url(object.account)
|
||||
end
|
||||
|
||||
def provider_name
|
||||
Rails.configuration.x.local_domain
|
||||
end
|
||||
|
||||
def provider_url
|
||||
root_url
|
||||
end
|
||||
|
||||
def cache_age
|
||||
86_400
|
||||
end
|
||||
|
||||
def html
|
||||
attributes = {
|
||||
src: embed_short_account_status_url(object.account, object),
|
||||
class: 'gabsocial-embed',
|
||||
style: 'max-width: 100%; border: 0',
|
||||
width: width,
|
||||
height: height,
|
||||
allowfullscreen: true,
|
||||
}
|
||||
|
||||
content_tag(:iframe, nil, attributes) + content_tag(:script, nil, src: full_asset_url('embed.js', skip_pipeline: true), async: true)
|
||||
end
|
||||
|
||||
def width
|
||||
instance_options[:width]
|
||||
end
|
||||
|
||||
def height
|
||||
instance_options[:height]
|
||||
end
|
||||
end
|
||||
54
app/serializers/rest/account_serializer.rb
Normal file
54
app/serializers/rest/account_serializer.rb
Normal file
@@ -0,0 +1,54 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::AccountSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :id, :username, :acct, :display_name, :locked, :bot, :created_at,
|
||||
:note, :url, :avatar, :avatar_static, :header, :header_static,
|
||||
:followers_count, :following_count, :statuses_count, :is_pro, :is_verified
|
||||
|
||||
has_one :moved_to_account, key: :moved, serializer: REST::AccountSerializer, if: :moved_and_not_nested?
|
||||
has_many :emojis, serializer: REST::CustomEmojiSerializer
|
||||
|
||||
class FieldSerializer < ActiveModel::Serializer
|
||||
attributes :name, :value, :verified_at
|
||||
|
||||
def value
|
||||
Formatter.instance.format_field(object.account, object.value)
|
||||
end
|
||||
end
|
||||
|
||||
has_many :fields
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def note
|
||||
Formatter.instance.simplified_format(object)
|
||||
end
|
||||
|
||||
def url
|
||||
TagManager.instance.url_for(object)
|
||||
end
|
||||
|
||||
def avatar
|
||||
full_asset_url(object.avatar_original_url)
|
||||
end
|
||||
|
||||
def avatar_static
|
||||
full_asset_url(object.avatar_static_url)
|
||||
end
|
||||
|
||||
def header
|
||||
full_asset_url(object.header_original_url)
|
||||
end
|
||||
|
||||
def header_static
|
||||
full_asset_url(object.header_static_url)
|
||||
end
|
||||
|
||||
def moved_and_not_nested?
|
||||
object.moved? && object.moved_to_account.moved_to_account_id.nil?
|
||||
end
|
||||
end
|
||||
26
app/serializers/rest/application_serializer.rb
Normal file
26
app/serializers/rest/application_serializer.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::ApplicationSerializer < ActiveModel::Serializer
|
||||
attributes :id, :name, :website, :redirect_uri,
|
||||
:client_id, :client_secret, :vapid_key
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def client_id
|
||||
object.uid
|
||||
end
|
||||
|
||||
def client_secret
|
||||
object.secret
|
||||
end
|
||||
|
||||
def website
|
||||
object.website.presence
|
||||
end
|
||||
|
||||
def vapid_key
|
||||
Rails.configuration.x.vapid_public_key
|
||||
end
|
||||
end
|
||||
6
app/serializers/rest/context_serializer.rb
Normal file
6
app/serializers/rest/context_serializer.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::ContextSerializer < ActiveModel::Serializer
|
||||
has_many :ancestors, serializer: REST::StatusSerializer
|
||||
has_many :descendants, serializer: REST::StatusSerializer
|
||||
end
|
||||
12
app/serializers/rest/conversation_serializer.rb
Normal file
12
app/serializers/rest/conversation_serializer.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::ConversationSerializer < ActiveModel::Serializer
|
||||
attributes :id, :unread
|
||||
|
||||
has_many :participant_accounts, key: :accounts, serializer: REST::AccountSerializer
|
||||
has_one :last_status, serializer: REST::StatusSerializer
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
end
|
||||
17
app/serializers/rest/credential_account_serializer.rb
Normal file
17
app/serializers/rest/credential_account_serializer.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::CredentialAccountSerializer < REST::AccountSerializer
|
||||
attributes :source
|
||||
|
||||
def source
|
||||
user = object.user
|
||||
|
||||
{
|
||||
privacy: user.setting_default_privacy,
|
||||
sensitive: user.setting_default_sensitive,
|
||||
language: user.setting_default_language,
|
||||
note: object.note,
|
||||
fields: object.fields.map(&:to_h),
|
||||
}
|
||||
end
|
||||
end
|
||||
15
app/serializers/rest/custom_emoji_serializer.rb
Normal file
15
app/serializers/rest/custom_emoji_serializer.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::CustomEmojiSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :shortcode, :url, :static_url, :visible_in_picker
|
||||
|
||||
def url
|
||||
full_asset_url(object.image.url)
|
||||
end
|
||||
|
||||
def static_url
|
||||
full_asset_url(object.image.url(:static))
|
||||
end
|
||||
end
|
||||
10
app/serializers/rest/filter_serializer.rb
Normal file
10
app/serializers/rest/filter_serializer.rb
Normal file
@@ -0,0 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::FilterSerializer < ActiveModel::Serializer
|
||||
attributes :id, :phrase, :context, :whole_word, :expires_at,
|
||||
:irreversible
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
end
|
||||
17
app/serializers/rest/group_relationship_serializer.rb
Normal file
17
app/serializers/rest/group_relationship_serializer.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::GroupRelationshipSerializer < ActiveModel::Serializer
|
||||
attributes :id, :member, :admin
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def member
|
||||
instance_options[:relationships].member[object.id] ? true : false
|
||||
end
|
||||
|
||||
def admin
|
||||
instance_options[:relationships].admin[object.id] ? true : false
|
||||
end
|
||||
end
|
||||
15
app/serializers/rest/group_serializer.rb
Normal file
15
app/serializers/rest/group_serializer.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::GroupSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :id, :title, :description, :cover_image_url, :is_archived
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def cover_image_url
|
||||
full_asset_url(object.cover_image.url)
|
||||
end
|
||||
end
|
||||
17
app/serializers/rest/identity_proof_serializer.rb
Normal file
17
app/serializers/rest/identity_proof_serializer.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::IdentityProofSerializer < ActiveModel::Serializer
|
||||
attributes :provider, :provider_username, :updated_at, :proof_url, :profile_url
|
||||
|
||||
def proof_url
|
||||
object.badge.proof_url
|
||||
end
|
||||
|
||||
def profile_url
|
||||
object.badge.profile_url
|
||||
end
|
||||
|
||||
def provider
|
||||
object.provider.capitalize
|
||||
end
|
||||
end
|
||||
63
app/serializers/rest/instance_serializer.rb
Normal file
63
app/serializers/rest/instance_serializer.rb
Normal file
@@ -0,0 +1,63 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::InstanceSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :uri, :title, :description, :email,
|
||||
:version, :urls, :stats, :thumbnail,
|
||||
:languages, :registrations
|
||||
|
||||
has_one :contact_account, serializer: REST::AccountSerializer
|
||||
|
||||
delegate :contact_account, to: :instance_presenter
|
||||
|
||||
def uri
|
||||
Rails.configuration.x.local_domain
|
||||
end
|
||||
|
||||
def title
|
||||
Setting.site_title
|
||||
end
|
||||
|
||||
def description
|
||||
Setting.site_description
|
||||
end
|
||||
|
||||
def email
|
||||
Setting.site_contact_email
|
||||
end
|
||||
|
||||
def version
|
||||
GabSocial::Version.to_s
|
||||
end
|
||||
|
||||
def thumbnail
|
||||
instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url) : full_pack_url('media/images/preview.jpg')
|
||||
end
|
||||
|
||||
def stats
|
||||
{
|
||||
user_count: instance_presenter.user_count,
|
||||
status_count: instance_presenter.status_count,
|
||||
domain_count: instance_presenter.domain_count,
|
||||
}
|
||||
end
|
||||
|
||||
def urls
|
||||
{ streaming_api: Rails.configuration.x.streaming_api_base_url }
|
||||
end
|
||||
|
||||
def languages
|
||||
[I18n.default_locale]
|
||||
end
|
||||
|
||||
def registrations
|
||||
Setting.registrations_mode != 'none' && !Rails.configuration.x.single_user_mode
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def instance_presenter
|
||||
@instance_presenter ||= InstancePresenter.new
|
||||
end
|
||||
end
|
||||
9
app/serializers/rest/list_serializer.rb
Normal file
9
app/serializers/rest/list_serializer.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::ListSerializer < ActiveModel::Serializer
|
||||
attributes :id, :title
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
end
|
||||
41
app/serializers/rest/media_attachment_serializer.rb
Normal file
41
app/serializers/rest/media_attachment_serializer.rb
Normal file
@@ -0,0 +1,41 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::MediaAttachmentSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :id, :type, :url, :preview_url,
|
||||
:remote_url, :text_url, :meta,
|
||||
:description, :blurhash
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def url
|
||||
if object.needs_redownload?
|
||||
media_proxy_url(object.id, :original)
|
||||
else
|
||||
full_asset_url(object.file.url(:original))
|
||||
end
|
||||
end
|
||||
|
||||
def remote_url
|
||||
object.remote_url.presence
|
||||
end
|
||||
|
||||
def preview_url
|
||||
if object.needs_redownload?
|
||||
media_proxy_url(object.id, :small)
|
||||
else
|
||||
full_asset_url(object.file.url(:small))
|
||||
end
|
||||
end
|
||||
|
||||
def text_url
|
||||
object.local? ? medium_url(object) : nil
|
||||
end
|
||||
|
||||
def meta
|
||||
object.file.meta
|
||||
end
|
||||
end
|
||||
16
app/serializers/rest/notification_serializer.rb
Normal file
16
app/serializers/rest/notification_serializer.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::NotificationSerializer < ActiveModel::Serializer
|
||||
attributes :id, :type, :created_at
|
||||
|
||||
belongs_to :from_account, key: :account, serializer: REST::AccountSerializer
|
||||
belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def status_type?
|
||||
[:favourite, :reblog, :mention, :poll].include?(object.type)
|
||||
end
|
||||
end
|
||||
31
app/serializers/rest/poll_serializer.rb
Normal file
31
app/serializers/rest/poll_serializer.rb
Normal file
@@ -0,0 +1,31 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::PollSerializer < ActiveModel::Serializer
|
||||
attributes :id, :expires_at, :expired,
|
||||
:multiple, :votes_count
|
||||
|
||||
has_many :loaded_options, key: :options
|
||||
has_many :emojis, serializer: REST::CustomEmojiSerializer
|
||||
|
||||
attribute :voted, if: :current_user?
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def expired
|
||||
object.expired?
|
||||
end
|
||||
|
||||
def voted
|
||||
object.voted?(current_user.account)
|
||||
end
|
||||
|
||||
def current_user?
|
||||
!current_user.nil?
|
||||
end
|
||||
|
||||
class OptionSerializer < ActiveModel::Serializer
|
||||
attributes :title, :votes_count
|
||||
end
|
||||
end
|
||||
30
app/serializers/rest/preferences_serializer.rb
Normal file
30
app/serializers/rest/preferences_serializer.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::PreferencesSerializer < ActiveModel::Serializer
|
||||
attribute :posting_default_privacy, key: 'posting:default:visibility'
|
||||
attribute :posting_default_sensitive, key: 'posting:default:sensitive'
|
||||
attribute :posting_default_language, key: 'posting:default:language'
|
||||
|
||||
attribute :reading_default_sensitive_media, key: 'reading:expand:media'
|
||||
attribute :reading_default_sensitive_text, key: 'reading:expand:spoilers'
|
||||
|
||||
def posting_default_privacy
|
||||
object.user.setting_default_privacy
|
||||
end
|
||||
|
||||
def posting_default_sensitive
|
||||
object.user.setting_default_sensitive
|
||||
end
|
||||
|
||||
def posting_default_language
|
||||
object.user.setting_default_language.presence
|
||||
end
|
||||
|
||||
def reading_default_sensitive_media
|
||||
object.user.setting_display_media
|
||||
end
|
||||
|
||||
def reading_default_sensitive_text
|
||||
object.user.setting_expand_spoilers
|
||||
end
|
||||
end
|
||||
14
app/serializers/rest/preview_card_serializer.rb
Normal file
14
app/serializers/rest/preview_card_serializer.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::PreviewCardSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :url, :title, :description, :type,
|
||||
:author_name, :author_url, :provider_name,
|
||||
:provider_url, :html, :width, :height,
|
||||
:image, :embed_url
|
||||
|
||||
def image
|
||||
object.image? ? full_asset_url(object.image.url(:original)) : nil
|
||||
end
|
||||
end
|
||||
53
app/serializers/rest/relationship_serializer.rb
Normal file
53
app/serializers/rest/relationship_serializer.rb
Normal file
@@ -0,0 +1,53 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::RelationshipSerializer < ActiveModel::Serializer
|
||||
attributes :id, :following, :showing_reblogs, :followed_by, :blocking, :blocked_by,
|
||||
:muting, :muting_notifications, :requested, :domain_blocking,
|
||||
:endorsed
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def following
|
||||
instance_options[:relationships].following[object.id] ? true : false
|
||||
end
|
||||
|
||||
def showing_reblogs
|
||||
(instance_options[:relationships].following[object.id] || {})[:reblogs] ||
|
||||
(instance_options[:relationships].requested[object.id] || {})[:reblogs] ||
|
||||
false
|
||||
end
|
||||
|
||||
def followed_by
|
||||
instance_options[:relationships].followed_by[object.id] || false
|
||||
end
|
||||
|
||||
def blocking
|
||||
instance_options[:relationships].blocking[object.id] || false
|
||||
end
|
||||
|
||||
def blocked_by
|
||||
instance_options[:relationships].blocked_by[object.id] || false
|
||||
end
|
||||
|
||||
def muting
|
||||
instance_options[:relationships].muting[object.id] ? true : false
|
||||
end
|
||||
|
||||
def muting_notifications
|
||||
(instance_options[:relationships].muting[object.id] || {})[:notifications] || false
|
||||
end
|
||||
|
||||
def requested
|
||||
instance_options[:relationships].requested[object.id] ? true : false
|
||||
end
|
||||
|
||||
def domain_blocking
|
||||
instance_options[:relationships].domain_blocking[object.id] || false
|
||||
end
|
||||
|
||||
def endorsed
|
||||
instance_options[:relationships].endorsed[object.id] || false
|
||||
end
|
||||
end
|
||||
9
app/serializers/rest/report_serializer.rb
Normal file
9
app/serializers/rest/report_serializer.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::ReportSerializer < ActiveModel::Serializer
|
||||
attributes :id, :action_taken
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
end
|
||||
15
app/serializers/rest/scheduled_status_serializer.rb
Normal file
15
app/serializers/rest/scheduled_status_serializer.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::ScheduledStatusSerializer < ActiveModel::Serializer
|
||||
attributes :id, :scheduled_at, :params
|
||||
|
||||
has_many :media_attachments, serializer: REST::MediaAttachmentSerializer
|
||||
|
||||
def id
|
||||
object.id.to_s
|
||||
end
|
||||
|
||||
def params
|
||||
object.params.without(:application_id)
|
||||
end
|
||||
end
|
||||
12
app/serializers/rest/search_serializer.rb
Normal file
12
app/serializers/rest/search_serializer.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::SearchSerializer < ActiveModel::Serializer
|
||||
attributes :hashtags
|
||||
|
||||
has_many :accounts, serializer: REST::AccountSerializer
|
||||
has_many :statuses, serializer: REST::StatusSerializer
|
||||
|
||||
def hashtags
|
||||
object.hashtags.map(&:name)
|
||||
end
|
||||
end
|
||||
152
app/serializers/rest/status_serializer.rb
Normal file
152
app/serializers/rest/status_serializer.rb
Normal file
@@ -0,0 +1,152 @@
|
||||
# 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
|
||||
OStatus::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
def content
|
||||
Formatter.instance.format(object)
|
||||
end
|
||||
|
||||
def url
|
||||
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
|
||||
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
|
||||
11
app/serializers/rest/tag_serializer.rb
Normal file
11
app/serializers/rest/tag_serializer.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::TagSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :name, :url, :history
|
||||
|
||||
def url
|
||||
tag_url(object)
|
||||
end
|
||||
end
|
||||
7
app/serializers/rest/v2/search_serializer.rb
Normal file
7
app/serializers/rest/v2/search_serializer.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::V2::SearchSerializer < ActiveModel::Serializer
|
||||
has_many :accounts, serializer: REST::AccountSerializer
|
||||
has_many :statuses, serializer: REST::StatusSerializer
|
||||
has_many :hashtags, serializer: REST::TagSerializer
|
||||
end
|
||||
13
app/serializers/rest/web_push_subscription_serializer.rb
Normal file
13
app/serializers/rest/web_push_subscription_serializer.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::WebPushSubscriptionSerializer < ActiveModel::Serializer
|
||||
attributes :id, :endpoint, :alerts, :server_key
|
||||
|
||||
def alerts
|
||||
object.data&.dig('alerts') || {}
|
||||
end
|
||||
|
||||
def server_key
|
||||
Rails.configuration.x.vapid_public_key
|
||||
end
|
||||
end
|
||||
39
app/serializers/rss/account_serializer.rb
Normal file
39
app/serializers/rss/account_serializer.rb
Normal file
@@ -0,0 +1,39 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class RSS::AccountSerializer
|
||||
include ActionView::Helpers::NumberHelper
|
||||
include StreamEntriesHelper
|
||||
include RoutingHelper
|
||||
|
||||
def render(account, statuses)
|
||||
builder = RSSBuilder.new
|
||||
|
||||
builder.title("#{display_name(account)} (@#{account.local_username_and_domain})")
|
||||
.description(account_description(account))
|
||||
.link(TagManager.instance.url_for(account))
|
||||
.logo(full_pack_url('media/images/logo.png'))
|
||||
.accent_color('2b90d9')
|
||||
|
||||
builder.image(full_asset_url(account.avatar.url(:original))) if account.avatar?
|
||||
builder.cover(full_asset_url(account.header.url(:original))) if account.header?
|
||||
|
||||
statuses.each do |status|
|
||||
builder.item do |item|
|
||||
item.title(status.title)
|
||||
.link(TagManager.instance.url_for(status))
|
||||
.pub_date(status.created_at)
|
||||
.description(status.spoiler_text.presence || Formatter.instance.format(status, inline_poll_options: true).to_str)
|
||||
|
||||
status.media_attachments.each do |media|
|
||||
item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, length: media.file.size)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
builder.to_xml
|
||||
end
|
||||
|
||||
def self.render(account, statuses)
|
||||
new.render(account, statuses)
|
||||
end
|
||||
end
|
||||
37
app/serializers/rss/tag_serializer.rb
Normal file
37
app/serializers/rss/tag_serializer.rb
Normal file
@@ -0,0 +1,37 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class RSS::TagSerializer
|
||||
include ActionView::Helpers::NumberHelper
|
||||
include ActionView::Helpers::SanitizeHelper
|
||||
include StreamEntriesHelper
|
||||
include RoutingHelper
|
||||
|
||||
def render(tag, statuses)
|
||||
builder = RSSBuilder.new
|
||||
|
||||
builder.title("##{tag.name}")
|
||||
.description(strip_tags(I18n.t('about.about_hashtag_html', hashtag: tag.name)))
|
||||
.link(tag_url(tag))
|
||||
.logo(full_pack_url('media/images/logo.png'))
|
||||
.accent_color('2b90d9')
|
||||
|
||||
statuses.each do |status|
|
||||
builder.item do |item|
|
||||
item.title(status.title)
|
||||
.link(TagManager.instance.url_for(status))
|
||||
.pub_date(status.created_at)
|
||||
.description(status.spoiler_text.presence || Formatter.instance.format(status).to_str)
|
||||
|
||||
status.media_attachments.each do |media|
|
||||
item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, length: media.file.size)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
builder.to_xml
|
||||
end
|
||||
|
||||
def self.render(tag, statuses)
|
||||
new.render(tag, statuses)
|
||||
end
|
||||
end
|
||||
39
app/serializers/web/notification_serializer.rb
Normal file
39
app/serializers/web/notification_serializer.rb
Normal file
@@ -0,0 +1,39 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Web::NotificationSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
include ActionView::Helpers::TextHelper
|
||||
include ActionView::Helpers::SanitizeHelper
|
||||
|
||||
attributes :access_token, :preferred_locale, :notification_id,
|
||||
:notification_type, :icon, :title, :body
|
||||
|
||||
def access_token
|
||||
current_push_subscription.associated_access_token
|
||||
end
|
||||
|
||||
def preferred_locale
|
||||
current_push_subscription.associated_user&.locale || I18n.default_locale
|
||||
end
|
||||
|
||||
def notification_id
|
||||
object.id
|
||||
end
|
||||
|
||||
def notification_type
|
||||
object.type
|
||||
end
|
||||
|
||||
def icon
|
||||
full_asset_url(object.from_account.avatar_static_url)
|
||||
end
|
||||
|
||||
def title
|
||||
I18n.t("notification_mailer.#{object.type}.subject", name: object.from_account.display_name.presence || object.from_account.username)
|
||||
end
|
||||
|
||||
def body
|
||||
str = strip_tags(object.target_status&.spoiler_text&.presence || object.target_status&.text || object.from_account.note)
|
||||
truncate(HTMLEntities.new.decode(str.to_str), length: 140) # Do not encode entities, since this value will not be used in HTML
|
||||
end
|
||||
end
|
||||
26
app/serializers/webfinger_serializer.rb
Normal file
26
app/serializers/webfinger_serializer.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class WebfingerSerializer < ActiveModel::Serializer
|
||||
include RoutingHelper
|
||||
|
||||
attributes :subject, :aliases, :links
|
||||
|
||||
def subject
|
||||
object.to_webfinger_s
|
||||
end
|
||||
|
||||
def aliases
|
||||
[short_account_url(object), account_url(object)]
|
||||
end
|
||||
|
||||
def links
|
||||
[
|
||||
{ rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: short_account_url(object) },
|
||||
{ rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(object, format: 'atom') },
|
||||
{ rel: 'self', type: 'application/activity+json', href: account_url(object) },
|
||||
{ rel: 'salmon', href: api_salmon_url(object.id) },
|
||||
{ rel: 'magic-public-key', href: "data:application/magic-public-key,#{object.magic_key}" },
|
||||
{ rel: 'http://ostatus.org/schema/1.0/subscribe', template: "#{authorize_interaction_url}?uri={uri}" },
|
||||
]
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user