From acf4de067118d6f602df73614b5634a53bf1599d Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Tue, 19 Mar 2019 11:35:09 -0500 Subject: [PATCH] Add enigmas table / private asset --- .gitignore | 1 + .../lib/farmbot_core/asset/private/enigma.ex | 27 +++++++++++++++++++ farmbot_core/lib/farmbot_core/bot_state_ng.ex | 12 +++++++++ .../20190319162822_add_enigmas_table.exs | 12 +++++++++ 4 files changed, 52 insertions(+) create mode 100644 farmbot_core/lib/farmbot_core/asset/private/enigma.ex create mode 100644 farmbot_core/priv/asset/migrations/20190319162822_add_enigmas_table.exs diff --git a/.gitignore b/.gitignore index 98f11138..d7f32acf 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ erl_crash.dump *.js /release-* /node_modules +scratchpad.* # Various env vars. .env diff --git a/farmbot_core/lib/farmbot_core/asset/private/enigma.ex b/farmbot_core/lib/farmbot_core/asset/private/enigma.ex new file mode 100644 index 00000000..0d6565d2 --- /dev/null +++ b/farmbot_core/lib/farmbot_core/asset/private/enigma.ex @@ -0,0 +1,27 @@ +defmodule FarmbotCore.Asset.Private.Enigma do + @moduledoc """ + An Enigma is essentially a merge conflict- + it represents data that has two conflicting + forms in two different systems (eg: API vs. Bot) + and requires human intervention to rectify. + """ + alias FarmbotCore.Asset.Private.Enigma + use Ecto.Schema + + @behaviour FarmbotCore.Asset.View + + schema "enigmas" do + field(:priority, :integer) + field(:problem_tag, :string) + field(:created_at, :utc_datetime) + end + + @doc false + def render(%Enigma{} = data) do + %{ + priority: data.priority, + problem_tag: data.problem_tag, + created_at: DateTime.to_unix(data.utc_datetime) + } + end +end diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng.ex b/farmbot_core/lib/farmbot_core/bot_state_ng.ex index 7835a209..7254be51 100644 --- a/farmbot_core/lib/farmbot_core/bot_state_ng.ex +++ b/farmbot_core/lib/farmbot_core/bot_state_ng.ex @@ -21,6 +21,7 @@ defmodule FarmbotCore.BotStateNG do field(:process_info, {:map, {:string, :any}}, default: %{farmwares: %{}}) field(:pins, {:map, {:integer, :map}}, default: %{}) field(:jobs, {:map, {:string, :map}}, default: %{}) + field(:enigmas, {:map, {:string, :map}}, default: %{}) end def new do @@ -101,4 +102,15 @@ defmodule FarmbotCore.BotStateNG do put_change(cs, :jobs, new_jobs) end + + def set_enigma(state, %{uuid: uuid} = enigma) do + cs = changeset(state, %{}) + + new_enigmas = + cs + |> get_field(:enigmas) + |> Map.put(uuid, enigma) + + put_change(cs, :enigmas, new_enigmas) + end end diff --git a/farmbot_core/priv/asset/migrations/20190319162822_add_enigmas_table.exs b/farmbot_core/priv/asset/migrations/20190319162822_add_enigmas_table.exs new file mode 100644 index 00000000..694e02a6 --- /dev/null +++ b/farmbot_core/priv/asset/migrations/20190319162822_add_enigmas_table.exs @@ -0,0 +1,12 @@ +defmodule FarmbotCore.Config.Repo.Migrations.AddEnigmasTable do + use Ecto.Migration + + def change do + create table("enigmas", primary_key: false) do + add(:uuid, :binary_id, primary_key: true) + add(:problem_tag, :string) + add(:priority, :integer) + add(:created_at, :utc_datetime) + end + end +end