Federate votersCount correctly

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
Assisted-by: your mother
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk 2026-03-23 11:50:31 +01:00
commit 5aa3c8a06e
7 changed files with 46 additions and 1 deletions

View file

@ -0,0 +1 @@
Federate `votersCount` correctly

View file

@ -374,10 +374,18 @@ defmodule Pleroma.Object do
voters = [actor | object.data["voters"] || []] |> Enum.uniq() voters = [actor | object.data["voters"] || []] |> Enum.uniq()
voters_count =
if Map.has_key?(object.data, "votersCount") do
object.data["votersCount"] + 1
else
length(voters)
end
data = data =
object.data object.data
|> Map.put(key, options) |> Map.put(key, options)
|> Map.put("voters", voters) |> Map.put("voters", voters)
|> Map.put("votersCount", voters_count)
object object
|> Object.change(%{data: data}) |> Object.change(%{data: data})

View file

@ -28,6 +28,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
end end
field(:closed, ObjectValidators.DateTime) field(:closed, ObjectValidators.DateTime)
field(:votersCount, :integer)
field(:voters, {:array, ObjectValidators.ObjectID}, default: []) field(:voters, {:array, ObjectValidators.ObjectID}, default: [])
field(:nonAnonymous, :boolean) field(:nonAnonymous, :boolean)
embeds_many(:anyOf, QuestionOptionsValidator) embeds_many(:anyOf, QuestionOptionsValidator)

View file

@ -783,6 +783,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def set_replies(obj_data), do: obj_data def set_replies(obj_data), do: obj_data
defp set_voters_count(%{"voters" => [_ | _] = voters} = obj) do
Map.merge(obj, %{"votersCount" => length(voters)})
end
defp set_voters_count(obj), do: obj
# Prepares and sanitizes the object for federation. # Prepares and sanitizes the object for federation.
def prepare_object(object) do def prepare_object(object) do
object object
@ -795,6 +801,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> set_reply_to_uri |> set_reply_to_uri
|> set_quote_url |> set_quote_url
|> set_replies |> set_replies
|> set_voters_count
|> CommonFixes.maybe_add_content_map() |> CommonFixes.maybe_add_content_map()
|> strip_internal_fields |> strip_internal_fields
|> strip_internal_tags |> strip_internal_tags

View file

@ -75,6 +75,8 @@ defmodule Pleroma.Web.MastodonAPI.PollView do
length(voters) length(voters)
end end
defp voters_count(%{data: %{"votersCount" => voters}}), do: voters
defp voters_count(_), do: 0 defp voters_count(_), do: 0
defp voted_and_own_votes(%{object: object} = params, options) do defp voted_and_own_votes(%{object: object} = params, options) do

View file

@ -170,4 +170,23 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.QuestionHandlingTest do
assert {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(data) assert {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(data)
end end
test "it displays voters count for a poll" do
user = insert(:user)
other_user = insert(:user)
{:ok, activity} =
CommonAPI.post(user, %{
status: "???",
poll: %{expires_in: 10, options: ["yes", "no"]}
})
object = Object.normalize(activity, fetch: false)
{:ok, _, _} = CommonAPI.vote(object, other_user, [1])
{:ok, modified} = Transmogrifier.prepare_activity(activity.data)
refute Map.has_key?(modified["object"], "voters")
assert modified["object"]["votersCount"] == 1
end
end end

View file

@ -167,7 +167,14 @@ defmodule Pleroma.Web.MastodonAPI.PollViewTest do
} = PollView.render("show.json", %{object: object}) } = PollView.render("show.json", %{object: object})
end end
test "that poll is non anonymous" do test "displays correct voters count" do
object = Object.normalize("https://friends.grishka.me/posts/54642", fetch: true)
result = PollView.render("show.json", %{object: object})
assert result[:voters_count] == 14
end
test "detects that poll is non anonymous" do
object = Object.normalize("https://friends.grishka.me/posts/54642", fetch: true) object = Object.normalize("https://friends.grishka.me/posts/54642", fetch: true)
result = PollView.render("show.json", %{object: object}) result = PollView.render("show.json", %{object: object})