Different policy on `Ash.Query` vs. DSL not making sense (why does Query work, DSL fail?)

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.

I think you’re looking for action_type(:read)?

1 Like

This is the hint to look at the conditions of the policy not the contents.

1 Like

Thank you. :melting_face: