farmbot_os/farmbot_os/lib/farmbot_os/sys_calls/resource_update.ex

73 lines
1.5 KiB
Elixir

defmodule FarmbotOS.SysCalls.ResourceUpdate do
@moduledoc false
require Logger
alias FarmbotCore.{
Asset,
Asset.Private
}
alias FarmbotOS.SysCalls.SendMessage
@point_kinds ~w(Plant GenericPointer)
def resource_update("Device", 0, params) do
params
|> do_handlebars()
|> Asset.update_device!()
|> Private.mark_dirty!()
:ok
end
def resource_update(kind, id, params) when kind in @point_kinds do
params = do_handlebars(params)
point_resource_update(kind, id, params)
end
def resource_update(kind, id, _params) do
{:error,
"""
Unknown resource: #{kind}.#{id}
"""}
end
@doc false
def point_resource_update(type, id, params) do
with %{} = point <- Asset.get_point(pointer_type: type, id: id),
{:ok, point} <- Asset.update_point(point, params) do
_ = Private.mark_dirty!(point)
:ok
else
nil ->
{:error,
"#{type}.#{id} is not currently synced, so it could not be updated"}
{:error, _changeset} ->
{:error, "Failed to update #{type}.#{id}"}
end
end
@doc false
def do_handlebars(params) do
Map.new(params, fn
{key, value} when is_binary(value) ->
case SendMessage.render(value) do
{:ok, rendered} ->
{key, rendered}
_ ->
Logger.warn(
"failed to render #{key} => #{value} for resource_update"
)
{key, value}
end
{key, value} ->
{key, value}
end)
end
end