From f1d27a5fbbe547a78f835bd65b43a652004d708e Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 9 Nov 2017 10:41:19 +0100 Subject: [PATCH] Add actor column to activities. --- lib/pleroma/activity.ex | 1 + lib/pleroma/web/activity_pub/activity_pub.ex | 8 +++---- .../20171109091239_add_actor_to_activity.exs | 24 +++++++++++++++++++ test/support/factory.ex | 3 ++- test/web/activity_pub/activity_pub_test.exs | 1 + 5 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 priv/repo/migrations/20171109091239_add_actor_to_activity.exs diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index f43b32b56..a35ccc9b4 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Activity do schema "activities" do field :data, :map field :local, :boolean, default: true + field :actor, :string has_many :notifications, Notification timestamps() diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index e7d4c48bd..1624c6545 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -9,7 +9,7 @@ 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, activity} = Repo.insert(%Activity{data: map, local: local}) + {:ok, activity} = Repo.insert(%Activity{data: map, local: local, actor: map["actor"]}) Notification.create_notifications(activity) {:ok, activity} else @@ -137,7 +137,7 @@ defp restrict_max(query, _), do: query defp restrict_actor(query, %{"actor_id" => actor_id}) do from activity in query, - where: fragment("?->>'actor' = ?", activity.data, ^actor_id) + where: activity.actor == ^actor_id end defp restrict_actor(query, _), do: query @@ -168,14 +168,14 @@ defp restrict_recent(query, _) do defp restrict_blocked(query, %{"blocking_user" => %User{info: info}}) do blocks = info["blocks"] || [] from activity in query, - where: fragment("not (?->>'actor' = ANY(?))", activity.data, ^blocks) + where: fragment("not (? = ANY(?))", activity.actor, ^blocks) end defp restrict_blocked(query, _), do: query def fetch_activities(recipients, opts \\ %{}) do base_query = from activity in Activity, limit: 20, - order_by: [desc: :id] + order_by: [fragment("? desc nulls last", activity.id)] base_query |> restrict_recipients(recipients) diff --git a/priv/repo/migrations/20171109091239_add_actor_to_activity.exs b/priv/repo/migrations/20171109091239_add_actor_to_activity.exs new file mode 100644 index 000000000..bac53972c --- /dev/null +++ b/priv/repo/migrations/20171109091239_add_actor_to_activity.exs @@ -0,0 +1,24 @@ +defmodule Pleroma.Repo.Migrations.AddActorToActivity do + use Ecto.Migration + + @disable_ddl_transaction true + + def up do + alter table(:activities) do + add :actor, :string + end + + execute """ + update activities set actor = data->>'actor'; + """ + + create index(:activities, [:actor, "id DESC NULLS LAST"], concurrently: true) + end + + def down do + drop index(:activities, [:actor, "id DESC NULLS LAST"]) + alter table(:activities) do + remove :actor + end + end +end diff --git a/test/support/factory.ex b/test/support/factory.ex index dabb95141..9bbf11f08 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -51,7 +51,8 @@ def note_activity_factory do } %Pleroma.Activity{ - data: data + data: data, + actor: data["actor"] } end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 2cd33d623..f50509b63 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -52,6 +52,7 @@ test "adds an id to a given object if it lacks one and inserts it to the object test "removes doubled 'to' recipients" do {:ok, activity} = ActivityPub.create(["user1", "user1", "user2"], %User{ap_id: "1"}, "", %{}) assert activity.data["to"] == ["user1", "user2"] + assert activity.actor == "1" end end