defmodule Pleroma.Config.TransferTask do
use Task
- require Logger
-
+ alias Pleroma.ConfigDB
alias Pleroma.Repo
- alias Pleroma.Web.AdminAPI.Config
+
+ require Logger
def start_link(_) do
load_and_update_env()
true <- Ecto.Adapters.SQL.table_exists?(Repo, "config"),
started_applications <- Application.started_applications() do
# We need to restart applications for loaded settings take effect
- Config
+ ConfigDB
|> Repo.all()
|> Enum.map(&update_env(&1))
|> Enum.uniq()
defp update_env(setting) do
try do
- key = Config.from_string(setting.key)
- group = Config.from_string(setting.group)
- value = Config.from_binary(setting.value)
+ key = ConfigDB.from_string(setting.key)
+ group = ConfigDB.from_string(setting.group)
+ value = ConfigDB.from_binary(setting.value)
if group != :phoenix and key != :serve_endpoints do
- :ok = Application.put_env(group, key, value)
- end
+ default = Pleroma.Config.Holder.config(group, key)
+
+ merged_value =
+ if can_be_merged?(default, value) do
+ ConfigDB.deep_merge(group, key, default, value)
+ else
+ value
+ end
+
+ :ok = Application.put_env(group, key, merged_value)
- group
+ if group != :logger do
+ group
+ else
+ # change logger configuration in runtime, without restart
+ if Keyword.keyword?(merged_value) and
+ key not in [:compile_time_application, :backends, :compile_time_purge_matching] do
+ Logger.configure_backend(key, merged_value)
+ else
+ Logger.configure([{key, merged_value}])
+ end
+
+ nil
+ end
+ end
rescue
e ->
Logger.warn(
- "updating env causes error, key: #{inspect(setting.key)}, error: #{inspect(e)}"
+ "updating env causes error, group: #{inspect(setting.group)}, key: #{
+ inspect(setting.key)
+ }, value: #{inspect(ConfigDB.from_binary(setting.value))}, error: #{inspect(e)}"
)
nil
error -> Logger.warn(inspect(error))
end
end
+
+ defp can_be_merged?(val1, val2) when is_map(val1) and is_map(val2), do: true
+
+ defp can_be_merged?(val1, val2) when is_list(val1) and is_list(val2) do
+ Keyword.keyword?(val1) and Keyword.keyword?(val2)
+ end
+
+ defp can_be_merged?(_val1, _val2), do: false
end