From dc4f1c20e40cdf69b8d9f2a6215bf7ef1bef2939 Mon Sep 17 00:00:00 2001 From: ken-kost Date: Tue, 19 May 2026 14:43:27 +0200 Subject: [PATCH 1/3] Expand page metadata with limit, offset and more? --- lib/ash_json_api/serializer.ex | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/ash_json_api/serializer.ex b/lib/ash_json_api/serializer.ex index 3ed32c9..dc89a0f 100644 --- a/lib/ash_json_api/serializer.ex +++ b/lib/ash_json_api/serializer.ex @@ -63,17 +63,25 @@ 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) + |> maybe_add(:more?, page.more?) - Map.merge(meta, page_meta) + Map.merge(meta, %{page: page_meta}) end # This is added because some tests on `Test.Acceptance.IndexTest` fail From 643912d7d8eed38336a7ea9719fae92981a9cac5 Mon Sep 17 00:00:00 2001 From: ken-kost Date: Tue, 19 May 2026 14:43:39 +0200 Subject: [PATCH 2/3] Expand tests --- test/acceptance/index_pagination_test.exs | 16 +++++++++++++++- .../fetching_data/pagination/keyset_test.exs | 2 +- .../fetching_data/pagination/offset_test.exs | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/test/acceptance/index_pagination_test.exs b/test/acceptance/index_pagination_test.exs index 2cc0a8d..ce16dea 100644 --- a/test/acceptance/index_pagination_test.exs +++ b/test/acceptance/index_pagination_test.exs @@ -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 diff --git a/test/spec_compliance/fetching_data/pagination/keyset_test.exs b/test/spec_compliance/fetching_data/pagination/keyset_test.exs index 72440a4..a5b5889 100644 --- a/test/spec_compliance/fetching_data/pagination/keyset_test.exs +++ b/test/spec_compliance/fetching_data/pagination/keyset_test.exs @@ -552,7 +552,7 @@ defmodule AshJsonApiTest.FetchingData.Pagination.Keyset do 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 diff --git a/test/spec_compliance/fetching_data/pagination/offset_test.exs b/test/spec_compliance/fetching_data/pagination/offset_test.exs index 6063d42..177fe82 100644 --- a/test/spec_compliance/fetching_data/pagination/offset_test.exs +++ b/test/spec_compliance/fetching_data/pagination/offset_test.exs @@ -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 From 496c56dcd8d459eac05eefb2c79c3b94de713427 Mon Sep 17 00:00:00 2001 From: ken-kost Date: Tue, 19 May 2026 17:07:45 +0200 Subject: [PATCH 3/3] Don't add more? to page metadata --- lib/ash_json_api/serializer.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ash_json_api/serializer.ex b/lib/ash_json_api/serializer.ex index dc89a0f..fd9d3a4 100644 --- a/lib/ash_json_api/serializer.ex +++ b/lib/ash_json_api/serializer.ex @@ -79,7 +79,6 @@ defmodule AshJsonApi.Serializer do %{} |> maybe_add(:total, page.count) |> maybe_add(:limit, page.limit) - |> maybe_add(:more?, page.more?) Map.merge(meta, %{page: page_meta}) end