Skip to content

Commit 86d995a

Browse files
authored
fix: check for impl for all classes of errors. (#365)
1 parent 2e7f361 commit 86d995a

File tree

1 file changed

+26
-45
lines changed

1 file changed

+26
-45
lines changed

lib/ash_json_api/error/error.ex

Lines changed: 26 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,19 @@ defmodule AshJsonApi.Error do
3131
[error]
3232
end
3333

34-
def to_json_api_errors(domain, resource, %{class: :invalid} = error, type) do
34+
def to_json_api_errors(_domain, _resource, %{class: :forbidden} = error, _type) do
35+
[
36+
%__MODULE__{
37+
id: Ash.UUID.generate(),
38+
status_code: class_to_status(error.class),
39+
code: "forbidden",
40+
title: "Forbidden",
41+
detail: "forbidden"
42+
}
43+
]
44+
end
45+
46+
def to_json_api_errors(domain, resource, error, type) do
3547
if AshJsonApi.ToJsonApiError.impl_for(error) do
3648
error
3749
|> AshJsonApi.ToJsonApiError.to_json_api_error()
@@ -53,13 +65,21 @@ defmodule AshJsonApi.Error do
5365
"`#{uuid}`: AshJsonApi.Error not implemented for error:\n\n#{Exception.format(:error, error, stacktrace)}"
5466
)
5567

68+
code = if error.class == :forbidden, do: "forbidden", else: "something_went_wrong"
69+
title = if error.class == :forbidden, do: "Forbidden", else: "SomethingWentWrong"
70+
71+
detail =
72+
if error.class == :forbidden,
73+
do: "forbidden",
74+
else: "Something went wrong. Error id: #{uuid}"
75+
5676
if AshJsonApi.Domain.Info.show_raised_errors?(domain) do
5777
[
5878
%__MODULE__{
5979
id: uuid,
6080
status_code: class_to_status(error.class),
61-
code: "something_went_wrong",
62-
title: "SomethingWentWrong",
81+
code: code,
82+
title: title,
6383
detail: """
6484
Raised error: #{uuid}
6585
@@ -72,54 +92,15 @@ defmodule AshJsonApi.Error do
7292
%__MODULE__{
7393
id: uuid,
7494
status_code: class_to_status(error.class),
75-
code: "something_went_wrong",
76-
title: "SomethingWentWrong",
77-
detail: "Something went wrong. Error id: #{uuid}"
95+
code: code,
96+
title: title,
97+
detail: detail
7898
}
7999
]
80100
end
81101
end
82102
end
83103

84-
def to_json_api_errors(_domain, _resource, %{class: :forbidden} = error, _type) do
85-
[
86-
%__MODULE__{
87-
id: Ash.UUID.generate(),
88-
status_code: class_to_status(error.class),
89-
code: "forbidden",
90-
title: "Forbidden",
91-
detail: "forbidden"
92-
}
93-
]
94-
end
95-
96-
def to_json_api_errors(_domain, _resource, error, _type) do
97-
uuid = Ash.UUID.generate()
98-
99-
stacktrace =
100-
case error do
101-
%{stacktrace: %{stacktrace: v}} ->
102-
v
103-
104-
_ ->
105-
nil
106-
end
107-
108-
Logger.warning(
109-
"`#{uuid}`: AshJsonApi.Error not implemented for error:\n\n#{Exception.format(:error, error, stacktrace)}"
110-
)
111-
112-
[
113-
%__MODULE__{
114-
id: uuid,
115-
status_code: class_to_status(error.class),
116-
code: "something_went_wrong",
117-
title: "SomethingWentWrong",
118-
detail: "Something went wrong. Error id: #{uuid}"
119-
}
120-
]
121-
end
122-
123104
@doc "Turns an error class into an HTTP status code"
124105
def class_to_status(:forbidden), do: 403
125106
def class_to_status(:invalid), do: 400

0 commit comments

Comments
 (0)