alias Ecto.{Changeset, UUID}
import Ecto.Query
+ def make_json_ld_header do
+ %{
+ "@context" => [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ %{
+ "manuallyApprovesFollowers" => "as:manuallyApprovesFollowers",
+ "sensitive" => "as:sensitive",
+ "Hashtag" => "as:Hashtag",
+ "ostatus" => "http://ostatus.org#",
+ "atomUri" => "ostatus:atomUri",
+ "inReplyToAtomUri" => "ostatus:inReplyToAtomUri",
+ "conversation" => "ostatus:conversation",
+ "toot" => "http://joinmastodon.org/ns#",
+ "Emoji" => "toot:Emoji"
+ }
+ ]
+ }
+ end
+
def make_date do
DateTime.utc_now() |> DateTime.to_iso8601
end
Enqueues an activity for federation if it's local
"""
def maybe_federate(%Activity{local: true} = activity) do
- Pleroma.Web.Federator.enqueue(:publish, activity)
+ priority = case activity.data["type"] do
+ "Delete" -> 10
+ "Create" -> 1
+ _ -> 5
+ end
+ Pleroma.Web.Federator.enqueue(:publish, activity, priority)
:ok
end
def maybe_federate(_), do: :ok
@doc """
Inserts a full object if it is contained in an activity.
"""
- def insert_full_object(%{"object" => object_data}) when is_map(object_data) do
- with {:ok, object} <- Object.create(object_data) do
+ def insert_full_object(%{"object" => %{"type" => type} = object_data}) when is_map(object_data) and type in ["Note"] do
+ with {:ok, _} <- Object.create(object_data) do
:ok
end
end
@doc """
Returns an existing like if a user already liked an object
"""
- def get_existing_like(actor, %{data: %{"id" => id}} = object) do
+ def get_existing_like(actor, %{data: %{"id" => id}}) do
query = from activity in Activity,
- where: fragment("? @> ?", activity.data, ^%{actor: actor, object: id, type: "Like"})
+ where: fragment("(?)->>'actor' = ?", activity.data, ^actor),
+ # this is to use the index
+ where: fragment("coalesce((?)->'object'->>'id', (?)->>'object') = ?", activity.data, activity.data, ^id),
+ where: fragment("(?)->>'type' = 'Like'", activity.data)
+
Repo.one(query)
end
"actor" => ap_id,
"object" => id,
"to" => [actor.follower_address, object.data["actor"]],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Public"],
"context" => object.data["context"]
}
"type" => "Follow",
"actor" => follower_id,
"to" => [followed_id],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Public"],
"object" => followed_id
}
query = from activity in Activity,
where: fragment("? @> ?", activity.data, ^%{type: "Follow", actor: follower_id,
object: followed_id}),
- order_by: [desc: :inserted_at],
+ order_by: [desc: :id],
limit: 1
Repo.one(query)
end
"actor" => ap_id,
"object" => id,
"to" => [user.follower_address, object.data["actor"]],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Public"],
"context" => object.data["context"]
}
def make_create_data(params, additional) do
published = params.published || make_date()
-
- activity = %{
+ %{
"type" => "Create",
"to" => params.to |> Enum.uniq,
"actor" => params.actor.ap_id,