61 lines
2.1 KiB
Elixir
61 lines
2.1 KiB
Elixir
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
|