MastodonAPI Controller: Band-Aid double vote problem.
authorlain <lain@soykaf.club>
Wed, 12 Jun 2019 14:36:23 +0000 (16:36 +0200)
committerlain <lain@soykaf.club>
Wed, 12 Jun 2019 14:36:23 +0000 (16:36 +0200)
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex

index 46049dd24a9bd7a1e6e1e2af772c41e0ee1d8bc9..ed1aa9db2d25cfb3aa8ecd97dec6bb2f0a874837 100644 (file)
@@ -439,12 +439,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})