pleroma/lib/mix/tasks/pleroma/frontend.ex

108 lines
2.4 KiB
Elixir

# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Mix.Tasks.Pleroma.Frontend do
use Mix.Task
import Mix.Pleroma
alias Pleroma.Frontend
@shortdoc "Manages bundled Pleroma frontends"
@moduledoc File.read!("docs/administration/CLI_tasks/frontend.md")
def run(["install", "none" | _args]) do
shell_info("Skipping frontend installation because none was requested")
"none"
end
def run(["install", name | args]) do
start_pleroma()
{options, [], []} =
OptionParser.parse(
args,
strict: [
ref: :string,
build_url: :string,
build_dir: :string,
file: :string,
admin: :boolean,
primary: :boolean
]
)
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")
if get_frontend_type(options) do
run(["enable", name] ++ args)
end
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) || :primary
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: true} ->
:primary
_ ->
nil
end
end
end