more_better.jpg
This commit is contained in:
parent
02816610af
commit
c59e630d28
|
@ -2,25 +2,65 @@ defmodule Farmbot.System.ConfigStorage do
|
|||
@moduledoc "Repo for storing config data."
|
||||
use Ecto.Repo, otp_app: :farmbot, adapter: Sqlite.Ecto2
|
||||
import Ecto.Query, only: [from: 2]
|
||||
alias Farmbot.System.ConfigStorage.{Group, Config, BoolValue}
|
||||
alias Farmbot.System.ConfigStorage.{Group, Config, BoolValue, FloatValue, StringValue}
|
||||
|
||||
def get_config_value(type, group_name, key_name)
|
||||
def get_config_value(:bool, group_name, key_name) do
|
||||
[group_id] = (from g in Group, where: g.group_name == ^group_name, select: g.id) |> all()
|
||||
[type_id] = (from c in Config, where: c.group_id == ^group_id and c.key == ^key_name, select: c.bool_value_id) |> all()
|
||||
[val] = (from v in BoolValue, where: v.id == ^type_id, select: v) |> all()
|
||||
val
|
||||
@doc "Please be careful with this. It uses a lot of queries."
|
||||
def get_config_as_map do
|
||||
groups = (from g in Group, select: g) |> all()
|
||||
Map.new(groups, fn(group) ->
|
||||
vals = (from b in Config, where: b.group_id == ^group.id, select: b) |> all()
|
||||
s = Map.new(vals, fn(val) ->
|
||||
[value] = Enum.find_value(val |> Map.from_struct, fn({_key, _val} = f) ->
|
||||
case f do
|
||||
{:bool_value_id, id} when is_number(id) -> all(from v in BoolValue, where: v.id == ^id, select: v.value)
|
||||
{:float_value_id, id} when is_number(id) -> all(from v in FloatValue, where: v.id == ^id, select: v.value)
|
||||
{:string_value_id, id} when is_number(id) -> all(from v in StringValue, where: v.id == ^id, select: v.value)
|
||||
_ -> false
|
||||
end
|
||||
end)
|
||||
{val.key, value}
|
||||
end)
|
||||
{group.group_name, s}
|
||||
end)
|
||||
end
|
||||
|
||||
def update_config_value(type, group_name, key_name, value)
|
||||
def get_config_value(type, group_name, key_name) when type in [:bool, :float, :string] do
|
||||
__MODULE__
|
||||
|> apply(:"get_#{type}_value", [group_name, key_name])
|
||||
|> Map.fetch!(:value)
|
||||
end
|
||||
|
||||
def update_config_value(:bool, group_name, key_name, value) do
|
||||
get_config_value(:bool, group_name, key_name)
|
||||
def update_config_value(type, group_name, key_name, value) when type in [:bool, :float, :string] do
|
||||
__MODULE__
|
||||
|> apply(:"get_#{type}_value", [group_name, key_name])
|
||||
|> Map.put(:value, value)
|
||||
|> BoolValue.changeset()
|
||||
|> update!()
|
||||
end
|
||||
|
||||
def get_bool_value(group_name, key_name) do
|
||||
group_id = get_group_id(group_name)
|
||||
[type_id] = (from c in Config, where: c.group_id == ^group_id and c.key == ^key_name, select: c.bool_value_id) |> all()
|
||||
[val] = (from v in BoolValue, where: v.id == ^type_id, select: v) |> all()
|
||||
val
|
||||
end
|
||||
|
||||
#TODO Clean this up, implement other two types etc.
|
||||
def get_float_value(group_name, key_name) do
|
||||
group_id = get_group_id(group_name)
|
||||
[type_id] = (from c in Config, where: c.group_id == ^group_id and c.key == ^key_name, select: c.float_value_id) |> all()
|
||||
[val] = (from v in FloatValue, where: v.id == ^type_id, select: v) |> all()
|
||||
val
|
||||
end
|
||||
|
||||
def get_string_value(group_name, key_name) do
|
||||
group_id = get_group_id(group_name)
|
||||
[type_id] = (from c in Config, where: c.group_id == ^group_id and c.key == ^key_name, select: c.string_value_id) |> all()
|
||||
[val] = (from v in StringValue, where: v.id == ^type_id, select: v) |> all()
|
||||
val
|
||||
end
|
||||
|
||||
defp get_group_id(group_name) do
|
||||
[group_id] = (from g in Group, where: g.group_name == ^group_name, select: g.id) |> all()
|
||||
group_id
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,6 +3,7 @@ defmodule Farmbot.System.ConfigStorage.Config do
|
|||
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Farmbot.System.ConfigStorage.{Group, BoolValue, FloatValue, StringValue}
|
||||
|
||||
schema "configs" do
|
||||
belongs_to :group, Group
|
||||
|
|
|
@ -4,7 +4,7 @@ defmodule Farmbot.System.ConfigStorage.Migrations.SeedGroups do
|
|||
alias ConfigStorage.{Config, Group, StringValue, BoolValue, FloatValue}
|
||||
import Ecto.Query, only: [from: 2]
|
||||
|
||||
@group_names ["network", "authorization", "hardware", "hardware_params", "settings"]
|
||||
@group_names ["network", "network_interface", "authorization", "hardware", "hardware_params", "settings", "user_env"]
|
||||
|
||||
def change do
|
||||
populate_config_groups()
|
||||
|
@ -20,17 +20,52 @@ defmodule Farmbot.System.ConfigStorage.Migrations.SeedGroups do
|
|||
end
|
||||
|
||||
defp populate_config_values do
|
||||
for name <- ["network"] do
|
||||
for name <- @group_names do
|
||||
[group_id] = (from g in Group, where: g.group_name == ^name, select: g.id) |> ConfigStorage.all()
|
||||
populate_config_values(name, group_id)
|
||||
end
|
||||
end
|
||||
|
||||
defp populate_config_values("network", group_id) do
|
||||
ssh_value = create_value(BoolValue, false)
|
||||
create_value(BoolValue, false) |> create_config(group_id, "ssh")
|
||||
create_value(BoolValue, true) |> create_config(group_id, "ntp")
|
||||
end
|
||||
|
||||
defp populate_config_values("network_interface", group_id) do
|
||||
|
||||
end
|
||||
|
||||
defp populate_config_values("authorization", group_id) do
|
||||
create_value(StringValue, "https://my.farmbot.io") |> create_config(group_id, "server")
|
||||
create_value(StringValue, nil) |> create_config(group_id, "email")
|
||||
create_value(StringValue, nil) |> create_config(group_id, "password")
|
||||
create_value(StringValue, nil) |> create_config(group_id, "token")
|
||||
end
|
||||
|
||||
defp populate_config_values("hardware", group_id) do
|
||||
create_value(BoolValue, false) |> create_config(group_id, "custom_fw")
|
||||
create_value(StringValue, nil) |> create_config(group_id, "firmware_hardware")
|
||||
end
|
||||
|
||||
defp populate_config_values("hardware_params", group_id) do
|
||||
|
||||
end
|
||||
|
||||
defp populate_config_values("settings", group_id) do
|
||||
create_value(BoolValue, false) |> create_config(group_id, "os_auto_update")
|
||||
create_value(BoolValue, true) |> create_config(group_id, "first_party_farmware")
|
||||
create_value(StringValue, nil) |> create_config(group_id, "timezone")
|
||||
end
|
||||
|
||||
defp populate_config_values("user_env", group_id) do
|
||||
|
||||
end
|
||||
|
||||
|
||||
defp create_config(value, group_id, key) do
|
||||
%Config{group_id: group_id,
|
||||
bool_value_id: ssh_value.id,
|
||||
key: "ssh"}
|
||||
key: key}
|
||||
|> Map.put(:"#{Module.split(value.__struct__) |> List.last() |> Macro.underscore()}_id", value.id)
|
||||
|> Config.changeset()
|
||||
|> ConfigStorage.insert!()
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue