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:
parent
d0ef58a59d
commit
5aa3c8a06e
7 changed files with 46 additions and 1 deletions
1
changelog.d/poll-voters-count.fix
Normal file
1
changelog.d/poll-voters-count.fix
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Federate `votersCount` correctly
|
||||||
|
|
@ -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})
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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})
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue