aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/mix/tasks/pleroma/frontend.ex63
-rw-r--r--lib/pleroma/frontend.ex38
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")