@@ -8,6 +8,7 @@ defmodule AshJsonApi.Request do
8
8
InvalidHeader ,
9
9
InvalidIncludes ,
10
10
InvalidQuery ,
11
+ InvalidRelationshipInput ,
11
12
InvalidType ,
12
13
UnacceptableMediaType ,
13
14
UnsupportedMediaType
@@ -851,14 +852,15 @@ defmodule AshJsonApi.Request do
851
852
when is_map ( relationships ) do
852
853
Enum . reduce ( relationships , request , fn { name , value } , request ->
853
854
with % { "data" => data } when is_map ( data ) or is_list ( data ) <- value ,
854
- arg when not is_nil ( arg ) <-
855
- Enum . find (
856
- action . arguments ,
857
- & ( to_string ( & 1 . name ) == name &&
858
- has_relationship_argument? ( relationship_arguments , & 1 . name ) )
859
- ) ,
855
+ { :arg , arg } when not is_nil ( arg ) <-
856
+ { :arg ,
857
+ Enum . find (
858
+ action . arguments ,
859
+ & ( to_string ( & 1 . name ) == name &&
860
+ has_relationship_argument? ( relationship_arguments , & 1 . name ) )
861
+ ) } ,
860
862
{ :ok , change_value } <-
861
- relationship_change_value ( data ) do
863
+ relationship_change_value ( name , data ) do
862
864
case find_relationship_argument ( relationship_arguments , arg . name ) do
863
865
{ :id , _arg } ->
864
866
% {
@@ -873,8 +875,33 @@ defmodule AshJsonApi.Request do
873
875
}
874
876
end
875
877
else
876
- _ ->
877
- add_error ( request , "invalid relationship input: #{ name } " , request . route . type )
878
+ { :arg , nil } ->
879
+ add_error (
880
+ request ,
881
+ Ash.Error.Invalid.NoSuchInput . exception ( input: name , resource: request . resource ) ,
882
+ request . route . type
883
+ )
884
+
885
+ { :error , error } ->
886
+ add_error (
887
+ request ,
888
+ error ,
889
+ request . route . type
890
+ )
891
+
892
+ % { "data" => data } ->
893
+ add_error (
894
+ request ,
895
+ InvalidRelationshipInput . exception ( relationship: name , input: data ) ,
896
+ request . route . type
897
+ )
898
+
899
+ other ->
900
+ add_error (
901
+ request ,
902
+ InvalidRelationshipInput . exception ( relationship: name , input: other ) ,
903
+ request . route . type
904
+ )
878
905
end
879
906
end )
880
907
end
@@ -923,10 +950,10 @@ defmodule AshJsonApi.Request do
923
950
% { request | resource_identifiers: nil }
924
951
end
925
952
926
- defp relationship_change_value ( value )
953
+ defp relationship_change_value ( name , value )
927
954
when is_list ( value ) do
928
955
value
929
- |> Stream . map ( & relationship_change_value ( & 1 ) )
956
+ |> Stream . map ( & relationship_change_value ( name , & 1 ) )
930
957
|> Enum . reduce_while ( { :ok , [ ] } , fn
931
958
{ :ok , change } , { :ok , changes } ->
932
959
{ :cont , { :ok , [ change | changes ] } }
@@ -938,24 +965,24 @@ defmodule AshJsonApi.Request do
938
965
{ :ok , changes } ->
939
966
{ :ok , Enum . reverse ( changes ) }
940
967
941
- { :error , error } ->
942
- { :error , error }
968
+ { :error , input } ->
969
+ { :error , InvalidRelationshipInput . exception ( relationship: name , input: input ) }
943
970
end
944
971
end
945
972
946
- defp relationship_change_value ( % { "id" => id } = value ) do
973
+ defp relationship_change_value ( _name , % { "id" => id } = value ) do
947
974
case Map . fetch ( value , "meta" ) do
948
975
{ :ok , meta } -> { :ok , Map . put ( meta , "id" , id ) }
949
976
_ -> { :ok , % { "id" => id } }
950
977
end
951
978
end
952
979
953
- defp relationship_change_value ( value ) when value in [ nil , % { } ] do
954
- { :ok , nil }
980
+ defp relationship_change_value ( _name , value ) when is_nil ( value ) or is_map ( value ) do
981
+ { :ok , value }
955
982
end
956
983
957
- defp relationship_change_value ( value ) do
958
- { :error , value }
984
+ defp relationship_change_value ( name , value ) do
985
+ { :error , InvalidRelationshipInput . exception ( relationship: name , input: value ) }
959
986
end
960
987
961
988
defp url ( conn ) do
0 commit comments