+ other
+ |> Enum.map(&update/1)
+ |> Enum.uniq()
+ |> Enum.reject(&(&1 in reject))
+ |> maybe_set_pleroma_last()
+ |> Enum.each(&restart(started_applications, &1, Config.get(:env)))
+
+ :ok
+ else
+ {:configurable, false} -> Restarter.Pleroma.rebooted()
+ end
+ end
+
+ defp maybe_set_pleroma_last(apps) do
+ # to be ensured that pleroma will be restarted last
+ if :pleroma in apps do
+ apps
+ |> List.delete(:pleroma)
+ |> List.insert_at(-1, :pleroma)
+ else
+ Restarter.Pleroma.rebooted()
+ apps
+ end
+ end
+
+ defp invalid_key_or_group(%ConfigDB{key: :invalid_atom}), do: true
+ defp invalid_key_or_group(%ConfigDB{group: :invalid_atom}), do: true
+ defp invalid_key_or_group(_), do: false
+
+ defp merge_with_default(%{group: group, key: key, value: value} = setting) do
+ default =
+ if group == :pleroma do
+ Config.get([key], Config.Holder.default_config(group, key))
+ else
+ Config.Holder.default_config(group, key)
+ end
+
+ merged =
+ cond do
+ Ecto.get_meta(setting, :state) == :deleted -> default
+ can_be_merged?(default, value) -> ConfigDB.merge_group(group, key, default, value)
+ true -> value
+ end
+
+ {group, key, value, merged}
+ end
+
+ defp configure({_, :backends, _, merged}) do
+ # removing current backends
+ Enum.each(Application.get_env(:logger, :backends), &Logger.remove_backend/1)
+
+ Enum.each(merged, &Logger.add_backend/1)