ML-165: implementation
This commit is contained in:
@@ -1,11 +1,17 @@
|
||||
defmodule MusicLibrary.Errors do
|
||||
@moduledoc """
|
||||
Queries for production errors tracked via ErrorTracker.
|
||||
Queries and mutations for production errors tracked via ErrorTracker.
|
||||
|
||||
Reads from the error_tracker_errors and error_tracker_occurrences tables
|
||||
(owned by the `ErrorTracker` library) through `MusicLibrary.Repo`. The
|
||||
tables are created by ErrorTracker's own migrations and do not require
|
||||
any additional schema work.
|
||||
|
||||
Provides `mute_error/1`, `unmute_error/1`, `resolve_error/1`, and
|
||||
`unresolve_error/1` for mutating error state (muted flag and status).
|
||||
Muting an error suppresses future email notifications via
|
||||
`ErrorTracker.ErrorNotifier`, which checks the `muted` field before
|
||||
dispatching.
|
||||
"""
|
||||
|
||||
import Ecto.Query, warn: false
|
||||
@@ -79,7 +85,44 @@ defmodule MusicLibrary.Errors do
|
||||
end
|
||||
end
|
||||
|
||||
# -- private helpers --
|
||||
@spec mute_error(pos_integer()) :: {:ok, Error.t()} | {:error, :not_found | Ecto.Changeset.t()}
|
||||
def mute_error(id) do
|
||||
case Repo.get(Error, id) do
|
||||
nil -> {:error, :not_found}
|
||||
%{muted: true} = error -> {:ok, error}
|
||||
error -> ErrorTracker.mute(error)
|
||||
end
|
||||
end
|
||||
|
||||
@spec unmute_error(pos_integer()) ::
|
||||
{:ok, Error.t()} | {:error, :not_found | Ecto.Changeset.t()}
|
||||
def unmute_error(id) do
|
||||
case Repo.get(Error, id) do
|
||||
nil -> {:error, :not_found}
|
||||
%{muted: false} = error -> {:ok, error}
|
||||
error -> ErrorTracker.unmute(error)
|
||||
end
|
||||
end
|
||||
|
||||
@spec resolve_error(pos_integer()) ::
|
||||
{:ok, Error.t()} | {:error, :not_found | Ecto.Changeset.t()}
|
||||
def resolve_error(id) do
|
||||
case Repo.get(Error, id) do
|
||||
nil -> {:error, :not_found}
|
||||
%{status: :resolved} = error -> {:ok, error}
|
||||
error -> ErrorTracker.resolve(error)
|
||||
end
|
||||
end
|
||||
|
||||
@spec unresolve_error(pos_integer()) ::
|
||||
{:ok, Error.t()} | {:error, :not_found | Ecto.Changeset.t()}
|
||||
def unresolve_error(id) do
|
||||
case Repo.get(Error, id) do
|
||||
nil -> {:error, :not_found}
|
||||
%{status: :unresolved} = error -> {:ok, error}
|
||||
error -> ErrorTracker.unresolve(error)
|
||||
end
|
||||
end
|
||||
|
||||
defp base_query(filters) do
|
||||
Error
|
||||
|
||||
@@ -43,8 +43,32 @@ defmodule MusicLibraryWeb.ErrorController do
|
||||
end
|
||||
end
|
||||
|
||||
def mute(conn, %{"id" => id}), do: perform_action(conn, id, &Errors.mute_error/1)
|
||||
def unmute(conn, %{"id" => id}), do: perform_action(conn, id, &Errors.unmute_error/1)
|
||||
def resolve(conn, %{"id" => id}), do: perform_action(conn, id, &Errors.resolve_error/1)
|
||||
def unresolve(conn, %{"id" => id}), do: perform_action(conn, id, &Errors.unresolve_error/1)
|
||||
|
||||
# -- private helpers --
|
||||
|
||||
defp perform_action(conn, id, action_fn) do
|
||||
case Integer.parse(id) do
|
||||
{id_int, ""} when id_int > 0 ->
|
||||
case action_fn.(id_int) do
|
||||
{:ok, error} ->
|
||||
render(conn, :update, error: error)
|
||||
|
||||
{:error, :not_found} ->
|
||||
conn |> put_status(:not_found) |> json(%{error: "Not Found"})
|
||||
|
||||
{:error, _changeset} ->
|
||||
conn |> put_status(:unprocessable_entity) |> json(%{error: "Update failed"})
|
||||
end
|
||||
|
||||
_ ->
|
||||
conn |> put_status(:not_found) |> json(%{error: "Not Found"})
|
||||
end
|
||||
end
|
||||
|
||||
defp parse_status(nil), do: nil
|
||||
defp parse_status("resolved"), do: :resolved
|
||||
defp parse_status("unresolved"), do: :unresolved
|
||||
|
||||
@@ -29,6 +29,10 @@ defmodule MusicLibraryWeb.ErrorJSON do
|
||||
}
|
||||
end
|
||||
|
||||
def update(%{error: error}) do
|
||||
%{error: error(error)}
|
||||
end
|
||||
|
||||
defp error(e) do
|
||||
%{
|
||||
id: e.id,
|
||||
|
||||
@@ -132,6 +132,10 @@ defmodule MusicLibraryWeb.Router do
|
||||
get "/collection", CollectionController, :index
|
||||
get "/errors", ErrorController, :index
|
||||
get "/errors/:id", ErrorController, :show
|
||||
post "/errors/:id/mute", ErrorController, :mute
|
||||
post "/errors/:id/unmute", ErrorController, :unmute
|
||||
post "/errors/:id/resolve", ErrorController, :resolve
|
||||
post "/errors/:id/unresolve", ErrorController, :unresolve
|
||||
get "/assets/:transform_payload", AssetController, :show
|
||||
get "/backup", ArchiveController, :backup
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user