Preload bookmarks wherever the object is preloaded

This commit is contained in:
rinpatch 2019-05-04 12:46:42 +03:00 committed by William Pitcock
parent 06947c9147
commit f841eb7cdb
3 changed files with 45 additions and 3 deletions

View File

@ -6,6 +6,7 @@ defmodule Pleroma.Activity do
use Ecto.Schema use Ecto.Schema
alias Pleroma.Activity alias Pleroma.Activity
alias Pleroma.Bookmark
alias Pleroma.Notification alias Pleroma.Notification
alias Pleroma.Object alias Pleroma.Object
alias Pleroma.Repo alias Pleroma.Repo
@ -36,6 +37,7 @@ defmodule Pleroma.Activity do
field(:actor, :string) field(:actor, :string)
field(:recipients, {:array, :string}, default: []) field(:recipients, {:array, :string}, default: [])
has_many(:notifications, Notification, on_delete: :delete_all) has_many(:notifications, Notification, on_delete: :delete_all)
has_many(:bookmarks, Bookmark, on_delete: :delete_all)
# Attention: this is a fake relation, don't try to preload it blindly and expect it to work! # Attention: this is a fake relation, don't try to preload it blindly and expect it to work!
# The foreign key is embedded in a jsonb field. # The foreign key is embedded in a jsonb field.
@ -71,6 +73,7 @@ def with_preloaded_object(query) do
) )
) )
|> preload([activity, object], object: object) |> preload([activity, object], object: object)
|> preload(:bookmarks)
end end
def get_by_ap_id(ap_id) do def get_by_ap_id(ap_id) do
@ -102,7 +105,8 @@ def get_by_ap_id_with_object(ap_id) do
activity.data, activity.data,
activity.data activity.data
), ),
preload: [object: o] preload: [object: o],
preload: :bookmarks
) )
) )
end end
@ -122,7 +126,8 @@ def get_by_id_with_object(id) do
activity.data, activity.data,
activity.data activity.data
), ),
preload: [object: o] preload: [object: o],
preload: :bookmarks
) )
|> Repo.one() |> Repo.one()
end end
@ -200,7 +205,8 @@ def create_by_object_ap_id_with_object(ap_id) when is_binary(ap_id) do
activity.data, activity.data,
activity.data activity.data
), ),
preload: [object: o] preload: [object: o],
preload: :bookmarks
) )
end end

View File

@ -137,6 +137,13 @@ def insert(map, local \\ true, fake \\ false) when is_map(map) do
activity activity
end end
activity =
if activity.data["type"] in ["Create", "Announce"] do
Repo.preload(activity, :bookmarks)
else
activity
end
Task.start(fn -> Task.start(fn ->
Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity) Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
end) end)

View File

@ -5,6 +5,8 @@
defmodule Pleroma.ActivityTest do defmodule Pleroma.ActivityTest do
use Pleroma.DataCase use Pleroma.DataCase
alias Pleroma.Activity alias Pleroma.Activity
alias Pleroma.Bookmark
alias Pleroma.Object
import Pleroma.Factory import Pleroma.Factory
test "returns an activity by it's AP id" do test "returns an activity by it's AP id" do
@ -28,4 +30,31 @@ test "returns the activity that created an object" do
assert activity == found_activity assert activity == found_activity
end end
test "preloading object preloads bookmarks" do
user1 = insert(:user)
user2 = insert(:user)
activity = insert(:note_activity)
{:ok, bookmark1} = Bookmark.create(user1.id, activity.id)
{:ok, bookmark2} = Bookmark.create(user2.id, activity.id)
bookmarks = Enum.sort([bookmark1, bookmark2])
queried_activity =
Ecto.Query.from(a in Activity, where: a.id == ^activity.id)
|> Activity.with_preloaded_object()
|> Repo.one()
assert Enum.sort(queried_activity.bookmarks) == bookmarks
queried_activity = Activity.get_by_ap_id_with_object(activity.data["id"])
assert Enum.sort(queried_activity.bookmarks) == bookmarks
queried_activity = Activity.get_by_id_with_object(activity.id)
assert Enum.sort(queried_activity.bookmarks) == bookmarks
queried_activity =
Activity.get_create_by_object_ap_id_with_object(Object.normalize(activity).data["id"])
assert Enum.sort(queried_activity.bookmarks) == bookmarks
end
end end