Add a command to refresh a single actor or all actors

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2020-06-10 14:28:27 +02:00
parent 23a5ffd3a1
commit c61a54d802
2 changed files with 123 additions and 2 deletions

View File

@@ -210,12 +210,23 @@ defmodule Mobilizon.Actors do
Conflicts on actor's URL/AP ID, replaces keys, avatar and banner, name and summary.
"""
@spec upsert_actor(map, boolean) :: {:ok, Actor.t()} | {:error, Ecto.Changeset.t()}
def upsert_actor(%{keys: keys, name: name, summary: summary} = data, preload \\ false) do
def upsert_actor(
%{keys: keys, name: name, summary: summary, avatar: avatar, banner: banner} = data,
preload \\ false
) do
insert =
data
|> Actor.remote_actor_creation_changeset()
|> Repo.insert(
on_conflict: [set: [keys: keys, name: name, summary: summary]],
on_conflict: [
set: [
keys: keys,
name: name,
summary: summary,
avatar: transform_media_file(avatar),
banner: transform_media_file(banner)
]
],
conflict_target: [:url]
)
@@ -232,6 +243,18 @@ defmodule Mobilizon.Actors do
end
end
defp transform_media_file(nil), do: nil
defp transform_media_file(file) do
file = for({key, val} <- file, into: %{}, do: {String.to_atom(key), val})
if is_nil(file) do
nil
else
struct(Mobilizon.Media.File, file)
end
end
def delete_actor(%Actor{} = actor) do
Workers.Background.enqueue("delete_actor", %{"actor_id" => actor.id})
end