Skip to content

Commit 0fc9f5a

Browse files
Merge pull request #323 from nimblehq/feature/revisit-error-view
Convert from ErrorView to new ErrorJSON view
2 parents 25fd192 + dece778 commit 0fc9f5a

File tree

16 files changed

+141
-206
lines changed

16 files changed

+141
-206
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
defmodule NimbleTemplate.Addons.Phoenix.Api.ErrorJSON do
2+
@moduledoc false
3+
4+
use NimbleTemplate.Addons.Addon
5+
6+
@impl true
7+
def do_apply!(%Project{} = project, _opts) do
8+
project
9+
|> delete_files!()
10+
|> copy_files!()
11+
end
12+
13+
defp delete_files!(%Project{web_path: web_path, web_test_path: web_test_path} = project) do
14+
File.rm!("#{web_path}/controllers/error_json.ex")
15+
File.rm!("#{web_test_path}/controllers/error_json_test.exs")
16+
17+
project
18+
end
19+
20+
defp copy_files!(
21+
%Project{
22+
base_module: base_module,
23+
web_module: web_module,
24+
web_path: web_path,
25+
web_test_path: web_test_path
26+
} = project
27+
) do
28+
binding = [
29+
web_module: web_module,
30+
base_module: base_module
31+
]
32+
33+
files = [
34+
{:eex, "lib/otp_app_web/controllers/error_json.ex.eex",
35+
"#{web_path}/controllers/error_json.ex"},
36+
{:eex, "test/otp_app_web/controllers/error_json_test.exs.eex",
37+
"#{web_test_path}/controllers/error_json_test.exs"}
38+
]
39+
40+
Generator.copy_file!(files, binding)
41+
42+
project
43+
end
44+
end

lib/nimble_template/addons/variants/phoenix/api/error_view.ex

Lines changed: 0 additions & 51 deletions
This file was deleted.

lib/nimble_template/helpers/credo.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ defmodule NimbleTemplate.CredoHelper do
6161
web_test_path: web_test_path
6262
}) do
6363
[
64-
"#{web_test_path}/views/api/error_view_test.exs",
64+
"#{web_test_path}/controllers/error_json_test.exs",
6565
"#{web_test_path}/params/params_validator_test.exs"
6666
]
6767
end

lib/nimble_template/templates/variants/phoenix/api/template.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ defmodule NimbleTemplate.Templates.Phoenix.Api.Template do
1313
|> Api.Config.apply!()
1414
|> Api.EmptyBodyParamsPlug.apply!()
1515
|> Api.ParamsValidation.apply!()
16-
|> Api.ErrorView.apply!()
16+
|> Api.ErrorJSON.apply!()
1717
|> Api.JsonApi.apply!()
1818
|> Api.FallbackController.apply!()
1919
end

priv/templates/nimble_template/coveralls.json.eex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
"lib/<%= otp_app %>_web/endpoint.ex",
99
"lib/<%= otp_app %>_web/telemetry.ex",
1010
"lib/<%= otp_app %>_web/channels/user_socket.ex",
11-
"lib/<%= otp_app %>_web/views/error_helpers.ex",
1211
"lib/<%= otp_app %>_web/controllers/api/fallback_controller.ex",
1312
"lib/<%= otp_app %>_web/components/core_components.ex",
1413
"test/support"

priv/templates/nimble_template/lib/otp_app_web/controllers/api/fallback_controller.ex.eex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@ defmodule <%= web_module %>.Api.FallbackController do
22
use Phoenix.Controller
33

44
alias Ecto.Changeset
5-
alias <%= web_module %>.Api.ErrorView
65

76
def call(conn, {:error, :invalid_params, %Changeset{valid?: false} = changeset}) do
87
conn
98
|> put_status(:unprocessable_entity)
10-
|> put_view(ErrorView)
9+
|> put_view(json: <%= web_module %>.ErrorJSON)
1110
|> render("error.json", %{code: :validation_error, changeset: changeset})
1211
end
1312

