Skip to content

Commit faa9cfc

Browse files
authored
fix: use default_limit instead of max_page_size when first/last/limit not provided (#408)
1 parent 8979afd commit faa9cfc

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

lib/graphql/resolver.ex

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,14 +1219,17 @@ defmodule AshGraphql.Graphql.Resolver do
12191219
end
12201220
end
12211221

1222-
defp validate_offset_opts(opts, :offset, %{max_page_size: max_page_size}) do
1222+
defp validate_offset_opts(opts, :offset, %{
1223+
max_page_size: max_page_size,
1224+
default_limit: default_limit
1225+
}) do
12231226
limit =
12241227
case opts |> Keyword.take([:limit]) |> Enum.into(%{}) do
12251228
%{limit: limit} ->
12261229
min(limit, max_page_size)
12271230

12281231
_ ->
1229-
max_page_size
1232+
default_limit || max_page_size
12301233
end
12311234

12321235
{:ok, Keyword.put(opts, :limit, limit)}
@@ -1236,7 +1239,10 @@ defmodule AshGraphql.Graphql.Resolver do
12361239
{:ok, opts}
12371240
end
12381241

1239-
defp validate_keyset_opts(opts, strategy, %{max_page_size: max_page_size})
1242+
defp validate_keyset_opts(opts, strategy, %{
1243+
max_page_size: max_page_size,
1244+
default_limit: default_limit
1245+
})
12401246
when strategy in [:keyset, :relay] do
12411247
case opts |> Keyword.take([:first, :last, :after, :before]) |> Enum.into(%{}) do
12421248
%{first: _first, last: _last} ->
@@ -1276,7 +1282,7 @@ defmodule AshGraphql.Graphql.Resolver do
12761282
}}
12771283

12781284
_ ->
1279-
{:ok, Keyword.put(opts, :limit, max_page_size)}
1285+
{:ok, Keyword.put(opts, :limit, default_limit || max_page_size)}
12801286
end
12811287
end
12821288

test/paginate_test.exs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,33 @@ defmodule AshGraphql.PaginateTest do
7272
assert is_binary(end_keyset)
7373
end
7474

75+
test "default_limit is used instead of max_page_size when first/last not provided" do
76+
doc = """
77+
query KeysetPaginatedPostsWithDefaultLimit {
78+
keysetPaginatedPostsWithDefaultLimit(sort: [{field: TEXT, order: ASC_NULLS_LAST}]) {
79+
count
80+
results{
81+
text
82+
}
83+
}
84+
}
85+
"""
86+
87+
assert {:ok,
88+
%{
89+
data: %{
90+
"keysetPaginatedPostsWithDefaultLimit" => %{
91+
"count" => 5,
92+
"results" => results
93+
}
94+
}
95+
}} = Absinthe.run(doc, AshGraphql.Test.Schema)
96+
97+
# default_limit is 2, max_page_size is 5
98+
# Without first/last, should use default_limit (2), not max_page_size (5)
99+
assert length(results) == 2
100+
end
101+
75102
test "works if action has both offset and keyset pagination" do
76103
doc = """
77104
query OtherKeysetPaginatedPosts {

test/support/resources/post.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ defmodule AshGraphql.Test.Post do
206206
list :paginated_posts, :paginated
207207
list :keyset_paginated_posts, :keyset_paginated
208208
list :other_keyset_paginated_posts, :keyset_and_offset_paginated, paginate_with: :keyset
209+
list :keyset_paginated_posts_with_default_limit, :keyset_paginated_with_default_limit
209210
list :paginated_posts_without_limit, :paginated_without_limit
210211
list :paginated_posts_limit_not_required, :paginated_limit_not_required
211212
list :read_post_with_invalid_arguments_names, :read_with_invalid_arguments_names
@@ -420,6 +421,16 @@ defmodule AshGraphql.Test.Post do
420421
)
421422
end
422423

424+
read :keyset_paginated_with_default_limit do
425+
pagination(
426+
required?: true,
427+
keyset?: true,
428+
countable: true,
429+
default_limit: 2,
430+
max_page_size: 5
431+
)
432+
end
433+
423434
read :keyset_and_offset_paginated do
424435
pagination(
425436
required?: true,

0 commit comments

Comments
 (0)