feat: more UI cleanup
This commit is contained in:
@@ -9,6 +9,25 @@ defmodule BDS.Desktop.ShellController do
|
||||
Jason.encode!(BDS.Tasks.status_snapshot())
|
||||
end
|
||||
|
||||
def projects_json do
|
||||
Jason.encode!(BDS.Projects.shell_snapshot())
|
||||
rescue
|
||||
error in [Exqlite.Error] ->
|
||||
if String.contains?(Exception.message(error), "no such table: projects") do
|
||||
Jason.encode!(default_project_snapshot())
|
||||
else
|
||||
reraise error, __STACKTRACE__
|
||||
end
|
||||
end
|
||||
|
||||
def upsert_project_json(payload) when is_map(payload) do
|
||||
case normalize_project_request(payload) do
|
||||
{:create, attrs} -> create_project_json(attrs)
|
||||
{:select, project_id} -> select_project_json(project_id)
|
||||
:error -> Jason.encode!(%{status: "error", error: %{message: "Missing project name or project_id"}})
|
||||
end
|
||||
end
|
||||
|
||||
def command_json(payload) when is_map(payload) do
|
||||
action = Map.get(payload, "action") || Map.get(payload, :action)
|
||||
params = Map.get(payload, "params") || Map.get(payload, :params) || %{}
|
||||
@@ -21,4 +40,72 @@ defmodule BDS.Desktop.ShellController do
|
||||
|
||||
defp normalize_error(error) when is_map(error), do: error
|
||||
defp normalize_error(error), do: %{message: inspect(error)}
|
||||
|
||||
defp normalize_project_request(payload) do
|
||||
cond do
|
||||
present?(Map.get(payload, "name") || Map.get(payload, :name)) ->
|
||||
{:create,
|
||||
%{
|
||||
name: String.trim(Map.get(payload, "name") || Map.get(payload, :name)),
|
||||
data_path: blank_to_nil(Map.get(payload, "data_path") || Map.get(payload, :data_path))
|
||||
}}
|
||||
|
||||
present?(Map.get(payload, "project_id") || Map.get(payload, :project_id)) ->
|
||||
{:select, Map.get(payload, "project_id") || Map.get(payload, :project_id)}
|
||||
|
||||
true ->
|
||||
:error
|
||||
end
|
||||
end
|
||||
|
||||
defp create_project_json(attrs) do
|
||||
with {:ok, project} <- BDS.Projects.create_project(attrs),
|
||||
{:ok, active_project} <- BDS.Projects.set_active_project(project.id) do
|
||||
Jason.encode!(%{status: "ok", project: project_response(active_project), active_project_id: active_project.id})
|
||||
else
|
||||
{:error, error} -> Jason.encode!(%{status: "error", error: normalize_error(error)})
|
||||
end
|
||||
end
|
||||
|
||||
defp select_project_json(project_id) do
|
||||
case BDS.Projects.set_active_project(project_id) do
|
||||
{:ok, project} ->
|
||||
Jason.encode!(%{status: "ok", project: project_response(project), active_project_id: project.id})
|
||||
|
||||
{:error, :not_found} ->
|
||||
Jason.encode!(%{status: "error", error: %{message: "Project not found"}})
|
||||
|
||||
{:error, error} ->
|
||||
Jason.encode!(%{status: "error", error: normalize_error(error)})
|
||||
end
|
||||
end
|
||||
|
||||
defp project_response(project) do
|
||||
%{id: project.id, name: project.name, slug: project.slug, data_path: project.data_path, is_active: project.is_active}
|
||||
end
|
||||
|
||||
defp default_project_snapshot do
|
||||
%{
|
||||
active_project_id: "default",
|
||||
projects: [
|
||||
%{
|
||||
id: "default",
|
||||
name: "My Blog",
|
||||
slug: "my-blog",
|
||||
data_path: nil,
|
||||
is_active: true
|
||||
}
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
defp present?(value) when is_binary(value), do: String.trim(value) != ""
|
||||
defp present?(_value), do: false
|
||||
|
||||
defp blank_to_nil(value) when is_binary(value) do
|
||||
trimmed = String.trim(value)
|
||||
if trimmed == "", do: nil, else: trimmed
|
||||
end
|
||||
|
||||
defp blank_to_nil(_value), do: nil
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user