diff --git a/lib/ash_json_api/serializer.ex b/lib/ash_json_api/serializer.ex index 3ed32c9..fd9d3a4 100644 --- a/lib/ash_json_api/serializer.ex +++ b/lib/ash_json_api/serializer.ex @@ -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 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