From d8449d02883e179b86ea26544ea2f317ec14b5bd Mon Sep 17 00:00:00 2001 From: alemi Date: Fri, 14 Feb 2025 17:57:38 +0100 Subject: [PATCH] feat: replies collection views for object really doubt this is all that's needed however it's a start --- .../web/activity_pub/views/object_view.ex | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/lib/pleroma/web/activity_pub/views/object_view.ex b/lib/pleroma/web/activity_pub/views/object_view.ex index 63caa915c..a765bda9c 100644 --- a/lib/pleroma/web/activity_pub/views/object_view.ex +++ b/lib/pleroma/web/activity_pub/views/object_view.ex @@ -37,4 +37,52 @@ defmodule Pleroma.Web.ActivityPub.ObjectView do Map.merge(base, additional) end + + def render("replies.json", %{object: object, page: page} = opts) do + query = Object.replies(object) + query = from(object in query, select: [:ap_id]) + replies = Repo.all(query) + + total = length(replies) + + collection(replies, "#{object.ap_id}/replies", page, true, total) + |> Map.merge(Utils.make_json_ld_header()) + end + + def render("replies.json", %{object: object} = opts) do + query = Object.replies(object) + query = from(object in query, select: [:ap_id]) + replies = Repo.all(query) + + total = length(replies) + + %{ + "id" => "#{object.ap_id}/replies", + "type" => "OrderedCollection", + "totalItems" => total, + "first" => collection(replies, "#{object.ap_id}/replies", 1, true) + } + |> Map.merge(Utils.make_json_ld_header()) + end + + def collection(collection, iri, page, show_items \\ true, total \\ nil) do + offset = (page - 1) * 10 + items = Enum.slice(collection, offset, 10) + items = Enum.map(items, fn item -> item.ap_id end) + total = total || length(collection) + + map = %{ + "id" => "#{iri}?page=#{page}", + "type" => "OrderedCollectionPage", + "partOf" => iri, + "totalItems" => total, + "orderedItems" => if(show_items, do: items, else: []) + } + + if offset < total do + Map.put(map, "next", "#{iri}?page=#{page + 1}") + else + map + end + end end