diff options
author | lain <lain@soykaf.club> | 2019-06-15 15:13:48 +0000 |
---|---|---|
committer | lain <lain@soykaf.club> | 2019-06-15 15:13:48 +0000 |
commit | 135c19676994defd6de729a497af5fb1f9c7b0ad (patch) | |
tree | 67dfe87928411446d5ccdfc4ddc79b1e8191d3cd /lib | |
parent | 37ee6c6e2cfcb6eaffc028cfd87e938bf521d7e8 (diff) | |
parent | 966543379d7d0b0dbf53979c9d26ff212963729b (diff) | |
download | pleroma-135c19676994defd6de729a497af5fb1f9c7b0ad.tar.gz |
Merge branch 'bugfix/980-polls-double-vote' into 'develop'
MastodonAPI Controller: Band-Aid double vote problem.
See merge request pleroma/pleroma!1275
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index eea4040ec..457709578 100644 --- 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}) |