legendary-doc-site/apps/admin/kaffy/lib/kaffy/resource_callbacks.ex
2020-07-27 20:28:41 +00:00

206 lines
5.1 KiB
Elixir

defmodule Kaffy.ResourceCallbacks do
@moduledoc false
alias Kaffy.Utils
def create_callbacks(conn, resource, changes) do
changeset = Kaffy.ResourceAdmin.create_changeset(resource, changes)
repo = Kaffy.Utils.repo()
repo.transaction(fn ->
result =
with {:ok, changeset} <- before_insert(conn, resource, changeset),
{:ok, changeset} <- before_save(conn, resource, changeset),
{:ok, entry} <- exec_insert(conn, resource, changeset),
{:ok, entry} <- after_save(conn, resource, entry),
do: after_insert(conn, resource, entry)
case result do
{:ok, entry} -> entry
{:error, changeset} -> repo.rollback(changeset)
{:error, entry, error} -> repo.rollback({entry, error})
end
end)
end
defp exec_insert(conn, resource, changeset) do
with {:ok, entry} <- insert(conn, resource, changeset) do
{:ok, entry}
else
{:error, :not_found} ->
Kaffy.Utils.repo().insert(changeset)
unexpected_error ->
{:error, unexpected_error}
end
end
def update_callbacks(conn, resource, entry, changes) do
changeset = Kaffy.ResourceAdmin.update_changeset(resource, entry, changes)
repo = Kaffy.Utils.repo()
repo.transaction(fn ->
result =
with {:ok, changeset} <- before_update(conn, resource, changeset),
{:ok, changeset} <- before_save(conn, resource, changeset),
{:ok, entry} <- exec_update(conn, resource, changeset),
{:ok, entry} <- after_save(conn, resource, entry),
do: after_update(conn, resource, entry)
case result do
{:ok, entry} -> entry
{:error, changeset} -> repo.rollback(changeset)
{:error, entry, error} -> repo.rollback({entry, error})
end
end)
end
defp exec_update(conn, resource, changeset) do
with {:ok, entry} <- update(conn, resource, changeset) do
{:ok, entry}
else
{:error, :not_found} ->
Kaffy.Utils.repo().update(changeset)
unexpected_error ->
{:error, unexpected_error}
end
end
def delete_callbacks(conn, resource, entry) do
repo = Kaffy.Utils.repo()
repo.transaction(fn ->
result =
with {:ok, changeset} <- before_delete(conn, resource, entry),
{:ok, entry} <- exec_delete(conn, resource, changeset),
do: after_delete(conn, resource, entry)
case result do
{:ok, entry} -> entry
{:error, changeset} -> repo.rollback(changeset)
{:error, entry, error} -> repo.rollback({entry, error})
end
end)
end
defp before_insert(conn, resource, changeset) do
Utils.get_assigned_value_or_default(
resource,
:before_insert,
{:ok, changeset},
[conn, changeset],
false
)
end
defp insert(conn, resource, changeset) do
Utils.get_assigned_value_or_default(
resource,
:insert,
{:error, :not_found},
[conn, changeset],
false
)
end
defp after_insert(conn, resource, entry) do
Utils.get_assigned_value_or_default(
resource,
:after_insert,
{:ok, entry},
[conn, entry],
false
)
end
defp before_update(conn, resource, changeset) do
Utils.get_assigned_value_or_default(
resource,
:before_update,
{:ok, changeset},
[conn, changeset],
false
)
end
defp before_save(conn, resource, changeset) do
Utils.get_assigned_value_or_default(
resource,
:before_save,
{:ok, changeset},
[conn, changeset],
false
)
end
defp after_save(conn, resource, entry) do
Utils.get_assigned_value_or_default(resource, :after_save, {:ok, entry}, [conn, entry], false)
end
defp update(conn, resource, changeset) do
Utils.get_assigned_value_or_default(
resource,
:update,
{:error, :not_found},
[conn, changeset],
false
)
end
defp after_update(conn, resource, entry) do
Utils.get_assigned_value_or_default(
resource,
:after_update,
{:ok, entry},
[conn, entry],
false
)
end
defp exec_delete(conn, resource, changeset) do
with {:ok, entry} <- delete(conn, resource, changeset) do
{:ok, entry}
else
{:error, :not_found} ->
Kaffy.Utils.repo().delete(changeset)
unexpected_error ->
{:error, unexpected_error}
end
end
defp before_delete(conn, resource, entry) do
changeset = Kaffy.ResourceAdmin.update_changeset(resource, entry, %{})
Utils.get_assigned_value_or_default(
resource,
:before_delete,
{:ok, changeset},
[conn, changeset],
false
)
end
defp delete(conn, resource, changeset) do
Utils.get_assigned_value_or_default(
resource,
:delete,
{:error, :not_found},
[conn, changeset],
false
)
end
defp after_delete(conn, resource, entry) do
# changeset = Kaffy.ResourceAdmin.update_changeset(resource, entry, %{})
Utils.get_assigned_value_or_default(
resource,
:after_delete,
{:ok, entry},
[conn, entry],
false
)
end
end