From 81673b81366ee1779802a9fec7f5119e664cd8ce Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Wed, 29 Aug 2018 08:37:36 +0000 Subject: [PATCH] activity: add recipients_to and recipients_cc fields --- lib/pleroma/activity.ex | 2 ++ lib/pleroma/web/activity_pub/activity_pub.ex | 21 ++++++++++++++----- ...ipients_to_and_cc_fields_to_activities.exs | 13 ++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 priv/repo/migrations/20180829082446_add_recipients_to_and_cc_fields_to_activities.exs diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index bed96861f..4f1f8292d 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -8,6 +8,8 @@ defmodule Pleroma.Activity do field(:local, :boolean, default: true) field(:actor, :string) field(:recipients, {:array, :string}) + field(:recipients_to, {:array, :string}) + field(:recipients_cc, {:array, :string}) has_many(:notifications, Notification, on_delete: :delete_all) timestamps() diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 68b398786..fdbd7fed0 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -14,8 +14,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do # For Announce activities, we filter the recipients based on following status for any actors # that match actual users. See issue #164 for more information about why this is necessary. - def get_recipients(%{"type" => "Announce"} = data) do - recipients = (data["to"] || []) ++ (data["cc"] || []) + defp get_recipients(%{"type" => "Announce"} = data) do + to = data["to"] || [] + cc = data["cc"] || [] + recipients = to ++ cc actor = User.get_cached_by_ap_id(data["actor"]) recipients @@ -28,10 +30,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do User.following?(user, actor) end end) + + {recipients, to, cc} end - def get_recipients(data) do - (data["to"] || []) ++ (data["cc"] || []) + defp get_recipients(data) do + to = data["to"] || [] + cc = data["cc"] || [] + recipients = to ++ cc + {recipients, to, cc} end defp check_actor_is_active(actor) do @@ -53,12 +60,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do :ok <- check_actor_is_active(map["actor"]), {:ok, map} <- MRF.filter(map), :ok <- insert_full_object(map) do + {recipients, recipients_to, recipients_cc} = get_recipients(map) + {:ok, activity} = Repo.insert(%Activity{ data: map, local: local, actor: map["actor"], - recipients: get_recipients(map) + recipients: recipients, + recipients_to: recipients_to, + recipients_cc: recipients_cc }) Notification.create_notifications(activity) diff --git a/priv/repo/migrations/20180829082446_add_recipients_to_and_cc_fields_to_activities.exs b/priv/repo/migrations/20180829082446_add_recipients_to_and_cc_fields_to_activities.exs new file mode 100644 index 000000000..96af412f0 --- /dev/null +++ b/priv/repo/migrations/20180829082446_add_recipients_to_and_cc_fields_to_activities.exs @@ -0,0 +1,13 @@ +defmodule Pleroma.Repo.Migrations.AddRecipientsToAndCcFieldsToActivities do + use Ecto.Migration + + def change do + alter table(:activities) do + add :recipients_to, {:array, :string} + add :recipients_cc, {:array, :string} + end + + create index(:activities, [:recipients_to], using: :gin) + create index(:activities, [:recipients_cc], using: :gin) + end +end