mirror of
https://akkoma.dev/AkkomaGang/akkoma.git
synced 2024-11-17 22:54:40 +00:00
Applied relationships preloading to GET /api/v1/accounts/relationships. Refactoring (User.binary_id/1).
This commit is contained in:
parent
8f1d622b8d
commit
be5e2c4dbb
6 changed files with 30 additions and 23 deletions
|
@ -129,21 +129,18 @@ defmodule Pleroma.Conversation.Participation do
|
||||||
end
|
end
|
||||||
|
|
||||||
def restrict_recipients(query, user, %{"recipients" => user_ids}) do
|
def restrict_recipients(query, user, %{"recipients" => user_ids}) do
|
||||||
user_ids =
|
user_binary_ids =
|
||||||
[user.id | user_ids]
|
[user.id | user_ids]
|
||||||
|> Enum.uniq()
|
|> Enum.uniq()
|
||||||
|> Enum.reduce([], fn user_id, acc ->
|
|> User.binary_id()
|
||||||
{:ok, user_id} = FlakeId.Ecto.CompatType.dump(user_id)
|
|
||||||
[user_id | acc]
|
|
||||||
end)
|
|
||||||
|
|
||||||
conversation_subquery =
|
conversation_subquery =
|
||||||
__MODULE__
|
__MODULE__
|
||||||
|> group_by([p], p.conversation_id)
|
|> group_by([p], p.conversation_id)
|
||||||
|> having(
|
|> having(
|
||||||
[p],
|
[p],
|
||||||
count(p.user_id) == ^length(user_ids) and
|
count(p.user_id) == ^length(user_binary_ids) and
|
||||||
fragment("array_agg(?) @> ?", p.user_id, ^user_ids)
|
fragment("array_agg(?) @> ?", p.user_id, ^user_binary_ids)
|
||||||
)
|
)
|
||||||
|> select([p], %{id: p.conversation_id})
|
|> select([p], %{id: p.conversation_id})
|
||||||
|
|
||||||
|
|
|
@ -135,12 +135,8 @@ defmodule Pleroma.FollowingRelationship do
|
||||||
target_users
|
target_users
|
||||||
)
|
)
|
||||||
when is_list(source_users) and is_list(target_users) do
|
when is_list(source_users) and is_list(target_users) do
|
||||||
get_bin_ids = fn user ->
|
source_user_ids = User.binary_id(source_users)
|
||||||
with {:ok, bin_id} <- CompatType.dump(user.id), do: bin_id
|
target_user_ids = User.binary_id(target_users)
|
||||||
end
|
|
||||||
|
|
||||||
source_user_ids = Enum.map(source_users, &get_bin_ids.(&1))
|
|
||||||
target_user_ids = Enum.map(target_users, &get_bin_ids.(&1))
|
|
||||||
|
|
||||||
__MODULE__
|
__MODULE__
|
||||||
|> where(
|
|> where(
|
||||||
|
|
|
@ -24,10 +24,10 @@ defmodule Pleroma.ThreadMute do
|
||||||
end
|
end
|
||||||
|
|
||||||
def query(user_id, context) do
|
def query(user_id, context) do
|
||||||
{:ok, user_id} = FlakeId.Ecto.CompatType.dump(user_id)
|
user_binary_id = User.binary_id(user_id)
|
||||||
|
|
||||||
ThreadMute
|
ThreadMute
|
||||||
|> Ecto.Query.where(user_id: ^user_id)
|
|> Ecto.Query.where(user_id: ^user_binary_id)
|
||||||
|> Ecto.Query.where(context: ^context)
|
|> Ecto.Query.where(context: ^context)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -218,6 +218,21 @@ defmodule Pleroma.User do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc "Dumps id to SQL-compatible format"
|
||||||
|
def binary_id(source_id) when is_binary(source_id) do
|
||||||
|
with {:ok, dumped_id} <- FlakeId.Ecto.CompatType.dump(source_id) do
|
||||||
|
dumped_id
|
||||||
|
else
|
||||||
|
_ -> source_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def binary_id(source_ids) when is_list(source_ids) do
|
||||||
|
Enum.map(source_ids, &binary_id/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def binary_id(%User{} = user), do: binary_id(user.id)
|
||||||
|
|
||||||
@doc "Returns status account"
|
@doc "Returns status account"
|
||||||
@spec account_status(User.t()) :: account_status()
|
@spec account_status(User.t()) :: account_status()
|
||||||
def account_status(%User{deactivated: true}), do: :deactivated
|
def account_status(%User{deactivated: true}), do: :deactivated
|
||||||
|
|
|
@ -8,7 +8,6 @@ defmodule Pleroma.UserRelationship do
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
alias FlakeId.Ecto.CompatType
|
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.UserRelationship
|
alias Pleroma.UserRelationship
|
||||||
|
@ -84,12 +83,8 @@ defmodule Pleroma.UserRelationship do
|
||||||
target_to_source_rel_types \\ nil
|
target_to_source_rel_types \\ nil
|
||||||
)
|
)
|
||||||
when is_list(source_users) and is_list(target_users) do
|
when is_list(source_users) and is_list(target_users) do
|
||||||
get_bin_ids = fn user ->
|
source_user_ids = User.binary_id(source_users)
|
||||||
with {:ok, bin_id} <- CompatType.dump(user.id), do: bin_id
|
target_user_ids = User.binary_id(target_users)
|
||||||
end
|
|
||||||
|
|
||||||
source_user_ids = Enum.map(source_users, &get_bin_ids.(&1))
|
|
||||||
target_user_ids = Enum.map(target_users, &get_bin_ids.(&1))
|
|
||||||
|
|
||||||
get_rel_type_codes = fn rel_type -> user_relationship_mappings()[rel_type] end
|
get_rel_type_codes = fn rel_type -> user_relationship_mappings()[rel_type] end
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
alias Pleroma.UserRelationship
|
alias Pleroma.UserRelationship
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
alias Pleroma.Web.MastodonAPI.AccountView
|
alias Pleroma.Web.MastodonAPI.AccountView
|
||||||
|
alias Pleroma.Web.MastodonAPI.StatusView
|
||||||
alias Pleroma.Web.MediaProxy
|
alias Pleroma.Web.MediaProxy
|
||||||
|
|
||||||
defp find_following_rel(following_relationships, follower, following) do
|
defp find_following_rel(following_relationships, follower, following) do
|
||||||
|
@ -129,7 +130,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("relationships.json", %{user: user, targets: targets}) do
|
def render("relationships.json", %{user: user, targets: targets}) do
|
||||||
render_many(targets, AccountView, "relationship.json", user: user, as: :target)
|
relationships_opts = StatusView.relationships_opts(user, targets)
|
||||||
|
opts = %{as: :target, user: user, relationships: relationships_opts}
|
||||||
|
|
||||||
|
render_many(targets, AccountView, "relationship.json", opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp do_render("show.json", %{user: user} = opts) do
|
defp do_render("show.json", %{user: user} = opts) do
|
||||||
|
|
Loading…
Reference in a new issue