diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mix/tasks/pleroma/frontend.ex | 63 | ||||
-rw-r--r-- | lib/pleroma/frontend.ex | 38 |
2 files changed, 97 insertions, 4 deletions
diff --git a/lib/mix/tasks/pleroma/frontend.ex b/lib/mix/tasks/pleroma/frontend.ex index 9b151c3bd..819cd9f6a 100644 --- a/lib/mix/tasks/pleroma/frontend.ex +++ b/lib/mix/tasks/pleroma/frontend.ex @@ -32,13 +32,68 @@ defmodule Mix.Tasks.Pleroma.Frontend do ] ) - options - |> Keyword.put(:name, name) - |> opts_to_frontend() - |> Frontend.install() + shell_info("Installing frontend #{name}...") + + with %Frontend{} = fe <- + options + |> Keyword.put(:name, name) + |> opts_to_frontend() + |> Frontend.install() do + shell_info("Frontend #{fe.name} installed") + else + error -> + shell_error("Failed to install frontend") + exit(inspect(error)) + end + end + + def run(["enable", name | args]) do + start_pleroma() + + {options, [], []} = + OptionParser.parse( + args, + strict: [ + ref: :string, + build_url: :string, + build_dir: :string, + file: :string, + admin: :boolean, + primary: :boolean + ] + ) + + frontend_type = get_frontend_type(options) + + shell_info("Enabling frontend #{name}...") + + with %Frontend{} = fe <- + options + |> Keyword.put(:name, name) + |> opts_to_frontend() + |> Frontend.enable(frontend_type) do + shell_info("Frontend #{fe.name} enabled") + else + error -> + shell_error("Failed to enable frontend") + exit(inspect(error)) + end end defp opts_to_frontend(opts) do struct(Frontend, opts) end + + defp get_frontend_type(opts) do + case Enum.into(opts, %{}) do + %{admin: true, primary: true} -> + raise "Invalid command. Only one frontend type may be selected." + + %{admin: true} -> + :admin + + _ -> + :primary + end + end end diff --git a/lib/pleroma/frontend.ex b/lib/pleroma/frontend.ex index a0d496193..cd49a4899 100644 --- a/lib/pleroma/frontend.ex +++ b/lib/pleroma/frontend.ex @@ -4,11 +4,13 @@ defmodule Pleroma.Frontend do alias Pleroma.Config + alias Pleroma.ConfigDB alias Pleroma.Frontend require Logger @unknown_name "unknown" + @frontend_types [:admin, :primary] defstruct [:name, :ref, :git, :build_url, :build_dir, :file, :"custom-http-headers"] @@ -40,6 +42,7 @@ defmodule Pleroma.Frontend do :ok <- install_frontend(frontend, tmp_dir, dest) do File.rm_rf!(tmp_dir) Logger.info("Frontend #{label} installed to #{dest}") + frontend else {:download_or_unzip, _} -> Logger.info("Could not download or unzip the frontend") @@ -51,6 +54,41 @@ defmodule Pleroma.Frontend do end end + def enable(%Frontend{} = frontend, frontend_type) when frontend_type in @frontend_types do + with {:config_db, true} <- {:config_db, Config.get(:configurable_from_database)} do + frontend + |> maybe_put_name() + |> hydrate() + |> validate!() + |> do_enable(frontend_type) + else + {:config_db, _} -> + map = to_map(frontend) + + raise """ + Can't enable frontend; database configuration is disabled. + Enable the frontend by manually adding this line to your config: + + config :pleroma, :frontends, #{to_string(frontend_type)}: #{inspect(map)} + + Alternatively, enable database configuration: + + config :pleroma, configurable_from_database: true + """ + end + end + + def do_enable(%Frontend{name: name} = frontend, frontend_type) do + value = Keyword.put([], frontend_type, to_map(frontend)) + params = %{group: :pleroma, key: :frontends, value: value} + + with {:ok, _} <- ConfigDB.update_or_create(params), + :ok <- Config.TransferTask.load_and_update_env([], false) do + Logger.info("Frontend #{name} successfully enabled") + frontend + end + end + def dir do Config.get!([:instance, :static_dir]) |> Path.join("frontends") |