1413
def call(conn, {:error, %Changeset{valid?: false} = changeset}) do
1514
conn
1615
|> put_status(:unprocessable_entity)
17-
|> put_view(ErrorView)
16+
|> put_view(json: <%= web_module %>.ErrorJSON)
1817
|> render("error.json", %{code: :unprocessable_entity, changeset: changeset})
1918
end
2019
end
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,54 @@
1-
defmodule <%= web_module %>.Api.ErrorView do
2-
use <%= web_module %>, :view
3-
1+
defmodule <%= web_module %>.ErrorJSON do
42
alias Ecto.Changeset
3+
alias Plug.Conn.Status
4+
5+
# If you want to customize a particular status code,
6+
# you may add your own clauses, such as:
7+
#
8+
# def render("500.json", _assigns) do
9+
# %{errors: %{detail: "Internal Server Error"}}
10+
# end
11+
12+
# By default, Phoenix returns the status message from
13+
# the template name. For example, "404.json" becomes
14+
# "Not Found".
515

6-
def template_not_found(template, assigns) do
16+
def render(_template, %{code: code, changeset: %Changeset{} = changeset}) do
17+
build_error_response(
18+
code: code,
19+
detail: translate_errors(changeset),
20+
message: build_changeset_error_message(changeset)
21+
)
22+
end
23+
24+
def render(template, assigns) do
725
build_error_response(
826
code: assigns[:code] || status_code_from_template(template),
927
detail: %{},
1028
message: assigns[:message] || Phoenix.Controller.status_message_from_template(template)
1129
)
1230
end
1331

14-
def render("error.json", %{code: code, changeset: %Changeset{} = changeset}) do
15-
build_error_response(
16-
code: code,
17-
detail: translate_errors(changeset),
18-
message: build_changeset_error_message(changeset)
19-
)
32+
defp status_code_from_template(template) do
33+
template
34+
|> String.split(".")
35+
|> hd()
36+
|> String.to_integer()
37+
|> Status.reason_atom()
38+
rescue
39+
_ -> :internal_server_error
40+
end
41+
42+
defp build_error_response(code: code, detail: detail, message: message) do
43+
%{
44+
errors: [
45+
%{
46+
code: code,
47+
detail: detail,
48+
message: message
49+
}
50+
]
51+
}
2052
end
2153

2254
defp build_changeset_error_message(%Changeset{} = changeset) do
@@ -39,17 +71,13 @@ defmodule <%= web_module %>.Api.ErrorView do
3971
"#{sentence} and #{List.last(messages)}"
4072
end
4173

42-
defp build_error_response(code: code, detail: detail, message: message) do
43-
%{
44-
errors: [
45-
%{
46-
code: code,
47-
detail: detail,
48-
message: message
49-
}
50-
]
51-
}
52-
end
53-
5474
defp translate_errors(changeset), do: Changeset.traverse_errors(changeset, &translate_error/1)
75+
76+
defp translate_error({msg, opts}) do
77+
if count = opts[:count] do
78+
Gettext.dngettext(<%= web_module %>.Gettext, "errors", msg, msg, count, opts)
79+
else
80+
Gettext.dgettext(<%= web_module %>.Gettext, "errors", msg, opts)
81+
end
82+
end
5583
end

priv/templates/nimble_template/lib/otp_app_web/plugs/check_empty_body_params_plug.ex.eex

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@ defmodule <%= web_module %>.CheckEmptyBodyParamsPlug do
44
import Phoenix.Controller, only: [put_view: 2, render: 3]
55
import Plug.Conn
66

7-
alias <%= web_module %>.Api.ErrorView
8-
97
def init(opts), do: opts
108

119
def call(%{body_params: body_params, method: "POST"} = conn, _opts)
1210
when body_params == %{} do
1311
conn
1412
|> put_status(:bad_request)
15-
|> put_view(ErrorView)
13+
|> put_view(json: <%= web_module %>.ErrorJSON)
1614
|> render("400.json", %{message: "Missing body params"})
1715
|> halt()
1816
end

priv/templates/nimble_template/lib/otp_app_web/views/error_helpers.ex.eex

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)