@httpoison Application.get_env(:pleroma, :httpoison)
+ @instance Application.get_env(:pleroma, :instance)
+ @rewrite_policy Keyword.get(@instance, :rewrite_policy)
+
def get_recipients(data) do
(data["to"] || []) ++ (data["cc"] || [])
end
def insert(map, local \\ true) when is_map(map) do
with nil <- Activity.get_by_ap_id(map["id"]),
map <- lazy_put_activity_defaults(map),
- :ok <- insert_full_object(map) do
+ :ok <- insert_full_object(map),
+ {:ok, map} <- @rewrite_policy.filter(map) do
{:ok, activity} =
Repo.insert(%Activity{
data: map,
additional
),
{:ok, activity} <- insert(create_data, local),
- :ok <- maybe_federate(activity) do
+ :ok <- maybe_federate(activity),
+ {:ok, actor} <- User.increase_note_count(actor) do
{:ok, activity}
end
end
end
end
- def unannounce(%User{} = actor, %Object{} = object, local \\ true) do
+ def unannounce(
+ %User{} = actor,
+ %Object{} = object,
+ local \\ true,
+ activity_id \\ nil
+ ) do
with %Activity{} = activity <- get_existing_announce(actor.ap_id, object),
- unannounce_data <- make_unannounce_data(actor, activity),
+ unannounce_data <- make_unannounce_data(actor, activity, activity_id),
{:ok, unannounce_activity} <- insert(unannounce_data, local),
:ok <- maybe_federate(activity),
{:ok, _activity} <- Repo.delete(activity),
with Repo.delete(object),
Repo.delete_all(Activity.all_non_create_by_object_ap_id_q(id)),
{:ok, activity} <- insert(data, local),
- :ok <- maybe_federate(activity) do
+ :ok <- maybe_federate(activity),
+ {:ok, actor} <- User.decrease_note_count(user) do
{:ok, activity}
end
end
def update_element_in_object(property, element, object) do
with new_data <-
- object.data |> Map.put("#{property}_count", length(element))
+ object.data
+ |> Map.put("#{property}_count", length(element))
|> Map.put("#{property}s", element),
changeset <- Changeset.change(object, data: new_data),
{:ok, object} <- Repo.update(changeset),
"""
def make_unannounce_data(
%User{ap_id: ap_id} = user,
- %Activity{data: %{"id" => id, "context" => context}} = activity
+ %Activity{data: %{"context" => context}} = activity,
+ activity_id
) do
- %{
+ data = %{
"type" => "Undo",
"actor" => ap_id,
- "object" => id,
+ "object" => activity.data,
"to" => [user.follower_address, activity.data["actor"]],
"cc" => ["https://www.w3.org/ns/activitystreams#Public"],
"context" => context
}
+
+ if activity_id, do: Map.put(data, "id", activity_id), else: data
end
def add_announce_to_object(%Activity{data: %{"actor" => actor}}, object) do
describe "create activities" do
test "removes doubled 'to' recipients" do
+ user = insert(:user)
+
{:ok, activity} =
ActivityPub.create(%{
to: ["user1", "user1", "user2"],
- actor: %User{ap_id: "1"},
+ actor: user,
context: "",
object: %{}
})
assert activity.data["to"] == ["user1", "user2"]
- assert activity.actor == "1"
+ assert activity.actor == user.ap_id
assert activity.recipients == ["user1", "user2"]
end
end
user = insert(:user)
# Unannouncing an object that is not announced does nothing
- #{:ok, object} = ActivityPub.unannounce(user, object)
- #assert object.data["announcement_count"] == 0
+ # {:ok, object} = ActivityPub.unannounce(user, object)
+ # assert object.data["announcement_count"] == 0
{:ok, announce_activity, object} = ActivityPub.announce(user, object)
assert object.data["announcement_count"] == 1
User.ap_followers(user),
announce_activity.data["actor"]
]
-
++
assert unannounce_activity.data["type"] == "Undo"
- assert unannounce_activity.data["object"] == announce_activity.data["id"]
+ assert unannounce_activity.data["object"] == announce_activity.data
assert unannounce_activity.data["actor"] == user.ap_id
assert unannounce_activity.data["context"] == announce_activity.data["context"]