@@ -458,6 +458,7 @@ defmodule AshJsonApi.Controllers.Helpers do
458458 def add_to_relationship ( request , relationship_name ) do
459459 chain ( request , fn % { assigns: % { result: result } } ->
460460 action = Ash.Resource.Info . primary_action! ( request . resource , :update ) . name
461+ relationship = Ash.Resource.Info . relationship ( request . resource , relationship_name )
461462 values = relationship_change_values ( request , relationship_name )
462463
463464 result
@@ -469,24 +470,15 @@ defmodule AshJsonApi.Controllers.Helpers do
469470 |> Ash . update ( Request . opts ( request ) )
470471 |> case do
471472 { :ok , updated } ->
472- identifier_meta =
473- case request . resource_identifiers do
474- list when is_list ( list ) ->
475- Enum . reduce ( list , % { } , fn
476- { % { id: id } , meta } , acc when is_map ( meta ) ->
477- Map . put ( acc , id , meta )
478-
479- _ , acc ->
480- acc
481- end )
482-
483- _ ->
484- % { }
485- end
473+ case load_result_for_relationship_meta ( updated , relationship , request ) do
474+ { :ok , updated_with_join_rows } ->
475+ request
476+ |> Request . assign ( :result , Map . get ( updated_with_join_rows , relationship_name ) )
477+ |> Request . assign ( :record_from_path , updated_with_join_rows )
486478
487- request
488- |> Request . assign ( :result , Map . get ( updated , relationship_name ) )
489- |> Request . assign ( :relationship_identifier_meta , identifier_meta )
479+ { :error , error } ->
480+ Request . add_error ( request , error , :add_to_relationship )
481+ end
490482
491483 { :error , error } ->
492484 Request . add_error ( request , error , :add_to_relationship )
@@ -497,6 +489,7 @@ defmodule AshJsonApi.Controllers.Helpers do
497489 def replace_relationship ( request , relationship_name ) do
498490 chain ( request , fn % { assigns: % { result: result } } ->
499491 action = Ash.Resource.Info . primary_action! ( request . resource , :update ) . name
492+ relationship = Ash.Resource.Info . relationship ( request . resource , relationship_name )
500493 values = relationship_change_values ( request , relationship_name )
501494
502495 result
@@ -508,8 +501,15 @@ defmodule AshJsonApi.Controllers.Helpers do
508501 |> Ash . update ( Request . opts ( request ) )
509502 |> case do
510503 { :ok , updated } ->
511- request
512- |> Request . assign ( :result , Map . get ( updated , relationship_name ) )
504+ case load_result_for_relationship_meta ( updated , relationship , request ) do
505+ { :ok , updated_with_join_rows } ->
506+ request
507+ |> Request . assign ( :result , Map . get ( updated_with_join_rows , relationship_name ) )
508+ |> Request . assign ( :record_from_path , updated_with_join_rows )
509+
510+ { :error , error } ->
511+ Request . add_error ( request , error , :replace_relationship )
512+ end
513513
514514 { :error , error } ->
515515 Request . add_error ( request , error , :replace_relationship )
@@ -520,6 +520,7 @@ defmodule AshJsonApi.Controllers.Helpers do
520520 def delete_from_relationship ( request , relationship_name ) do
521521 chain ( request , fn % { assigns: % { result: result } } ->
522522 action = Ash.Resource.Info . primary_action! ( request . resource , :update ) . name
523+ relationship = Ash.Resource.Info . relationship ( request . resource , relationship_name )
523524 values = relationship_change_values ( request , relationship_name )
524525
525526 result
@@ -534,8 +535,15 @@ defmodule AshJsonApi.Controllers.Helpers do
534535 |> Ash . load ( fields ( request , request . resource ) , Request . load_opts ( request ) )
535536 |> case do
536537 { :ok , updated } ->
537- request
538- |> Request . assign ( :result , Map . get ( updated , relationship_name ) )
538+ case load_result_for_relationship_meta ( updated , relationship , request ) do
539+ { :ok , updated_with_join_rows } ->
540+ request
541+ |> Request . assign ( :result , Map . get ( updated_with_join_rows , relationship_name ) )
542+ |> Request . assign ( :record_from_path , updated_with_join_rows )
543+
544+ { :error , error } ->
545+ Request . add_error ( request , error , :delete_from_relationship )
546+ end
539547
540548 { :error , error } ->
541549 Request . add_error ( request , error , :delete_from_relationship )
@@ -1110,7 +1118,7 @@ defmodule AshJsonApi.Controllers.Helpers do
11101118 relationship = Ash.Resource.Info . relationship ( request . resource , relationship_name )
11111119
11121120 meta_mapping =
1113- AshJsonApi.Resource.Info . relationship_meta_mapping ( request . resource , relationship_name )
1121+ AshJsonApi.Resource.Info . relationship_meta_in_mapping ( request . resource , relationship_name )
11141122
11151123 if match? ( % Ash.Resource.Relationships.ManyToMany { } , relationship ) and meta_mapping != [ ] do
11161124 build_many_to_many_values ( request . resource_identifiers , relationship , meta_mapping )
@@ -1146,4 +1154,14 @@ defmodule AshJsonApi.Controllers.Helpers do
11461154 end
11471155
11481156 defp build_many_to_many_values ( % { id: id } , _relationship , _meta_mapping ) , do: id
1157+
1158+ defp load_result_for_relationship_meta ( updated , relationship , request ) do
1159+ case relationship do
1160+ % Ash.Resource.Relationships.ManyToMany { join_relationship: join_relationship } ->
1161+ Ash . load ( updated , [ join_relationship ] , Request . load_opts ( request ) )
1162+
1163+ _ ->
1164+ { :ok , updated }
1165+ end
1166+ end
11491167end
0 commit comments