73 lines
1.5 KiB
Elixir
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
|