logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma
commit: 135c19676994defd6de729a497af5fb1f9c7b0ad
parent: 37ee6c6e2cfcb6eaffc028cfd87e938bf521d7e8
Author: lain <lain@soykaf.club>
Date:   Sat, 15 Jun 2019 15:13:48 +0000

Merge branch 'bugfix/980-polls-double-vote' into 'develop'

MastodonAPI Controller: Band-Aid double vote problem.

See merge request pleroma/pleroma!1275

Diffstat:

Mlib/pleroma/web/mastodon_api/mastodon_api_controller.ex16+++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -454,12 +454,26 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end end + defp get_cached_vote_or_vote(user, object, choices) do + idempotency_key = "polls:#{user.id}:#{object.data["id"]}" + + {_, res} = + Cachex.fetch(:idempotency_cache, idempotency_key, fn _ -> + case CommonAPI.vote(user, object, choices) do + {:error, _message} = res -> {:ignore, res} + res -> {:commit, res} + end + end) + + res + end + def poll_vote(%{assigns: %{user: user}} = conn, %{"id" => id, "choices" => choices}) do with %Object{} = object <- Object.get_by_id(id), true <- object.data["type"] == "Question", %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]), true <- Visibility.visible_for_user?(activity, user), - {:ok, _activities, object} <- CommonAPI.vote(user, object, choices) do + {:ok, _activities, object} <- get_cached_vote_or_vote(user, object, choices) do conn |> put_view(StatusView) |> try_render("poll.json", %{object: object, for: user})