Refactor query to return only 1 message instead of 20
This commit is contained in:
parent
76999c73a7
commit
24073f829f
|
@ -65,22 +65,13 @@ def for_user(user, params \\ %{}) do
|
||||||
|
|
||||||
def for_user_with_last_activity_id(user, params \\ %{}) do
|
def for_user_with_last_activity_id(user, params \\ %{}) do
|
||||||
for_user(user, params)
|
for_user(user, params)
|
||||||
|> Repo.preload(:conversation)
|
|
||||||
|> Enum.map(fn participation ->
|
|> Enum.map(fn participation ->
|
||||||
# TODO: Don't load all those activities, just get the most recent
|
activity_id =
|
||||||
# Involves splitting up the query.
|
ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{
|
||||||
activities =
|
|
||||||
ActivityPub.fetch_activities_for_context(participation.conversation.ap_id, %{
|
|
||||||
"user" => user,
|
"user" => user,
|
||||||
"blocking_user" => user
|
"blocking_user" => user
|
||||||
})
|
})
|
||||||
|
|
||||||
activity_id =
|
|
||||||
case activities do
|
|
||||||
[activity | _] -> activity.id
|
|
||||||
_ -> nil
|
|
||||||
end
|
|
||||||
|
|
||||||
%{
|
%{
|
||||||
participation
|
participation
|
||||||
| last_activity_id: activity_id
|
| last_activity_id: activity_id
|
||||||
|
|
|
@ -459,35 +459,44 @@ def flag(
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_activities_for_context(context, opts \\ %{}) do
|
defp fetch_activities_for_context_query(context, opts) do
|
||||||
public = ["https://www.w3.org/ns/activitystreams#Public"]
|
public = ["https://www.w3.org/ns/activitystreams#Public"]
|
||||||
|
|
||||||
recipients =
|
recipients =
|
||||||
if opts["user"], do: [opts["user"].ap_id | opts["user"].following] ++ public, else: public
|
if opts["user"], do: [opts["user"].ap_id | opts["user"].following] ++ public, else: public
|
||||||
|
|
||||||
query = from(activity in Activity)
|
from(activity in Activity)
|
||||||
|
|
||||||
query =
|
|
||||||
query
|
|
||||||
|> restrict_blocked(opts)
|
|> restrict_blocked(opts)
|
||||||
|> restrict_recipients(recipients, opts["user"])
|
|> restrict_recipients(recipients, opts["user"])
|
||||||
|
|> where(
|
||||||
query =
|
[activity],
|
||||||
from(
|
|
||||||
activity in query,
|
|
||||||
where:
|
|
||||||
fragment(
|
fragment(
|
||||||
"?->>'type' = ? and ?->>'context' = ?",
|
"?->>'type' = ? and ?->>'context' = ?",
|
||||||
activity.data,
|
activity.data,
|
||||||
"Create",
|
"Create",
|
||||||
activity.data,
|
activity.data,
|
||||||
^context
|
^context
|
||||||
),
|
|
||||||
order_by: [desc: :id]
|
|
||||||
)
|
)
|
||||||
|> Activity.with_preloaded_object()
|
)
|
||||||
|
|> order_by([activity], desc: activity.id)
|
||||||
|
end
|
||||||
|
|
||||||
Repo.all(query)
|
@spec fetch_activities_for_context(String.t(), keyword() | map()) :: [Activity.t()]
|
||||||
|
def fetch_activities_for_context(context, opts \\ %{}) do
|
||||||
|
context
|
||||||
|
|> fetch_activities_for_context_query(opts)
|
||||||
|
|> Activity.with_preloaded_object()
|
||||||
|
|> Repo.all()
|
||||||
|
end
|
||||||
|
|
||||||
|
@spec fetch_latest_activity_id_for_context(String.t(), keyword() | map()) ::
|
||||||
|
Pleroma.FlakeId.t() | nil
|
||||||
|
def fetch_latest_activity_id_for_context(context, opts \\ %{}) do
|
||||||
|
context
|
||||||
|
|> fetch_activities_for_context_query(opts)
|
||||||
|
|> limit(1)
|
||||||
|
|> select([a], a.id)
|
||||||
|
|> Repo.one()
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_public_activities(opts \\ %{}) do
|
def fetch_public_activities(opts \\ %{}) do
|
||||||
|
|
Loading…
Reference in New Issue