I’m trying to nail down why this query:
sprints = WasteWalk.Sprints.Sprint
|> Ash.Query.filter(expr(exists(members, user_id == ^socket.assigns.current_user.id)))
|> Ash.Query.filter(team_id == team.id)
|> Ash.read!(actor: socket.assigns.current_user)
Works fine as-is, but fails miserably when I try to turn it into a resource query using the Ash DSL:
sprints = Sprints.get_by_team_id!(team.id, actor: socket.assigns.current_user)
Somehow, I’ve messed up the policies in such a way that the SAT solver gets confused:
[debug] ** (Ash.Error.Forbidden)
Bread Crumbs:
> Error returned from: WasteWalk.Sprints.Sprint.get_by_team_id
Forbidden Error
* forbidden:
WasteWalk.Sprints.Sprint.get_by_team_id
No policy conditions applied to this request.
I don’t understand why the Ash.Query works fine, but the DSL equivalent is failing; they are using the same policies, etc., so…???
The get_by_team_id is defined on the domain as:
# WasteWalk.Sprints
resources do
resource WasteWalk.Sprints.Sprint
define :get_by_team_id, action: :get_by_team_id, args: [:team_id]
...
And on the Sprint itself:
# Sprint
read :get_by_team_id do
argument :team_id, :uuid do
allow_nil? false
end
filter expr(team_id == ^arg(:team_id))
prepare build(sort: [start_date: :desc])
pagination offset?: true, keyset?: true, required?: false
end
The error, “No policy conditions applied to this request,” isn’t making any sense to me. There’s a policy that seems like it should apply (it applies in the Ash.Query… which correctly returns only sprints the user belongs to):
# Sprint
policy action(:read) do
# tried both, just in case; no change in behavior:
# authorize_if relates_to_actor_via(:sprint_members)
authorize_if expr(exists(members, user_id == ^actor(:id)))
end
I’m not seeing where my DSL implementation is off, compared to the Ash.Query that works fine.






















