fix: handle join relationship in different api

This commit is contained in:
Zach Daniel 2023-04-25 00:25:09 -06:00
parent 97daeeb8fb
commit 8821736227

View file

@ -892,7 +892,7 @@ defmodule Ash.Actions.ManagedRelationships do
relationship, relationship,
join_keys, join_keys,
input, input,
api(changeset, relationship), changeset.api,
opts, opts,
found, found,
current_value, current_value,
@ -991,7 +991,7 @@ defmodule Ash.Actions.ManagedRelationships do
) )
|> Ash.Changeset.set_context(join_relationship.context) |> Ash.Changeset.set_context(join_relationship.context)
|> Ash.Changeset.set_tenant(changeset.tenant) |> Ash.Changeset.set_tenant(changeset.tenant)
|> api.create(return_notifications?: true) |> join_api(relationship, api).create(return_notifications?: true)
|> case do |> case do
{:ok, _created, notifications} -> {:ok, _created, notifications} ->
case key do case key do
@ -1051,7 +1051,7 @@ defmodule Ash.Actions.ManagedRelationships do
) )
|> Ash.Changeset.set_context(relationship.context) |> Ash.Changeset.set_context(relationship.context)
|> Ash.Changeset.set_tenant(changeset.tenant) |> Ash.Changeset.set_tenant(changeset.tenant)
|> api.update(return_notifications?: true) |> api(changeset, relationship).update(return_notifications?: true)
|> case do |> case do
{:ok, updated, notifications} -> {:ok, updated, notifications} ->
{:ok, [updated | current_value], notifications, [updated]} {:ok, [updated | current_value], notifications, [updated]}
@ -1193,7 +1193,9 @@ defmodule Ash.Actions.ManagedRelationships do
) )
|> Ash.Changeset.set_context(join_relationship.context) |> Ash.Changeset.set_context(join_relationship.context)
|> Ash.Changeset.set_tenant(changeset.tenant) |> Ash.Changeset.set_tenant(changeset.tenant)
|> api(changeset, relationship).create(return_notifications?: true) |> join_api(relationship, api(changeset, relationship)).create(
return_notifications?: true
)
|> case do |> case do
{:ok, _join_row, notifications} -> {:ok, _join_row, notifications} ->
{:ok, [created | current_value], regular_notifications ++ notifications, {:ok, [created | current_value], regular_notifications ++ notifications,
@ -1362,7 +1364,7 @@ defmodule Ash.Actions.ManagedRelationships do
|> Ash.Query.set_context(join_relationship.context) |> Ash.Query.set_context(join_relationship.context)
|> Ash.Query.limit(1) |> Ash.Query.limit(1)
|> Ash.Query.set_tenant(changeset.tenant) |> Ash.Query.set_tenant(changeset.tenant)
|> api(changeset, relationship).read_one( |> join_api(relationship, api).read_one(
authorize?: opts[:authorize?], authorize?: opts[:authorize?],
actor: actor actor: actor
) )
@ -1391,7 +1393,7 @@ defmodule Ash.Actions.ManagedRelationships do
) )
|> Ash.Changeset.set_context(join_relationship.context) |> Ash.Changeset.set_context(join_relationship.context)
|> Ash.Changeset.set_tenant(changeset.tenant) |> Ash.Changeset.set_tenant(changeset.tenant)
|> api.update(return_notifications?: true) |> join_api(relationship, api).update(return_notifications?: true)
# credo:disable-for-next-line Credo.Check.Refactor.Nesting # credo:disable-for-next-line Credo.Check.Refactor.Nesting
|> case do |> case do
{:ok, _updated_join, join_update_notifications} -> {:ok, _updated_join, join_update_notifications} ->
@ -1532,7 +1534,7 @@ defmodule Ash.Actions.ManagedRelationships do
|> Ash.Query.set_context(join_relationship.context) |> Ash.Query.set_context(join_relationship.context)
|> Ash.Query.do_filter(relationship.filter) |> Ash.Query.do_filter(relationship.filter)
|> Ash.Query.sort(relationship.sort, prepend?: true) |> Ash.Query.sort(relationship.sort, prepend?: true)
|> api.read_one( |> join_api(relationship, api).read_one(
authorize?: opts[:authorize?], authorize?: opts[:authorize?],
actor: actor actor: actor
) )
@ -1554,7 +1556,7 @@ defmodule Ash.Actions.ManagedRelationships do
) )
|> Ash.Changeset.set_context(join_relationship.context) |> Ash.Changeset.set_context(join_relationship.context)
|> Ash.Changeset.set_tenant(changeset.tenant) |> Ash.Changeset.set_tenant(changeset.tenant)
|> api.destroy(return_notifications?: true) |> join_api(relationship, api).destroy(return_notifications?: true)
|> case do |> case do
{:ok, join_notifications} -> {:ok, join_notifications} ->
notifications = join_notifications ++ all_notifications notifications = join_notifications ++ all_notifications
@ -1672,7 +1674,7 @@ defmodule Ash.Actions.ManagedRelationships do
|> Ash.Query.limit(1) |> Ash.Query.limit(1)
|> Ash.Query.set_tenant(tenant) |> Ash.Query.set_tenant(tenant)
|> Ash.Query.set_context(join_relationship.context) |> Ash.Query.set_context(join_relationship.context)
|> api.read_one(authorize?: opts[:authorize?], actor: actor) |> join_api(relationship, api).read_one(authorize?: opts[:authorize?], actor: actor)
|> case do |> case do
{:ok, result} -> {:ok, result} ->
result result
@ -1683,7 +1685,7 @@ defmodule Ash.Actions.ManagedRelationships do
|> Ash.Changeset.for_destroy(action_name, %{}, actor: actor, authorize?: opts[:authorize?]) |> Ash.Changeset.for_destroy(action_name, %{}, actor: actor, authorize?: opts[:authorize?])
|> Ash.Changeset.set_context(join_relationship.context) |> Ash.Changeset.set_context(join_relationship.context)
|> Ash.Changeset.set_tenant(tenant) |> Ash.Changeset.set_tenant(tenant)
|> api.destroy(return_notifications?: true) |> join_api(relationship, api).destroy(return_notifications?: true)
|> case do |> case do
{:ok, notifications} -> {:ok, notifications} ->
{:ok, notifications} {:ok, notifications}
@ -1776,7 +1778,7 @@ defmodule Ash.Actions.ManagedRelationships do
) )
|> Ash.Query.limit(1) |> Ash.Query.limit(1)
|> Ash.Query.set_tenant(tenant) |> Ash.Query.set_tenant(tenant)
|> api.read_one(authorize?: opts[:authorize?], actor: actor) |> join_api(relationship, api).read_one(authorize?: opts[:authorize?], actor: actor)
|> case do |> case do
{:ok, result} -> {:ok, result} ->
result result
@ -1787,7 +1789,7 @@ defmodule Ash.Actions.ManagedRelationships do
|> Ash.Changeset.for_destroy(action_name, %{}, actor: actor, authorize?: opts[:authorize?]) |> Ash.Changeset.for_destroy(action_name, %{}, actor: actor, authorize?: opts[:authorize?])
|> Ash.Changeset.set_context(join_relationship.context) |> Ash.Changeset.set_context(join_relationship.context)
|> Ash.Changeset.set_tenant(tenant) |> Ash.Changeset.set_tenant(tenant)
|> api.destroy(return_notifications?: true) |> join_api(relationship, api).destroy(return_notifications?: true)
|> case do |> case do
{:ok, notifications} -> {:ok, notifications} ->
{:ok, notifications} {:ok, notifications}
@ -1828,4 +1830,19 @@ defmodule Ash.Actions.ManagedRelationships do
|> Ash.Changeset.set_tenant(tenant) |> Ash.Changeset.set_tenant(tenant)
|> api.destroy(return_notifications?: true) |> api.destroy(return_notifications?: true)
end end
defp join_api(relationship, api) do
join_relationship =
Ash.Resource.Info.relationship(relationship.source, relationship.join_relationship)
if join_relationship.api do
join_relationship.api
else
if relationship.api && Ash.Api.Info.resource(api, relationship.through) do
relationship.api
else
api
end
end
end
end end