Merge branch 'features/mastoapi/2.6.0-min_id-pagination' into 'develop'
Features: mastoapi-2.6.0 `min_id` pagination Closes #351 See merge request pleroma/pleroma!976
This commit is contained in:
commit
0a09692c7d
|
@ -36,6 +36,12 @@ defp cast_params(params) do
|
||||||
limit: :integer
|
limit: :integer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
params =
|
||||||
|
Enum.reduce(params, %{}, fn
|
||||||
|
{key, _value}, acc when is_atom(key) -> Map.drop(acc, [key])
|
||||||
|
{key, value}, acc -> Map.put(acc, key, value)
|
||||||
|
end)
|
||||||
|
|
||||||
changeset = cast({%{}, param_types}, params, Map.keys(param_types))
|
changeset = cast({%{}, param_types}, params, Map.keys(param_types))
|
||||||
changeset.changes
|
changeset.changes
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|
||||||
alias Pleroma.Instances
|
alias Pleroma.Instances
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.Pagination
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.Upload
|
alias Pleroma.Upload
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
@ -493,7 +494,7 @@ def fetch_public_activities(opts \\ %{}) do
|
||||||
|
|
||||||
q
|
q
|
||||||
|> restrict_unlisted()
|
|> restrict_unlisted()
|
||||||
|> Repo.all()
|
|> Pagination.fetch_paginated(opts)
|
||||||
|> Enum.reverse()
|
|> Enum.reverse()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -636,26 +637,12 @@ defp restrict_recipients(query, recipients, user) do
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp restrict_limit(query, %{"limit" => limit}) do
|
|
||||||
from(activity in query, limit: ^limit)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp restrict_limit(query, _), do: query
|
|
||||||
|
|
||||||
defp restrict_local(query, %{"local_only" => true}) do
|
defp restrict_local(query, %{"local_only" => true}) do
|
||||||
from(activity in query, where: activity.local == true)
|
from(activity in query, where: activity.local == true)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp restrict_local(query, _), do: query
|
defp restrict_local(query, _), do: query
|
||||||
|
|
||||||
defp restrict_max(query, %{"max_id" => ""}), do: query
|
|
||||||
|
|
||||||
defp restrict_max(query, %{"max_id" => max_id}) do
|
|
||||||
from(activity in query, where: activity.id < ^max_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp restrict_max(query, _), do: query
|
|
||||||
|
|
||||||
defp restrict_actor(query, %{"actor_id" => actor_id}) do
|
defp restrict_actor(query, %{"actor_id" => actor_id}) do
|
||||||
from(activity in query, where: activity.actor == ^actor_id)
|
from(activity in query, where: activity.actor == ^actor_id)
|
||||||
end
|
end
|
||||||
|
@ -776,12 +763,7 @@ defp maybe_preload_objects(query, _) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_activities_query(recipients, opts \\ %{}) do
|
def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
base_query =
|
base_query = from(activity in Activity)
|
||||||
from(
|
|
||||||
activity in Activity,
|
|
||||||
limit: 20,
|
|
||||||
order_by: [fragment("? desc nulls last", activity.id)]
|
|
||||||
)
|
|
||||||
|
|
||||||
base_query
|
base_query
|
||||||
|> maybe_preload_objects(opts)
|
|> maybe_preload_objects(opts)
|
||||||
|
@ -791,8 +773,6 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
|> restrict_tag_all(opts)
|
|> restrict_tag_all(opts)
|
||||||
|> restrict_since(opts)
|
|> restrict_since(opts)
|
||||||
|> restrict_local(opts)
|
|> restrict_local(opts)
|
||||||
|> restrict_limit(opts)
|
|
||||||
|> restrict_max(opts)
|
|
||||||
|> restrict_actor(opts)
|
|> restrict_actor(opts)
|
||||||
|> restrict_type(opts)
|
|> restrict_type(opts)
|
||||||
|> restrict_favorited_by(opts)
|
|> restrict_favorited_by(opts)
|
||||||
|
@ -808,14 +788,14 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
|
|
||||||
def fetch_activities(recipients, opts \\ %{}) do
|
def fetch_activities(recipients, opts \\ %{}) do
|
||||||
fetch_activities_query(recipients, opts)
|
fetch_activities_query(recipients, opts)
|
||||||
|> Repo.all()
|
|> Pagination.fetch_paginated(opts)
|
||||||
|> Enum.reverse()
|
|> Enum.reverse()
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_activities_bounded(recipients_to, recipients_cc, opts \\ %{}) do
|
def fetch_activities_bounded(recipients_to, recipients_cc, opts \\ %{}) do
|
||||||
fetch_activities_query([], opts)
|
fetch_activities_query([], opts)
|
||||||
|> restrict_to_cc(recipients_to, recipients_cc)
|
|> restrict_to_cc(recipients_to, recipients_cc)
|
||||||
|> Repo.all()
|
|> Pagination.fetch_paginated(opts)
|
||||||
|> Enum.reverse()
|
|> Enum.reverse()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
alias Pleroma.Filter
|
alias Pleroma.Filter
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.Pagination
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.ScheduledActivity
|
alias Pleroma.ScheduledActivity
|
||||||
alias Pleroma.Stats
|
alias Pleroma.Stats
|
||||||
|
@ -202,15 +203,29 @@ def custom_emojis(conn, _params) do
|
||||||
defp add_link_headers(conn, method, activities, param \\ nil, params \\ %{}) do
|
defp add_link_headers(conn, method, activities, param \\ nil, params \\ %{}) do
|
||||||
params =
|
params =
|
||||||
conn.params
|
conn.params
|
||||||
|> Map.drop(["since_id", "max_id"])
|
|> Map.drop(["since_id", "max_id", "min_id"])
|
||||||
|> Map.merge(params)
|
|> Map.merge(params)
|
||||||
|
|
||||||
last = List.last(activities)
|
last = List.last(activities)
|
||||||
first = List.first(activities)
|
|
||||||
|
|
||||||
if last do
|
if last do
|
||||||
min = last.id
|
max_id = last.id
|
||||||
max = first.id
|
|
||||||
|
limit =
|
||||||
|
params
|
||||||
|
|> Map.get("limit", "20")
|
||||||
|
|> String.to_integer()
|
||||||
|
|
||||||
|
min_id =
|
||||||
|
if length(activities) <= limit do
|
||||||
|
activities
|
||||||
|
|> List.first()
|
||||||
|
|> Map.get(:id)
|
||||||
|
else
|
||||||
|
activities
|
||||||
|
|> Enum.at(limit * -1)
|
||||||
|
|> Map.get(:id)
|
||||||
|
end
|
||||||
|
|
||||||
{next_url, prev_url} =
|
{next_url, prev_url} =
|
||||||
if param do
|
if param do
|
||||||
|
@ -219,13 +234,13 @@ defp add_link_headers(conn, method, activities, param \\ nil, params \\ %{}) do
|
||||||
Pleroma.Web.Endpoint,
|
Pleroma.Web.Endpoint,
|
||||||
method,
|
method,
|
||||||
param,
|
param,
|
||||||
Map.merge(params, %{max_id: min})
|
Map.merge(params, %{max_id: max_id})
|
||||||
),
|
),
|
||||||
mastodon_api_url(
|
mastodon_api_url(
|
||||||
Pleroma.Web.Endpoint,
|
Pleroma.Web.Endpoint,
|
||||||
method,
|
method,
|
||||||
param,
|
param,
|
||||||
Map.merge(params, %{since_id: max})
|
Map.merge(params, %{min_id: min_id})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -233,12 +248,12 @@ defp add_link_headers(conn, method, activities, param \\ nil, params \\ %{}) do
|
||||||
mastodon_api_url(
|
mastodon_api_url(
|
||||||
Pleroma.Web.Endpoint,
|
Pleroma.Web.Endpoint,
|
||||||
method,
|
method,
|
||||||
Map.merge(params, %{max_id: min})
|
Map.merge(params, %{max_id: max_id})
|
||||||
),
|
),
|
||||||
mastodon_api_url(
|
mastodon_api_url(
|
||||||
Pleroma.Web.Endpoint,
|
Pleroma.Web.Endpoint,
|
||||||
method,
|
method,
|
||||||
Map.merge(params, %{since_id: max})
|
Map.merge(params, %{min_id: min_id})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -314,7 +329,7 @@ def dm_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
activities =
|
activities =
|
||||||
[user.ap_id]
|
[user.ap_id]
|
||||||
|> ActivityPub.fetch_activities_query(params)
|
|> ActivityPub.fetch_activities_query(params)
|
||||||
|> Repo.all()
|
|> Pagination.fetch_paginated(params)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> add_link_headers(:dm_timeline, activities)
|
|> add_link_headers(:dm_timeline, activities)
|
||||||
|
|
|
@ -1473,7 +1473,7 @@ test "getting followers, pagination", %{conn: conn} do
|
||||||
assert id2 == follower2.id
|
assert id2 == follower2.id
|
||||||
|
|
||||||
assert [link_header] = get_resp_header(res_conn, "link")
|
assert [link_header] = get_resp_header(res_conn, "link")
|
||||||
assert link_header =~ ~r/since_id=#{follower2.id}/
|
assert link_header =~ ~r/min_id=#{follower2.id}/
|
||||||
assert link_header =~ ~r/max_id=#{follower2.id}/
|
assert link_header =~ ~r/max_id=#{follower2.id}/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1552,7 +1552,7 @@ test "getting following, pagination", %{conn: conn} do
|
||||||
assert id2 == following2.id
|
assert id2 == following2.id
|
||||||
|
|
||||||
assert [link_header] = get_resp_header(res_conn, "link")
|
assert [link_header] = get_resp_header(res_conn, "link")
|
||||||
assert link_header =~ ~r/since_id=#{following2.id}/
|
assert link_header =~ ~r/min_id=#{following2.id}/
|
||||||
assert link_header =~ ~r/max_id=#{following2.id}/
|
assert link_header =~ ~r/max_id=#{following2.id}/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -2382,7 +2382,7 @@ test "preserves parameters in link headers", %{conn: conn} do
|
||||||
|
|
||||||
assert [link_header] = get_resp_header(conn, "link")
|
assert [link_header] = get_resp_header(conn, "link")
|
||||||
assert link_header =~ ~r/media_only=true/
|
assert link_header =~ ~r/media_only=true/
|
||||||
assert link_header =~ ~r/since_id=#{notification2.id}/
|
assert link_header =~ ~r/min_id=#{notification2.id}/
|
||||||
assert link_header =~ ~r/max_id=#{notification1.id}/
|
assert link_header =~ ~r/max_id=#{notification1.id}/
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue