def show
expires_in 3.minutes, public: public_fetch_mode?
- render_with_cache json: collection_presenter, content_type: 'application/activity+json', serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, skip_activities: true
+ render_with_cache json: collection_presenter, content_type: 'application/activity+json', serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter
end
private
def set_items
case params[:id]
when 'featured'
- @items = begin
- # Because in public fetch mode we cache the response, there would be no
- # benefit from performing the check below, since a blocked account or domain
- # would likely be served the cache from the reverse proxy anyway
-
- if authorized_fetch_mode? && !signed_request_account.nil? && (@account.blocking?(signed_request_account) || (!signed_request_account.domain.nil? && @account.domain_blocking?(signed_request_account.domain)))
- []
- else
- cache_collection(@account.pinned_statuses, Status)
- end
- end
+ @items = for_signed_account { cache_collection(@account.pinned_statuses, Status) }
+ when 'tags'
+ @items = for_signed_account { @account.featured_tags }
when 'devices'
@items = @account.devices
else
def set_size
case params[:id]
- when 'featured', 'devices'
+ when 'featured', 'devices', 'tags'
@size = @items.size
else
not_found
case params[:id]
when 'featured'
@type = :ordered
- when 'devices'
+ when 'devices', 'tags'
@type = :unordered
else
not_found
items: @items
)
end
+
+ def for_signed_account
+ # Because in public fetch mode we cache the response, there would be no
+ # benefit from performing the check below, since a blocked account or domain
+ # would likely be served the cache from the reverse proxy anyway
+
+ if authorized_fetch_mode? && !signed_request_account.nil? && (@account.blocking?(signed_request_account) || (!signed_request_account.domain.nil? && @account.domain_blocking?(signed_request_account.domain)))
+ []
+ else
+ yield
+ end
+ end
end
moved_to: { 'movedTo' => { '@id' => 'as:movedTo', '@type' => '@id' } },
also_known_as: { 'alsoKnownAs' => { '@id' => 'as:alsoKnownAs', '@type' => '@id' } },
emoji: { 'toot' => 'http://joinmastodon.org/ns#', 'Emoji' => 'toot:Emoji' },
- featured: { 'toot' => 'http://joinmastodon.org/ns#', 'featured' => { '@id' => 'toot:featured', '@type' => '@id' } },
+ featured: { 'toot' => 'http://joinmastodon.org/ns#', 'featured' => { '@id' => 'toot:featured', '@type' => '@id' }, 'featuredTags' => { '@id' => 'toot:featuredTags', '@type' => '@id' } },
property_value: { 'schema' => 'http://schema.org#', 'PropertyValue' => 'schema:PropertyValue', 'value' => 'schema:value' },
atom_uri: { 'ostatus' => 'http://ostatus.org#', 'atomUri' => 'ostatus:atomUri' },
conversation: { 'ostatus' => 'http://ostatus.org#', 'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri', 'conversation' => 'ostatus:conversation' },
:discoverable, :olm
attributes :id, :type, :following, :followers,
- :inbox, :outbox, :featured,
+ :inbox, :outbox, :featured, :featured_tags,
:preferred_username, :name, :summary,
:url, :manually_approves_followers,
:discoverable
account_collection_url(object, :featured)
end
+ def featured_tags
+ account_collection_url(object, :tags)
+ end
+
def endpoints
object
end
ActivityPub::NoteSerializer
when 'Device'
ActivityPub::DeviceSerializer
+ when 'FeaturedTag'
+ ActivityPub::HashtagSerializer
when 'ActivityPub::CollectionPresenter'
ActivityPub::CollectionSerializer
when 'String'
--- /dev/null
+# frozen_string_literal: true
+
+class ActivityPub::HashtagSerializer < ActivityPub::Serializer
+ include RoutingHelper
+
+ attributes :type, :href, :name
+
+ def type
+ 'Hashtag'
+ end
+
+ def name
+ "##{object.name}"
+ end
+
+ def href
+ if object.class.name == 'FeaturedTag'
+ short_account_tag_url(object.account, object.tag)
+ else
+ tag_url(object)
+ end
+ end
+end