Merge develop
[akkoma] / lib / pleroma / config / transfer_task.ex
1 defmodule Pleroma.Config.TransferTask do
2 use Task
3 alias Pleroma.Web.AdminAPI.Config
4
5 def start_link do
6 load_and_update_env()
7 if Pleroma.Config.get(:env) == :test, do: Ecto.Adapters.SQL.Sandbox.checkin(Pleroma.Repo)
8 :ignore
9 end
10
11 def load_and_update_env do
12 if Pleroma.Config.get([:instance, :dynamic_configuration]) and
13 Ecto.Adapters.SQL.table_exists?(Pleroma.Repo, "config") do
14 for_restart =
15 Pleroma.Repo.all(Config)
16 |> Enum.map(&update_env(&1))
17
18 # We need to restart applications for loaded settings take effect
19 for_restart
20 |> Enum.reject(&(&1 in [:pleroma, :ok]))
21 |> Enum.each(fn app ->
22 Application.stop(app)
23 :ok = Application.start(app)
24 end)
25 end
26 end
27
28 defp update_env(setting) do
29 try do
30 key =
31 if String.starts_with?(setting.key, "Pleroma.") do
32 "Elixir." <> setting.key
33 else
34 setting.key
35 end
36
37 group = String.to_existing_atom(setting.group)
38
39 Application.put_env(
40 group,
41 String.to_existing_atom(key),
42 Config.from_binary(setting.value)
43 )
44
45 group
46 rescue
47 e ->
48 require Logger
49
50 Logger.warn(
51 "updating env causes error, key: #{inspect(setting.key)}, error: #{inspect(e)}"
52 )
53 end
54 end
55 end