Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions lib/ash_json_api/serializer.ex
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,24 @@ defmodule AshJsonApi.Serializer do
Enum.map(data, &serialize_one_record(request, &1))
end

# Adds page level metadata, like total count of records
defp add_page_metadata(meta, %struct{} = page)
when struct in [Ash.Page.Offset, Ash.Page.Keyset] do
# Adds page level metadata: total count, limit, and offset/more?
defp add_page_metadata(meta, %Ash.Page.Offset{} = page) do
page_meta =
if page.count do
%{page: %{total: page.count}}
else
%{page: %{}}
end
%{}
|> maybe_add(:total, page.count)
|> maybe_add(:limit, page.limit)
|> maybe_add(:offset, page.offset)

Map.merge(meta, %{page: page_meta})
end

defp add_page_metadata(meta, %Ash.Page.Keyset{} = page) do
page_meta =
%{}
|> maybe_add(:total, page.count)
|> maybe_add(:limit, page.limit)

Map.merge(meta, page_meta)
Map.merge(meta, %{page: page_meta})
end

# This is added because some tests on `Test.Acceptance.IndexTest` fail
Expand Down
16 changes: 15 additions & 1 deletion test/acceptance/index_pagination_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,26 @@ defmodule Test.Acceptance.IndexPaginationTest do
response =
Domain
|> get("/posts?page[offset]=5&page[limit]=10", status: 200)
|> assert_meta_equals(%{"baz" => "baz", "page" => %{}})
|> assert_meta_equals(%{
"baz" => "baz",
"page" => %{"limit" => 10, "offset" => 5}
})

data = response.resp_body["data"]
assert length(data) == 5
end

test "meta.page includes total, limit, and offset when count is requested" do
response =
Domain
|> get("/posts?page[count]=true&page[limit]=2", status: 200)

page_meta = response.resp_body["meta"]["page"]
assert page_meta["total"] == 10
assert page_meta["limit"] == 2
assert page_meta["offset"] == 0
end

@tag capture_log: true
test "returns 400 when page parameter is not using bracket notation" do
# Clients must use page[limit]=10 format, not page={"limit":10} or similar
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,7 @@
[posts: posts, page_size: 5]
end

test "collection total is included when specified" do

Check failure on line 536 in test/spec_compliance/fetching_data/pagination/keyset_test.exs

View workflow job for this annotation

GitHub Actions / ash-ci / mix test

test [Keyset] Pagination meta collection total is included when specified (AshJsonApiTest.FetchingData.Pagination.Keyset)
page_size = 5

encoded_query_params =
Expand All @@ -552,7 +552,7 @@

assert %{"meta" => meta} = conn.resp_body

assert meta == %{"page" => %{"total" => 15}}
assert meta == %{"page" => %{"total" => 15, "limit" => 5, "more?" => true}}
end

test "collection total is not present when count is false" do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ defmodule AshJsonApiTest.FetchingData.Pagination.Offset do

assert %{"meta" => meta} = conn.resp_body

assert meta == %{"page" => %{"total" => 15}}
assert meta == %{"page" => %{"total" => 15, "limit" => 5, "offset" => 0}}
end

test "collection total is not present when count is false" do
Expand Down
Loading