diff options
| author | Haelwenn (lanodan) Monnier <contact@hacktivis.me> | 2020-06-15 00:30:45 +0200 | 
|---|---|---|
| committer | Haelwenn (lanodan) Monnier <contact@hacktivis.me> | 2020-07-15 11:39:55 +0200 | 
| commit | 4644a8bd109faf6c684767fc60c37e298b8c5c07 (patch) | |
| tree | d6ab472116c1ad351d5fda24dca8f44ecd123110 | |
| parent | 10bd08ef07bd91995589ad37cb25e6889dac59b3 (diff) | |
| download | pleroma-4644a8bd109faf6c684767fc60c37e298b8c5c07.tar.gz pleroma-4644a8bd109faf6c684767fc60c37e298b8c5c07.zip | |
Fix multiple-choice poll detection
| -rw-r--r-- | lib/pleroma/object.ex | 17 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/common_api.ex | 9 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/poll_view.ex | 4 | 
3 files changed, 19 insertions, 11 deletions
| diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 546c4ea01..4dd929cfd 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -255,6 +255,12 @@ defmodule Pleroma.Object do      end    end +  defp poll_is_multiple?(%Object{data: %{"anyOf" => anyOf}}) do +    !Enum.empty?(anyOf) +  end + +  defp poll_is_multiple?(_), do: false +    def decrease_replies_count(ap_id) do      Object      |> where([o], fragment("?->>'id' = ?::text", o.data, ^to_string(ap_id))) @@ -281,10 +287,10 @@ defmodule Pleroma.Object do    def increase_vote_count(ap_id, name, actor) do      with %Object{} = object <- Object.normalize(ap_id),           "Question" <- object.data["type"] do -      multiple = Map.has_key?(object.data, "anyOf") +      key = if poll_is_multiple?(object), do: "anyOf", else: "oneOf"        options = -        (object.data["anyOf"] || object.data["oneOf"] || []) +        object.data[key]          |> Enum.map(fn            %{"name" => ^name} = option ->              Kernel.update_in(option["replies"]["totalItems"], &(&1 + 1)) @@ -296,11 +302,8 @@ defmodule Pleroma.Object do        voters = [actor | object.data["voters"] || []] |> Enum.uniq()        data = -        if multiple do -          Map.put(object.data, "anyOf", options) -        else -          Map.put(object.data, "oneOf", options) -        end +        object.data +        |> Map.put(key, options)          |> Map.put("voters", voters)        object diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 4d5b0decf..692ceab1e 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -340,8 +340,13 @@ defmodule Pleroma.Web.CommonAPI do      end    end -  defp get_options_and_max_count(%{data: %{"anyOf" => any_of}}), do: {any_of, Enum.count(any_of)} -  defp get_options_and_max_count(%{data: %{"oneOf" => one_of}}), do: {one_of, 1} +  defp get_options_and_max_count(%{data: %{"anyOf" => any_of}}) +       when is_list(any_of) and any_of != [], +       do: {any_of, Enum.count(any_of)} + +  defp get_options_and_max_count(%{data: %{"oneOf" => one_of}}) +       when is_list(one_of) and one_of != [], +       do: {one_of, 1}    defp normalize_and_validate_choices(choices, object) do      choices = Enum.map(choices, fn i -> if is_binary(i), do: String.to_integer(i), else: i end) diff --git a/lib/pleroma/web/mastodon_api/views/poll_view.ex b/lib/pleroma/web/mastodon_api/views/poll_view.ex index 59a5deb28..73c990e2e 100644 --- a/lib/pleroma/web/mastodon_api/views/poll_view.ex +++ b/lib/pleroma/web/mastodon_api/views/poll_view.ex @@ -28,10 +28,10 @@ defmodule Pleroma.Web.MastodonAPI.PollView do    def render("show.json", %{object: object} = params) do      case object.data do -      %{"anyOf" => options} when is_list(options) -> +      %{"anyOf" => options} when is_list(options) and options != [] ->          render(__MODULE__, "show.json", Map.merge(params, %{multiple: true, options: options})) -      %{"oneOf" => options} when is_list(options) -> +      %{"oneOf" => options} when is_list(options) and options != [] ->          render(__MODULE__, "show.json", Map.merge(params, %{multiple: false, options: options}))        _ -> | 
