Correctly handle event update
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -29,6 +29,8 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
alias MobilizonWeb.Router.Helpers, as: Routes
|
||||
alias MobilizonWeb.Endpoint
|
||||
|
||||
@actor_types ["Group", "Person", "Application"]
|
||||
|
||||
# Some implementations send the actor URI as the actor field, others send the entire actor object,
|
||||
# so figure out what the actor's URI is based on what we have.
|
||||
def get_url(%{"id" => id}), do: id
|
||||
@@ -119,7 +121,7 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
@doc """
|
||||
Inserts a full object if it is contained in an activity.
|
||||
"""
|
||||
def insert_full_object(%{"object" => %{"type" => "Event"} = object_data})
|
||||
def insert_full_object(%{"object" => %{"type" => "Event"} = object_data, "type" => "Create"})
|
||||
when is_map(object_data) do
|
||||
with {:ok, object_data} <-
|
||||
Converters.Event.as_to_model_data(object_data),
|
||||
@@ -128,7 +130,7 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
end
|
||||
end
|
||||
|
||||
def insert_full_object(%{"object" => %{"type" => "Group"} = object_data})
|
||||
def insert_full_object(%{"object" => %{"type" => "Group"} = object_data, "type" => "Create"})
|
||||
when is_map(object_data) do
|
||||
with object_data <-
|
||||
Map.put(object_data, "preferred_username", object_data["preferredUsername"]),
|
||||
@@ -140,7 +142,7 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
@doc """
|
||||
Inserts a full object if it is contained in an activity.
|
||||
"""
|
||||
def insert_full_object(%{"object" => %{"type" => "Note"} = object_data})
|
||||
def insert_full_object(%{"object" => %{"type" => "Note"} = object_data, "type" => "Create"})
|
||||
when is_map(object_data) do
|
||||
with data <- Converters.Comment.as_to_model_data(object_data),
|
||||
{:ok, %Comment{} = comment} <- Events.create_comment(data) do
|
||||
@@ -177,6 +179,39 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
|
||||
def insert_full_object(_), do: {:ok, nil}
|
||||
|
||||
@doc """
|
||||
Update an object
|
||||
"""
|
||||
@spec update_object(struct(), map()) :: {:ok, struct()} | any()
|
||||
def update_object(object, object_data)
|
||||
|
||||
def update_object(event_url, %{
|
||||
"object" => %{"type" => "Event"} = object_data,
|
||||
"type" => "Update"
|
||||
})
|
||||
when is_map(object_data) do
|
||||
with {:event_not_found, %Event{} = event} <-
|
||||
{:event_not_found, Events.get_event_by_url(event_url)},
|
||||
{:ok, object_data} <- Converters.Event.as_to_model_data(object_data),
|
||||
{:ok, %Event{} = event} <- Events.update_event(event, object_data) do
|
||||
{:ok, event}
|
||||
end
|
||||
end
|
||||
|
||||
def update_object(actor_url, %{
|
||||
"object" => %{"type" => type_actor} = object_data,
|
||||
"type" => "Update"
|
||||
})
|
||||
when is_map(object_data) and type_actor in @actor_types do
|
||||
with {:ok, %Actor{} = actor} <- Actors.get_actor_by_url(actor_url),
|
||||
object_data <- Converters.Actor.as_to_model_data(object_data),
|
||||
{:ok, %Actor{} = actor} <- Actors.update_actor(actor, object_data) do
|
||||
{:ok, actor}
|
||||
end
|
||||
end
|
||||
|
||||
def update_object(_, _), do: {:ok, nil}
|
||||
|
||||
#### Like-related helpers
|
||||
|
||||
# @doc """
|
||||
@@ -264,7 +299,8 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
String.t(),
|
||||
map(),
|
||||
list(),
|
||||
map()
|
||||
map(),
|
||||
String.t()
|
||||
) :: map()
|
||||
def make_event_data(
|
||||
actor,
|
||||
@@ -273,10 +309,12 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
content_html,
|
||||
picture \\ nil,
|
||||
tags \\ [],
|
||||
metadata \\ %{}
|
||||
metadata \\ %{},
|
||||
uuid \\ nil,
|
||||
url \\ nil
|
||||
) do
|
||||
Logger.debug("Making event data")
|
||||
uuid = Ecto.UUID.generate()
|
||||
uuid = uuid || Ecto.UUID.generate()
|
||||
|
||||
res = %{
|
||||
"type" => "Event",
|
||||
@@ -285,9 +323,10 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
"content" => content_html,
|
||||
"name" => title,
|
||||
"startTime" => metadata.begins_on,
|
||||
"endTime" => metadata.ends_on,
|
||||
"category" => metadata.category,
|
||||
"actor" => actor,
|
||||
"id" => Routes.page_url(Endpoint, :event, uuid),
|
||||
"id" => url || Routes.page_url(Endpoint, :event, uuid),
|
||||
"uuid" => uuid,
|
||||
"tag" =>
|
||||
tags |> Enum.uniq() |> Enum.map(fn tag -> %{"type" => "Hashtag", "name" => "##{tag}"} end)
|
||||
@@ -505,7 +544,7 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
activity_id,
|
||||
public
|
||||
)
|
||||
when type in ["Group", "Person", "Application"] do
|
||||
when type in @actor_types do
|
||||
do_make_announce_data(actor_url, actor_followers_url, url, url, activity_id, public)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user