write first test and let changeset errors return error json in controller
This commit is contained in:
@@ -2,6 +2,8 @@ defmodule Entendu.Links.Link do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
|
||||
@primary_key {:id, Ecto.UUID, autogenerate: true}
|
||||
|
||||
schema "links" do
|
||||
field :burn_after_reading, :boolean, default: false
|
||||
field :expires, :utc_datetime
|
||||
@@ -16,7 +18,13 @@ defmodule Entendu.Links.Link do
|
||||
@doc false
|
||||
def changeset(link, attrs) do
|
||||
link
|
||||
|> cast(attrs, [:expires, :burn_after_reading, :filename, :filetype, :text_content, :file_content])
|
||||
|> validate_required([:expires, :burn_after_reading, :filename, :filetype])
|
||||
|> cast(attrs, [
|
||||
:expires,
|
||||
:burn_after_reading,
|
||||
:filename,
|
||||
:filetype,
|
||||
:text_content,
|
||||
:file_content
|
||||
])
|
||||
end
|
||||
end
|
||||
|
10
lib/entendu_web/controllers/fallback_controller.ex
Normal file
10
lib/entendu_web/controllers/fallback_controller.ex
Normal file
@@ -0,0 +1,10 @@
|
||||
defmodule EntenduWeb.FallbackController do
|
||||
use EntenduWeb, :controller
|
||||
|
||||
def call(conn, {:error, %Ecto.Changeset{} = changeset}) do
|
||||
conn
|
||||
|> put_status(:unprocessable_entity)
|
||||
|> put_view(EntenduWeb.ChangesetView)
|
||||
|> render("error.json", changeset: changeset)
|
||||
end
|
||||
end
|
@@ -9,27 +9,33 @@ defmodule EntenduWeb.LinkController do
|
||||
alias Entendu.Links
|
||||
alias Links.Link
|
||||
alias Ecto.Changeset
|
||||
alias EntenduWeb.FallbackController
|
||||
|
||||
action_fallback(FallbackController)
|
||||
|
||||
def just_page(conn, _params) do
|
||||
render(conn, "just.html")
|
||||
end
|
||||
|
||||
defparams first_step %{
|
||||
burn_after_reading: [field: :boolean, default: false],
|
||||
expires: :utc_datetime,
|
||||
filename: :string,
|
||||
filetype: :string,
|
||||
text_content: :string,
|
||||
file_content: :string
|
||||
}
|
||||
defparams(
|
||||
first_step(%{
|
||||
burn_after_reading: [field: :boolean, default: false],
|
||||
expires: :utc_datetime,
|
||||
filename: :string,
|
||||
filetype: :string,
|
||||
text_content: :string,
|
||||
file_content: :string
|
||||
})
|
||||
)
|
||||
|
||||
def just(conn, params) do
|
||||
with %Changeset{valid?: true} = changeset <- first_step(params),
|
||||
link_params <- Params.to_map(changeset),
|
||||
{:ok, %Link{} = link} <- Links.create_link(link_params) do
|
||||
link_params <- Params.to_map(changeset),
|
||||
{:ok, %Link{} = link} <- Links.create_link(link_params) do
|
||||
conn
|
||||
|> put_status(:created)
|
||||
|> assign(:link, link)
|
||||
|> render("show_authorized", link: link)
|
||||
|> render("show_authorized.json", %{link: link})
|
||||
end
|
||||
end
|
||||
|
||||
|
15
lib/entendu_web/views/changeset_view.ex
Normal file
15
lib/entendu_web/views/changeset_view.ex
Normal file
@@ -0,0 +1,15 @@
|
||||
defmodule EntenduWeb.ChangesetView do
|
||||
use EntenduWeb, :view
|
||||
|
||||
def translate_errors(%Ecto.Changeset{} = changeset) do
|
||||
Ecto.Changeset.traverse_errors(changeset, &translate_error/1)
|
||||
end
|
||||
|
||||
def translate_errors(errors = %{}), do: errors
|
||||
|
||||
def render("error.json", %{changeset: changeset}) do
|
||||
# When encoded, the changeset returns its errors
|
||||
# as a JSON object. So we just pass it forward.
|
||||
%{errors: translate_errors(changeset)}
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user