Improved remote thread fetching (#10106)
* Fetch up to 5 replies when discovering a new remote status This is used for resolving threads downwards. The originating server must add a “replies” attributes with such replies for it to be useful. * Add some tests for ActivityPub::FetchRepliesWorker * Add specs for ActivityPub::FetchRepliesService * Serialize up to 5 public self-replies for ActivityPub notes * Add specs for ActivityPub::NoteSerializer * Move exponential backoff logic to a worker concern * Fetch first page of paginated collections when fetching thread replies * Add specs for paginated collections in replies * Move Note replies serialization to a first CollectionPage The collection isn't actually paginable yet as it has no id nor a `next` field. This may come in another PR. * Use pluck(:uri) instead of map(&:uri) to improve performances * Fix fetching replies when they are in a CollectionPage
This commit is contained in:
parent
6e8743d17a
commit
9d3c6f1849
13 changed files with 333 additions and 7 deletions
|
@ -7,7 +7,8 @@ class ActivityPub::CollectionSerializer < ActiveModel::Serializer
|
|||
super
|
||||
end
|
||||
|
||||
attributes :id, :type
|
||||
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? }
|
||||
|
@ -37,6 +38,6 @@ class ActivityPub::CollectionSerializer < ActiveModel::Serializer
|
|||
end
|
||||
|
||||
def page?
|
||||
object.part_of.present?
|
||||
object.part_of.present? || object.page.present?
|
||||
end
|
||||
end
|
||||
|
|
|
@ -13,6 +13,8 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
|
|||
has_many :media_attachments, key: :attachment
|
||||
has_many :virtual_tags, key: :tag
|
||||
|
||||
has_one :replies, serializer: ActivityPub::CollectionSerializer
|
||||
|
||||
def id
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
@ -33,6 +35,17 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
|
|||
{ object.language => Formatter.instance.format(object) }
|
||||
end
|
||||
|
||||
def replies
|
||||
ActivityPub::CollectionPresenter.new(
|
||||
type: :unordered,
|
||||
first: ActivityPub::CollectionPresenter.new(
|
||||
type: :unordered,
|
||||
page: true,
|
||||
items: object.self_replies(5).pluck(:uri)
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
def language?
|
||||
object.language.present?
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue