From 6bfd497f4afeb4182cc865087e6f4863bc48a4f4 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 22 Jan 2021 09:47:59 -0600 Subject: [PATCH] Include own_votes in the poll data --- CHANGELOG.md | 1 + .../web/mastodon_api/views/poll_view.ex | 27 ++++++++++++++----- .../web/mastodon_api/views/poll_view_test.exs | 6 ++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1dfeae01..328a7c28c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). API Changes - Mastodon API: Current user is now included in conversation if it's the only participant. - Mastodon API: Fixed last_status.account being not filled with account data. + - Mastodon API: Fixed own_votes being not returned with poll data. ## Unreleased (Patch) diff --git a/lib/pleroma/web/mastodon_api/views/poll_view.ex b/lib/pleroma/web/mastodon_api/views/poll_view.ex index d6b544037..94bc1c139 100644 --- a/lib/pleroma/web/mastodon_api/views/poll_view.ex +++ b/lib/pleroma/web/mastodon_api/views/poll_view.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.PollView do def render("show.json", %{object: object, multiple: multiple, options: options} = params) do {end_time, expired} = end_time_and_expired(object) {options, votes_count} = options_and_votes_count(options) + {voted, own_votes} = voted_and_own_votes(params, options) %{ # Mastodon uses separate ids for polls, but an object can't have @@ -21,7 +22,8 @@ def render("show.json", %{object: object, multiple: multiple, options: options} votes_count: votes_count, voters_count: voters_count(object), options: options, - voted: voted?(params), + voted: voted, + own_votes: own_votes, emojis: Pleroma.Web.MastodonAPI.StatusView.build_emojis(object.data["emoji"]) } end @@ -67,12 +69,25 @@ defp voters_count(%{data: %{"voters" => [_ | _] = voters}}) do defp voters_count(_), do: 0 - defp voted?(%{object: object} = opts) do - if opts[:for] do - existing_votes = Pleroma.Web.ActivityPub.Utils.get_existing_votes(opts[:for].ap_id, object) - existing_votes != [] or opts[:for].ap_id == object.data["actor"] + defp voted_and_own_votes(%{object: object} = params, options) do + options = options |> Enum.map(fn x -> Map.get(x, :title) end) + + if params[:for] do + existing_votes = + Pleroma.Web.ActivityPub.Utils.get_existing_votes(params[:for].ap_id, object) + + own_votes = + for vote <- existing_votes do + data = Map.get(vote, :object) |> Map.get(:data) + + Enum.find_index(options, fn x -> x == data["name"] end) + end || [] + + voted = existing_votes != [] or params[:for].ap_id == object.data["actor"] + + {voted, own_votes} else - false + {false, []} end end end diff --git a/test/pleroma/web/mastodon_api/views/poll_view_test.exs b/test/pleroma/web/mastodon_api/views/poll_view_test.exs index a8600e1c2..f087d50e8 100644 --- a/test/pleroma/web/mastodon_api/views/poll_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/poll_view_test.exs @@ -44,7 +44,8 @@ test "renders a poll" do ], voted: false, votes_count: 0, - voters_count: 0 + voters_count: 0, + own_votes: [] } result = PollView.render("show.json", %{object: object}) @@ -123,7 +124,10 @@ test "detects vote status" do result = PollView.render("show.json", %{object: object, for: other_user}) + _own_votes = result[:own_votes] + assert result[:voted] == true + assert own_votes = [1, 2] assert Enum.at(result[:options], 1)[:votes_count] == 1 assert Enum.at(result[:options], 2)[:votes_count] == 1 end