fi: fetch_count/4 use the query after applying before_action hooks (#922)

---------

Co-authored-by: Zach Daniel <zachary.s.daniel@gmail.com>
This commit is contained in:
Tun Cham Roeun 2024-03-13 07:28:52 +07:00 committed by GitHub
parent b75327445c
commit 7d7bcaa3d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 2 deletions

View file

@ -314,7 +314,6 @@ defmodule Ash.Actions.Read do
pre_authorization_query <- query, pre_authorization_query <- query,
{:ok, query} <- authorize_query(query, opts), {:ok, query} <- authorize_query(query, opts),
query_before_pagination <- query, query_before_pagination <- query,
{:ok, query} <- paginate(query, action, opts[:page], opts[:skip_pagination?]),
query <- query <-
Ash.Actions.Read.Calculations.deselect_known_forbidden_fields( Ash.Actions.Read.Calculations.deselect_known_forbidden_fields(
query, query,
@ -376,6 +375,7 @@ defmodule Ash.Actions.Read do
), ),
query <- Map.put(query, :filter, filter), query <- Map.put(query, :filter, filter),
query <- Ash.Query.unset(query, :calculations), query <- Ash.Query.unset(query, :calculations),
{%{valid?: true} = query, before_notifications} <- run_before_action(query),
{:ok, count} <- {:ok, count} <-
fetch_count( fetch_count(
query, query,
@ -383,7 +383,7 @@ defmodule Ash.Actions.Read do
relationship_path_filters, relationship_path_filters,
opts opts
), ),
{%{valid?: true} = query, before_notifications} <- run_before_action(query), {:ok, query} <- paginate(query, action, opts[:page], opts[:skip_pagination?]),
{:ok, data_layer_query} <- {:ok, data_layer_query} <-
Ash.Query.data_layer_query(query, data_layer_calculations: data_layer_calculations), Ash.Query.data_layer_query(query, data_layer_calculations: data_layer_calculations),
{:ok, results} <- {:ok, results} <-

View file

@ -61,6 +61,11 @@ defmodule Ash.Actions.PaginationTest do
pagination keyset?: true, countable: true pagination keyset?: true, countable: true
end end
read :keyset_before_action do
prepare(before_action(&Ash.Query.filter(&1, name in ["0", "1", "2"])))
pagination keyset?: true, countable: true
end
read :optional_keyset do read :optional_keyset do
pagination keyset?: true, countable: true, required?: false pagination keyset?: true, countable: true, required?: false
end end
@ -483,6 +488,17 @@ defmodule Ash.Actions.PaginationTest do
Api.read!(User, action: :keyset, page: [count: true, limit: 1, after: keyset]) Api.read!(User, action: :keyset, page: [count: true, limit: 1, after: keyset])
end end
test "can get the full count when asking for records after a specific keyset use the query after applying `before_action` hooks" do
%{results: [%{__metadata__: %{keyset: keyset}}], count: 3} =
Api.read!(User, action: :keyset_before_action, page: [count: true, limit: 1])
assert %{count: 3} =
Api.read!(User,
action: :keyset_before_action,
page: [count: true, limit: 1, after: keyset]
)
end
test "an invalid keyset returns an appropriate error" do test "an invalid keyset returns an appropriate error" do
assert_raise(Ash.Error.Invalid, ~r/Invalid value provided as a keyset/, fn -> assert_raise(Ash.Error.Invalid, ~r/Invalid value provided as a keyset/, fn ->
Api.read!(User, action: :keyset, page: [limit: 1, after: "~"]) Api.read!(User, action: :keyset, page: [limit: 1, after: "~"])