diff --git a/lib/federation/activity_pub/actor.ex b/lib/federation/activity_pub/actor.ex index 0cc3b589f..e5e12393b 100644 --- a/lib/federation/activity_pub/actor.ex +++ b/lib/federation/activity_pub/actor.ex @@ -76,14 +76,19 @@ defmodule Mobilizon.Federation.ActivityPub.Actor do @doc """ Find an actor in our local database or call WebFinger to find what's its AP ID is and then fetch it """ - @spec find_or_make_actor_from_nickname(String.t(), atom() | nil) :: tuple() + @spec find_or_make_actor_from_nickname(String.t(), atom() | nil) :: + {:ok, Actor.t()} | {:error, any()} def find_or_make_actor_from_nickname(nickname, type \\ nil) do - case Actors.get_actor_by_name(nickname, type) do - %Actor{} = actor -> - {:ok, actor} + case Actors.get_actor_by_name_with_preload(nickname, type) do + %Actor{url: actor_url} = actor -> + if Actors.needs_update?(actor) do + make_actor_from_url(actor_url, true) + else + {:ok, actor} + end nil -> - make_actor_from_nickname(nickname) + make_actor_from_nickname(nickname, true) end end @@ -94,10 +99,10 @@ defmodule Mobilizon.Federation.ActivityPub.Actor do Create an actor inside our database from username, using WebFinger to find out its AP ID and then fetch it """ @spec make_actor_from_nickname(String.t()) :: {:ok, %Actor{}} | {:error, any()} - def make_actor_from_nickname(nickname) do + def make_actor_from_nickname(nickname, preload \\ false) do case WebFinger.finger(nickname) do {:ok, url} when is_binary(url) -> - make_actor_from_url(url) + make_actor_from_url(url, preload) _e -> {:error, "No ActivityPub URL found in WebFinger"} diff --git a/lib/web/cache/activity_pub.ex b/lib/web/cache/activity_pub.ex index f32cf598f..d31b8cc2e 100644 --- a/lib/web/cache/activity_pub.ex +++ b/lib/web/cache/activity_pub.ex @@ -4,10 +4,11 @@ defmodule Mobilizon.Web.Cache.ActivityPub do """ alias Mobilizon.{Actors, Discussions, Events, Posts, Resources, Todos, Tombstone} - alias Mobilizon.Actors.{Actor, Member} + alias Mobilizon.Actors.Actor, as: ActorModel + alias Mobilizon.Actors.Member alias Mobilizon.Discussions.{Comment, Discussion} alias Mobilizon.Events.Event - alias Mobilizon.Federation.ActivityPub.Relay + alias Mobilizon.Federation.ActivityPub.{Actor, Relay} alias Mobilizon.Posts.Post alias Mobilizon.Resources.Resource alias Mobilizon.Todos.{Todo, TodoList} @@ -23,8 +24,8 @@ defmodule Mobilizon.Web.Cache.ActivityPub do {:commit, Actor.t()} | {:ignore, nil} def get_actor_by_name(name) do Cachex.fetch(@cache, "actor_" <> name, fn "actor_" <> name -> - case Actors.get_actor_by_name_with_preload(name) do - %Actor{} = actor -> + case Actor.find_or_make_actor_from_nickname(name) do + {:ok, %ActorModel{} = actor} -> {:commit, actor} nil -> @@ -41,7 +42,7 @@ defmodule Mobilizon.Web.Cache.ActivityPub do def get_local_actor_by_name(name) do Cachex.fetch(@cache, "local_actor_" <> name, fn "local_actor_" <> name -> case Actors.get_local_actor_by_name(name) do - %Actor{} = actor -> + %ActorModel{} = actor -> {:commit, actor} nil ->