diff --git a/lib/federation/activity_pub/fetcher.ex b/lib/federation/activity_pub/fetcher.ex index 97166baa2..b017256db 100644 --- a/lib/federation/activity_pub/fetcher.ex +++ b/lib/federation/activity_pub/fetcher.ex @@ -42,28 +42,12 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do end @spec fetch_and_create(String.t(), Keyword.t()) :: - {:ok, map(), struct()} | {:error, atom()} | :error + {:ok, map(), struct()} | {:error, atom()} | {:error, Ecto.Changeset.t()} | :error def fetch_and_create(url, options \\ []) do case fetch(url, options) do {:ok, data} when is_map(data) -> if origin_check?(url, data) do - case Transmogrifier.handle_incoming(%{ - "type" => "Create", - "to" => data["to"], - "cc" => data["cc"], - "actor" => data["actor"] || data["attributedTo"], - "attributedTo" => data["attributedTo"] || data["actor"], - "object" => data - }) do - {:ok, entity, structure} -> - {:ok, entity, structure} - - {:error, error} when is_atom(error) -> - {:error, error} - - :error -> - {:error, :transmogrifier_error} - end + pass_to_transmogrifier(data) else Logger.warning("Object origin check failed") {:error, :object_origin_check_failed} @@ -98,6 +82,34 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do end end + @spec pass_to_transmogrifier(map()) :: + {:ok, map(), struct()} + | {:error, atom()} + | {:error, Ecto.Changeset.t()} + | {:error, :transmogrifier_error} + defp pass_to_transmogrifier(data) do + case Transmogrifier.handle_incoming(%{ + "type" => "Create", + "to" => data["to"], + "cc" => data["cc"], + "actor" => data["actor"] || data["attributedTo"], + "attributedTo" => data["attributedTo"] || data["actor"], + "object" => data + }) do + {:ok, entity, structure} -> + {:ok, entity, structure} + + {:error, error} when is_atom(error) -> + {:error, error} + + {:error, %Ecto.Changeset{} = err} -> + {:error, err} + + :error -> + {:error, :transmogrifier_error} + end + end + @type fetch_actor_errors :: :json_decode_error | :actor_deleted | :http_error | :actor_not_allowed_type diff --git a/lib/federation/activity_pub/transmogrifier.ex b/lib/federation/activity_pub/transmogrifier.ex index 2963deacd..4b64483b5 100644 --- a/lib/federation/activity_pub/transmogrifier.ex +++ b/lib/federation/activity_pub/transmogrifier.ex @@ -76,12 +76,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do Actions.Create.create(:conversation, object_data, false) object_data when is_map(object_data) -> - case Discussions.get_comment_from_url_with_preload(object_data.url) do - {:error, :comment_not_found} -> - object_data - |> transform_object_data_for_discussion() - |> save_comment_or_discussion() - end + handle_comment_or_discussion(object_data) + + {:error, err} -> + {:error, err} end {:ok, %Comment{} = comment} -> @@ -1019,6 +1017,19 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do is_nil(object_data.title) or object_data.title == "" end + defp handle_comment_or_discussion(object_data) do + case Discussions.get_comment_from_url_with_preload(object_data.url) do + {:error, :comment_not_found} -> + object_data + |> transform_object_data_for_discussion() + |> save_comment_or_discussion() + + {:ok, %Comment{} = comment} -> + # Object already exists + {:ok, nil, comment} + end + end + # Comment and conversations have different attributes for actor and groups @spec transform_object_data_for_discussion(map()) :: map() defp transform_object_data_for_discussion(object_data) do diff --git a/src/components/Event/EventActionSection.vue b/src/components/Event/EventActionSection.vue index f094f8b4a..46bfb8a87 100644 --- a/src/components/Event/EventActionSection.vue +++ b/src/components/Event/EventActionSection.vue @@ -107,11 +107,7 @@ {{ t("Actions") }} - + - + - +