more_better.jpg

This commit is contained in:
connor rigby 2017-09-25 15:16:26 -07:00
parent 02816610af
commit c59e630d28
3 changed files with 92 additions and 16 deletions

View file

@ -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

View file

@ -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

View file

@ -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