Fix receiving Flag activities on federated events
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
parent
24331d75b0
commit
d7aa432cca
@ -41,7 +41,8 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
|||||||
params = %{
|
params = %{
|
||||||
reporter_id: params["reporter"].id,
|
reporter_id: params["reporter"].id,
|
||||||
reported_id: params["reported"].id,
|
reported_id: params["reported"].id,
|
||||||
comments_ids: params["comments"] |> Enum.map(& &1.id),
|
comments_ids:
|
||||||
|
if(params["comments"], do: params["comments"] |> Enum.map(& &1.id), else: []),
|
||||||
content: params["content"] || "",
|
content: params["content"] || "",
|
||||||
additional: %{
|
additional: %{
|
||||||
"cc" => [params["reported"].url]
|
"cc" => [params["reported"].url]
|
||||||
|
@ -67,33 +67,9 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Flag do
|
|||||||
def as_to_model(%{"object" => objects} = object) do
|
def as_to_model(%{"object" => objects} = object) do
|
||||||
with {:ok, %Actor{} = reporter} <-
|
with {:ok, %Actor{} = reporter} <-
|
||||||
ActivityPubActor.get_or_fetch_actor_by_url(object["actor"]),
|
ActivityPubActor.get_or_fetch_actor_by_url(object["actor"]),
|
||||||
%Actor{} = reported <-
|
%Actor{} = reported <- find_reported(objects),
|
||||||
Enum.reduce_while(objects, nil, fn url, _ ->
|
event <- find_event(objects),
|
||||||
case ActivityPubActor.get_or_fetch_actor_by_url(url) do
|
comments <- find_comments(objects, reported, event) do
|
||||||
{:ok, %Actor{} = actor} ->
|
|
||||||
{:halt, actor}
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
{:cont, nil}
|
|
||||||
end
|
|
||||||
end),
|
|
||||||
event <-
|
|
||||||
Enum.reduce_while(objects, nil, fn url, _ ->
|
|
||||||
case Events.get_event_by_url(url) do
|
|
||||||
%Event{} = event ->
|
|
||||||
{:halt, event}
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
{:cont, nil}
|
|
||||||
end
|
|
||||||
end),
|
|
||||||
|
|
||||||
# Remove the reported actor and the event from the object list.
|
|
||||||
comments <-
|
|
||||||
Enum.filter(objects, fn url ->
|
|
||||||
!(url == reported.url || (!is_nil(event) && event.url == url))
|
|
||||||
end),
|
|
||||||
comments <- Enum.map(comments, &Discussions.get_comment_from_url/1) do
|
|
||||||
%{
|
%{
|
||||||
"reporter" => reporter,
|
"reporter" => reporter,
|
||||||
"uri" => object["id"],
|
"uri" => object["id"],
|
||||||
@ -104,4 +80,41 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Flag do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@spec find_reported(list(String.t())) :: Actor.t() | nil
|
||||||
|
defp find_reported(objects) do
|
||||||
|
Enum.reduce_while(objects, nil, fn url, _ ->
|
||||||
|
case ActivityPubActor.get_or_fetch_actor_by_url(url) do
|
||||||
|
{:ok, %Actor{} = actor} ->
|
||||||
|
{:halt, actor}
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
{:cont, nil}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Remove the reported actor and the event from the object list.
|
||||||
|
@spec find_comments(list(String.t()), Actor.t() | nil, Event.t() | nil) :: list(Comment.t())
|
||||||
|
defp find_comments(objects, reported, event) do
|
||||||
|
objects
|
||||||
|
|> Enum.filter(fn url ->
|
||||||
|
!((!is_nil(reported) && url == reported.url) || (!is_nil(event) && event.url == url))
|
||||||
|
end)
|
||||||
|
|> Enum.map(&Discussions.get_comment_from_url/1)
|
||||||
|
|> Enum.filter(& &1)
|
||||||
|
end
|
||||||
|
|
||||||
|
@spec find_event(list(String.t())) :: Event.t() | nil
|
||||||
|
defp find_event(objects) do
|
||||||
|
Enum.reduce_while(objects, nil, fn url, _ ->
|
||||||
|
case Events.get_event_by_url(url) do
|
||||||
|
%Event{} = event ->
|
||||||
|
{:halt, event}
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
{:cont, nil}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user