return db key on update requests
This commit is contained in:
parent
7676ed8239
commit
89e93fb33f
|
@ -16,6 +16,7 @@ defmodule Pleroma.ConfigDB do
|
||||||
field(:key, :string)
|
field(:key, :string)
|
||||||
field(:group, :string)
|
field(:group, :string)
|
||||||
field(:value, :binary)
|
field(:value, :binary)
|
||||||
|
field(:db, {:array, :string}, virtual: true, default: [])
|
||||||
|
|
||||||
timestamps()
|
timestamps()
|
||||||
end
|
end
|
||||||
|
@ -61,6 +62,22 @@ def update(%ConfigDB{} = config, %{value: value}) do
|
||||||
|> Repo.update()
|
|> Repo.update()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@spec get_db_keys(ConfigDB.t()) :: [String.t()]
|
||||||
|
def get_db_keys(%ConfigDB{} = config) do
|
||||||
|
config.value
|
||||||
|
|> ConfigDB.from_binary()
|
||||||
|
|> get_db_keys(config.key)
|
||||||
|
end
|
||||||
|
|
||||||
|
@spec get_db_keys(keyword() | any()) :: [String.t()]
|
||||||
|
def get_db_keys(value, key) do
|
||||||
|
if Keyword.keyword?(value) do
|
||||||
|
value |> Keyword.keys() |> Enum.map(&convert(&1))
|
||||||
|
else
|
||||||
|
[convert(key)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@full_key_update [
|
@full_key_update [
|
||||||
{:pleroma, :ecto_repos},
|
{:pleroma, :ecto_repos},
|
||||||
{:pleroma, :assets},
|
{:pleroma, :assets},
|
||||||
|
@ -317,7 +334,7 @@ defp do_transform_string(value) do
|
||||||
|
|
||||||
@spec is_module_name?(String.t()) :: boolean()
|
@spec is_module_name?(String.t()) :: boolean()
|
||||||
def is_module_name?(string) do
|
def is_module_name?(string) do
|
||||||
Regex.match?(~r/^(Pleroma|Phoenix|Tesla|Quack)\./, string) or
|
Regex.match?(~r/^(Pleroma|Phoenix|Tesla|Quack|Ueberauth)\./, string) or
|
||||||
string in ["Oban", "Ueberauth", "ExSyslogger"]
|
string in ["Oban", "Ueberauth", "ExSyslogger"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,8 +15,8 @@ def load(path), do: Config.Reader.read!(path)
|
||||||
# support for Elixir less than 1.9
|
# support for Elixir less than 1.9
|
||||||
@spec load() :: map()
|
@spec load() :: map()
|
||||||
def load do
|
def load do
|
||||||
{config, _paths} = load("config/config.exs")
|
config = load("config/config.exs")
|
||||||
{env_config, _paths} = load("config/#{Mix.env()}.exs")
|
env_config = load("config/#{Mix.env()}.exs")
|
||||||
|
|
||||||
Mix.Config.merge(config, env_config)
|
Mix.Config.merge(config, env_config)
|
||||||
end
|
end
|
||||||
|
|
|
@ -66,7 +66,9 @@ defp update_env(setting) do
|
||||||
rescue
|
rescue
|
||||||
e ->
|
e ->
|
||||||
Logger.warn(
|
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
|
nil
|
||||||
|
|
|
@ -827,15 +827,11 @@ def config_show(conn, _params) do
|
||||||
merged =
|
merged =
|
||||||
Pleroma.Config.Holder.config()
|
Pleroma.Config.Holder.config()
|
||||||
|> DeepMerge.deep_merge(configs)
|
|> DeepMerge.deep_merge(configs)
|
||||||
|> Enum.map(fn {group, value} ->
|
|> Enum.map(fn {group, values} ->
|
||||||
Enum.map(value, fn {key, value} ->
|
Enum.map(values, fn {key, value} ->
|
||||||
db =
|
db =
|
||||||
if configs[group][key] do
|
if configs[group][key] do
|
||||||
if Keyword.keyword?(value) do
|
ConfigDB.get_db_keys(value, key)
|
||||||
Keyword.keys(value) |> Enum.map(fn key -> ConfigDB.convert(key) end)
|
|
||||||
else
|
|
||||||
ConfigDB.convert(key)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
setting = %{
|
setting = %{
|
||||||
|
@ -871,6 +867,9 @@ def config_update(conn, %{"configs" => configs}) do
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|> Enum.reject(&is_nil(&1))
|
|> Enum.reject(&is_nil(&1))
|
||||||
|
|> Enum.map(fn config ->
|
||||||
|
Map.put(config, :db, ConfigDB.get_db_keys(config))
|
||||||
|
end)
|
||||||
|
|
||||||
Pleroma.Config.TransferTask.load_and_update_env()
|
Pleroma.Config.TransferTask.load_and_update_env()
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,16 @@ def render("index.json", %{configs: configs}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("show.json", %{config: config}) do
|
def render("show.json", %{config: config}) do
|
||||||
%{
|
map = %{
|
||||||
key: config.key,
|
key: config.key,
|
||||||
group: config.group,
|
group: config.group,
|
||||||
value: Pleroma.ConfigDB.from_binary_with_convert(config.value)
|
value: Pleroma.ConfigDB.from_binary_with_convert(config.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.db != [] do
|
||||||
|
Map.put(map, :db, config.db)
|
||||||
|
else
|
||||||
|
map
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -86,6 +86,6 @@ test "non existing atom" do
|
||||||
assert ExUnit.CaptureLog.capture_log(fn ->
|
assert ExUnit.CaptureLog.capture_log(fn ->
|
||||||
Pleroma.Config.TransferTask.start_link([])
|
Pleroma.Config.TransferTask.start_link([])
|
||||||
end) =~
|
end) =~
|
||||||
"updating env causes error, key: \":undefined_atom_key\", error: %ArgumentError{message: \"argument error\"}"
|
"updating env causes error, group: \":pleroma\", key: \":undefined_atom_key\", value: [live: 2, com: 3], error: %ArgumentError{message: \"argument error\"}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1936,7 +1936,7 @@ test "merged default setting with db settings", %{conn: conn} do
|
||||||
|> ConfigDB.convert()
|
|> ConfigDB.convert()
|
||||||
|
|
||||||
Enum.each(received_configs, fn %{"value" => value, "db" => db} ->
|
Enum.each(received_configs, fn %{"value" => value, "db" => db} ->
|
||||||
assert db in [config1.key, config2.key, db_keys]
|
assert db in [[config1.key], [config2.key], db_keys]
|
||||||
|
|
||||||
assert value in [
|
assert value in [
|
||||||
ConfigDB.from_binary_with_convert(config1.value),
|
ConfigDB.from_binary_with_convert(config1.value),
|
||||||
|
@ -1985,7 +1985,7 @@ test "create new config setting in db", %{conn: conn} do
|
||||||
%{group: ":pleroma", key: ":key1", value: "value1"},
|
%{group: ":pleroma", key: ":key1", value: "value1"},
|
||||||
%{
|
%{
|
||||||
group: ":ueberauth",
|
group: ":ueberauth",
|
||||||
key: "Ueberauth.Strategy.Twitter.OAuth",
|
key: "Ueberauth",
|
||||||
value: [%{"tuple" => [":consumer_secret", "aaaa"]}]
|
value: [%{"tuple" => [":consumer_secret", "aaaa"]}]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
|
@ -2025,12 +2025,14 @@ test "create new config setting in db", %{conn: conn} do
|
||||||
%{
|
%{
|
||||||
"group" => ":pleroma",
|
"group" => ":pleroma",
|
||||||
"key" => ":key1",
|
"key" => ":key1",
|
||||||
"value" => "value1"
|
"value" => "value1",
|
||||||
|
"db" => [":key1"]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
"group" => ":ueberauth",
|
"group" => ":ueberauth",
|
||||||
"key" => "Ueberauth.Strategy.Twitter.OAuth",
|
"key" => "Ueberauth",
|
||||||
"value" => [%{"tuple" => [":consumer_secret", "aaaa"]}]
|
"value" => [%{"tuple" => [":consumer_secret", "aaaa"]}],
|
||||||
|
"db" => [":consumer_secret"]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
"group" => ":pleroma",
|
"group" => ":pleroma",
|
||||||
|
@ -2041,7 +2043,8 @@ test "create new config setting in db", %{conn: conn} do
|
||||||
%{":nested_22" => "nested_value222"},
|
%{":nested_22" => "nested_value222"},
|
||||||
%{":nested_33" => %{":nested_44" => "nested_444"}}
|
%{":nested_33" => %{":nested_44" => "nested_444"}}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
"db" => [":key2"]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
"group" => ":pleroma",
|
"group" => ":pleroma",
|
||||||
|
@ -2049,17 +2052,20 @@ test "create new config setting in db", %{conn: conn} do
|
||||||
"value" => [
|
"value" => [
|
||||||
%{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
|
%{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
|
||||||
%{"nested_4" => true}
|
%{"nested_4" => true}
|
||||||
]
|
],
|
||||||
|
"db" => [":key3"]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
"group" => ":pleroma",
|
"group" => ":pleroma",
|
||||||
"key" => ":key4",
|
"key" => ":key4",
|
||||||
"value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"}
|
"value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"},
|
||||||
|
"db" => [":key4"]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
"group" => ":idna",
|
"group" => ":idna",
|
||||||
"key" => ":key5",
|
"key" => ":key5",
|
||||||
"value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}
|
"value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]},
|
||||||
|
"db" => [":key5"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2121,12 +2127,23 @@ test "save config setting without key", %{conn: conn} do
|
||||||
|
|
||||||
assert json_response(conn, 200) == %{
|
assert json_response(conn, 200) == %{
|
||||||
"configs" => [
|
"configs" => [
|
||||||
%{"group" => ":quack", "key" => ":level", "value" => ":info"},
|
%{
|
||||||
%{"group" => ":quack", "key" => ":meta", "value" => [":none"]},
|
"group" => ":quack",
|
||||||
|
"key" => ":level",
|
||||||
|
"value" => ":info",
|
||||||
|
"db" => [":level"]
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"group" => ":quack",
|
||||||
|
"key" => ":meta",
|
||||||
|
"value" => [":none"],
|
||||||
|
"db" => [":meta"]
|
||||||
|
},
|
||||||
%{
|
%{
|
||||||
"group" => ":quack",
|
"group" => ":quack",
|
||||||
"key" => ":webhook_url",
|
"key" => ":webhook_url",
|
||||||
"value" => "https://hooks.slack.com/services/KEY"
|
"value" => "https://hooks.slack.com/services/KEY",
|
||||||
|
"db" => [":webhook_url"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2155,7 +2172,8 @@ test "saving config with partial update", %{conn: conn} do
|
||||||
%{"tuple" => [":key1", 1]},
|
%{"tuple" => [":key1", 1]},
|
||||||
%{"tuple" => [":key2", 2]},
|
%{"tuple" => [":key2", 2]},
|
||||||
%{"tuple" => [":key3", 3]}
|
%{"tuple" => [":key3", 3]}
|
||||||
]
|
],
|
||||||
|
"db" => [":key1", ":key2", ":key3"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2205,7 +2223,8 @@ test "saving config with nested merge", %{conn: conn} do
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"db" => [":key1", ":key3", ":key2"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2242,7 +2261,8 @@ test "saving special atoms", %{conn: conn} do
|
||||||
[%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}]
|
[%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"db" => [":ssl_options"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2282,7 +2302,8 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do
|
||||||
"value" => [
|
"value" => [
|
||||||
":console",
|
":console",
|
||||||
%{"tuple" => ["ExSyslogger", ":ex_syslogger"]}
|
%{"tuple" => ["ExSyslogger", ":ex_syslogger"]}
|
||||||
]
|
],
|
||||||
|
"db" => [":backends"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2318,7 +2339,8 @@ test "saving full setting if value is not keyword", %{conn: conn} do
|
||||||
%{
|
%{
|
||||||
"group" => ":tesla",
|
"group" => ":tesla",
|
||||||
"key" => ":adapter",
|
"key" => ":adapter",
|
||||||
"value" => "Tesla.Adapter.Httpc"
|
"value" => "Tesla.Adapter.Httpc",
|
||||||
|
"db" => [":adapter"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2351,7 +2373,8 @@ test "update config setting & delete", %{conn: conn} do
|
||||||
%{
|
%{
|
||||||
"group" => ":pleroma",
|
"group" => ":pleroma",
|
||||||
"key" => config1.key,
|
"key" => config1.key,
|
||||||
"value" => "another_value"
|
"value" => "another_value",
|
||||||
|
"db" => [":keyaa1"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2384,7 +2407,11 @@ test "common config example", %{conn: conn} do
|
||||||
%{"tuple" => [":name", "Pleroma"]}
|
%{"tuple" => [":name", "Pleroma"]}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
%{"group" => ":tesla", "key" => ":adapter", "value" => "Tesla.Adapter.Httpc"}
|
%{
|
||||||
|
"group" => ":tesla",
|
||||||
|
"key" => ":adapter",
|
||||||
|
"value" => "Tesla.Adapter.Httpc"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -2408,9 +2435,27 @@ test "common config example", %{conn: conn} do
|
||||||
%{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]},
|
%{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]},
|
||||||
%{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]},
|
%{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]},
|
||||||
%{"tuple" => [":name", "Pleroma"]}
|
%{"tuple" => [":name", "Pleroma"]}
|
||||||
|
],
|
||||||
|
"db" => [
|
||||||
|
":enabled",
|
||||||
|
":method",
|
||||||
|
":seconds_valid",
|
||||||
|
":path",
|
||||||
|
":key1",
|
||||||
|
":partial_chain",
|
||||||
|
":regex1",
|
||||||
|
":regex2",
|
||||||
|
":regex3",
|
||||||
|
":regex4",
|
||||||
|
":name"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
%{"group" => ":tesla", "key" => ":adapter", "value" => "Tesla.Adapter.Httpc"}
|
%{
|
||||||
|
"group" => ":tesla",
|
||||||
|
"key" => ":adapter",
|
||||||
|
"value" => "Tesla.Adapter.Httpc",
|
||||||
|
"db" => [":adapter"]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -2540,7 +2585,8 @@ test "tuples with more than two values", %{conn: conn} do
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"db" => [":http"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2602,7 +2648,8 @@ test "settings with nesting map", %{conn: conn} do
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"db" => [":key2", ":key3"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2626,7 +2673,8 @@ test "value as map", %{conn: conn} do
|
||||||
%{
|
%{
|
||||||
"group" => ":pleroma",
|
"group" => ":pleroma",
|
||||||
"key" => ":key1",
|
"key" => ":key1",
|
||||||
"value" => %{"key" => "some_val"}
|
"value" => %{"key" => "some_val"},
|
||||||
|
"db" => [":key1"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2665,6 +2713,15 @@ test "queues key as atom", %{conn: conn} do
|
||||||
%{"tuple" => [":transmogrifier", 20]},
|
%{"tuple" => [":transmogrifier", 20]},
|
||||||
%{"tuple" => [":scheduled_activities", 10]},
|
%{"tuple" => [":scheduled_activities", 10]},
|
||||||
%{"tuple" => [":background", 5]}
|
%{"tuple" => [":background", 5]}
|
||||||
|
],
|
||||||
|
"db" => [
|
||||||
|
":federator_incoming",
|
||||||
|
":federator_outgoing",
|
||||||
|
":web_push",
|
||||||
|
":mailer",
|
||||||
|
":transmogrifier",
|
||||||
|
":scheduled_activities",
|
||||||
|
":background"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -2695,7 +2752,8 @@ test "delete part of settings by atom subkeys", %{conn: conn} do
|
||||||
%{
|
%{
|
||||||
"group" => ":pleroma",
|
"group" => ":pleroma",
|
||||||
"key" => ":keyaa1",
|
"key" => ":keyaa1",
|
||||||
"value" => [%{"tuple" => [":subkey2", "val2"]}]
|
"value" => [%{"tuple" => [":subkey2", "val2"]}],
|
||||||
|
"db" => [":subkey2"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2724,7 +2782,8 @@ test "proxy tuple localhost", %{conn: conn} do
|
||||||
"value" => [
|
"value" => [
|
||||||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]},
|
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]},
|
||||||
%{"tuple" => [":send_user_agent", false]}
|
%{"tuple" => [":send_user_agent", false]}
|
||||||
]
|
],
|
||||||
|
"db" => [":proxy_url", ":send_user_agent"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2753,7 +2812,8 @@ test "proxy tuple domain", %{conn: conn} do
|
||||||
"value" => [
|
"value" => [
|
||||||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]},
|
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]},
|
||||||
%{"tuple" => [":send_user_agent", false]}
|
%{"tuple" => [":send_user_agent", false]}
|
||||||
]
|
],
|
||||||
|
"db" => [":proxy_url", ":send_user_agent"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2782,7 +2842,8 @@ test "proxy tuple ip", %{conn: conn} do
|
||||||
"value" => [
|
"value" => [
|
||||||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]},
|
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]},
|
||||||
%{"tuple" => [":send_user_agent", false]}
|
%{"tuple" => [":send_user_agent", false]}
|
||||||
]
|
],
|
||||||
|
"db" => [":proxy_url", ":send_user_agent"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue