Return total items count from pagination + tests See merge request pleroma/pleroma!1620tags/v1.1.4
@@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). | |||||
- Mastodon API: Unsubscribe followers when they unfollow a user | - Mastodon API: Unsubscribe followers when they unfollow a user | ||||
- AdminAPI: Add "godmode" while fetching user statuses (i.e. admin can see private statuses) | - AdminAPI: Add "godmode" while fetching user statuses (i.e. admin can see private statuses) | ||||
- Improve digest email template | - Improve digest email template | ||||
– Pagination: (optional) return `total` alongside with `items` when paginating | |||||
### Fixed | ### Fixed | ||||
- Following from Osada | - Following from Osada | ||||
@@ -16,6 +16,15 @@ defmodule Pleroma.Pagination do | |||||
def fetch_paginated(query, params, type \\ :keyset) | def fetch_paginated(query, params, type \\ :keyset) | ||||
def fetch_paginated(query, %{"total" => true} = params, :keyset) do | |||||
total = Repo.aggregate(query, :count, :id) | |||||
%{ | |||||
total: total, | |||||
items: fetch_paginated(query, Map.drop(params, ["total"]), :keyset) | |||||
} | |||||
end | |||||
def fetch_paginated(query, params, :keyset) do | def fetch_paginated(query, params, :keyset) do | ||||
options = cast_params(params) | options = cast_params(params) | ||||
@@ -25,6 +34,15 @@ defmodule Pleroma.Pagination do | |||||
|> enforce_order(options) | |> enforce_order(options) | ||||
end | end | ||||
def fetch_paginated(query, %{"total" => true} = params, :offset) do | |||||
total = Repo.aggregate(query, :count, :id) | |||||
%{ | |||||
total: total, | |||||
items: fetch_paginated(query, Map.drop(params, ["total"]), :offset) | |||||
} | |||||
end | |||||
def fetch_paginated(query, params, :offset) do | def fetch_paginated(query, params, :offset) do | ||||
options = cast_params(params) | options = cast_params(params) | ||||
@@ -0,0 +1,78 @@ | |||||
# Pleroma: A lightweight social networking server | |||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||||
# SPDX-License-Identifier: AGPL-3.0-only | |||||
defmodule Pleroma.PaginationTest do | |||||
use Pleroma.DataCase | |||||
import Pleroma.Factory | |||||
alias Pleroma.Object | |||||
alias Pleroma.Pagination | |||||
describe "keyset" do | |||||
setup do | |||||
notes = insert_list(5, :note) | |||||
%{notes: notes} | |||||
end | |||||
test "paginates by min_id", %{notes: notes} do | |||||
id = Enum.at(notes, 2).id |> Integer.to_string() | |||||
%{total: total, items: paginated} = | |||||
Pagination.fetch_paginated(Object, %{"min_id" => id, "total" => true}) | |||||
assert length(paginated) == 2 | |||||
assert total == 5 | |||||
end | |||||
test "paginates by since_id", %{notes: notes} do | |||||
id = Enum.at(notes, 2).id |> Integer.to_string() | |||||
%{total: total, items: paginated} = | |||||
Pagination.fetch_paginated(Object, %{"since_id" => id, "total" => true}) | |||||
assert length(paginated) == 2 | |||||
assert total == 5 | |||||
end | |||||
test "paginates by max_id", %{notes: notes} do | |||||
id = Enum.at(notes, 1).id |> Integer.to_string() | |||||
%{total: total, items: paginated} = | |||||
Pagination.fetch_paginated(Object, %{"max_id" => id, "total" => true}) | |||||
assert length(paginated) == 1 | |||||
assert total == 5 | |||||
end | |||||
test "paginates by min_id & limit", %{notes: notes} do | |||||
id = Enum.at(notes, 2).id |> Integer.to_string() | |||||
paginated = Pagination.fetch_paginated(Object, %{"min_id" => id, "limit" => 1}) | |||||
assert length(paginated) == 1 | |||||
end | |||||
end | |||||
describe "offset" do | |||||
setup do | |||||
notes = insert_list(5, :note) | |||||
%{notes: notes} | |||||
end | |||||
test "paginates by limit" do | |||||
paginated = Pagination.fetch_paginated(Object, %{"limit" => 2}, :offset) | |||||
assert length(paginated) == 2 | |||||
end | |||||
test "paginates by limit & offset" do | |||||
paginated = Pagination.fetch_paginated(Object, %{"limit" => 2, "offset" => 4}, :offset) | |||||
assert length(paginated) == 1 | |||||
end | |||||
end | |||||
end |