X-Git-Url: https://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Factivity.ex;h=c121e800f6c206ca3bfd989282965d42ffd30029;hb=8caea9be729827095d14bcb87ab6b5d5c15f4935;hp=7845c264a22a1255d634fea1510b055775d5fe51;hpb=f841eb7cdb83afc444dfe260581b6be6e690a717;p=akkoma diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 7845c264a..c121e800f 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Activity do alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo + alias Pleroma.User import Ecto.Changeset import Ecto.Query @@ -36,8 +37,9 @@ defmodule Pleroma.Activity do field(:local, :boolean, default: true) field(:actor, :string) field(:recipients, {:array, :string}, default: []) + # This is a fake relation, do not use outside of with_preloaded_bookmark/get_bookmark + has_one(:bookmark, Bookmark) 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! # The foreign key is embedded in a jsonb field. @@ -73,9 +75,18 @@ defmodule Pleroma.Activity do ) ) |> preload([activity, object], object: object) - |> preload(:bookmarks) end + def with_preloaded_bookmark(query, %User{} = user) do + from([a] in query, + left_join: b in Bookmark, + on: b.user_id == ^user.id and b.activity_id == a.id, + preload: [bookmark: b] + ) + end + + def with_preloaded_bookmark(query, _), do: query + def get_by_ap_id(ap_id) do Repo.one( from( @@ -85,6 +96,16 @@ defmodule Pleroma.Activity do ) end + def get_bookmark(%Activity{} = activity, %User{} = user) do + if Ecto.assoc_loaded?(activity.bookmark) do + activity.bookmark + else + Bookmark.get(user.id, activity.id) + end + end + + def get_bookmark(_, _), do: nil + def change(struct, params \\ %{}) do struct |> cast(params, [:data]) @@ -105,8 +126,7 @@ defmodule Pleroma.Activity do activity.data, activity.data ), - preload: [object: o], - preload: :bookmarks + preload: [object: o] ) ) end @@ -126,8 +146,7 @@ defmodule Pleroma.Activity do activity.data, activity.data ), - preload: [object: o], - preload: :bookmarks + preload: [object: o] ) |> Repo.one() end @@ -205,8 +224,7 @@ defmodule Pleroma.Activity do activity.data, activity.data ), - preload: [object: o], - preload: :bookmarks + preload: [object: o] ) end @@ -269,6 +287,29 @@ defmodule Pleroma.Activity do |> Repo.all() end + def follow_requests_for_actor(%Pleroma.User{ap_id: ap_id}) do + from( + a in Activity, + where: + fragment( + "? ->> 'type' = 'Follow'", + a.data + ), + where: + fragment( + "? ->> 'state' = 'pending'", + a.data + ), + where: + fragment( + "coalesce((?)->'object'->>'id', (?)->>'object') = ?", + a.data, + a.data, + ^ap_id + ) + ) + end + @spec query_by_actor(actor()) :: Ecto.Query.t() def query_by_actor(actor) do from(a in Activity, where: a.actor == ^actor)