Refactor Mobilizon.Federation.ActivityPub and add typespecs
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
60
lib/federation/activity_pub/actions/announce.ex
Normal file
60
lib/federation/activity_pub/actions/announce.ex
Normal file
@@ -0,0 +1,60 @@
|
||||
defmodule Mobilizon.Federation.ActivityPub.Actions.Announce do
|
||||
@moduledoc """
|
||||
Announce things
|
||||
"""
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Federation.ActivityPub.Activity
|
||||
alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor
|
||||
alias Mobilizon.Federation.ActivityStream
|
||||
alias Mobilizon.Share
|
||||
|
||||
import Mobilizon.Federation.ActivityPub.Utils,
|
||||
only: [
|
||||
create_activity: 2,
|
||||
maybe_federate: 1,
|
||||
make_announce_data: 3,
|
||||
make_announce_data: 4,
|
||||
make_unannounce_data: 3
|
||||
]
|
||||
|
||||
@doc """
|
||||
Announce (reshare) an activity to the world, using an activity of type `Announce`.
|
||||
"""
|
||||
@spec announce(Actor.t(), ActivityStream.t(), String.t() | nil, boolean, boolean) ::
|
||||
{:ok, Activity.t(), ActivityStream.t()} | {:error, any()}
|
||||
def announce(
|
||||
%Actor{} = actor,
|
||||
object,
|
||||
activity_id \\ nil,
|
||||
local \\ true,
|
||||
public \\ true
|
||||
) do
|
||||
with {:ok, %Actor{id: object_owner_actor_id}} <-
|
||||
ActivityPubActor.get_or_fetch_actor_by_url(object["actor"]),
|
||||
{:ok, %Share{} = _share} <- Share.create(object["id"], actor.id, object_owner_actor_id) do
|
||||
announce_data = make_announce_data(actor, object, activity_id, public)
|
||||
{:ok, activity} = create_activity(announce_data, local)
|
||||
:ok = maybe_federate(activity)
|
||||
{:ok, activity, object}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Cancel the announcement of an activity to the world, using an activity of type `Undo` an `Announce`.
|
||||
"""
|
||||
@spec unannounce(Actor.t(), ActivityStream.t(), String.t() | nil, String.t() | nil, boolean) ::
|
||||
{:ok, Activity.t(), ActivityStream.t()}
|
||||
def unannounce(
|
||||
%Actor{} = actor,
|
||||
object,
|
||||
activity_id \\ nil,
|
||||
cancelled_activity_id \\ nil,
|
||||
local \\ true
|
||||
) do
|
||||
announce_activity = make_announce_data(actor, object, cancelled_activity_id)
|
||||
unannounce_data = make_unannounce_data(actor, announce_activity, activity_id)
|
||||
{:ok, unannounce_activity} = create_activity(unannounce_data, local)
|
||||
maybe_federate(unannounce_activity)
|
||||
{:ok, unannounce_activity, object}
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user