lib/step_flow/updates/updates.ex

defmodule StepFlow.Updates do
  @moduledoc """
  The Updates context.
  """

  import Ecto.Query, warn: false
  alias StepFlow.Jobs
  alias StepFlow.Jobs.Status
  alias StepFlow.Repo
  alias StepFlow.Updates.Update

  @doc """
  Creates an update.

  ## Examples

      iex> create_update(%{field: value})
      {:ok, %Update{}}

      iex> create_update(%{field: bad_value})
      {:error, %Ecto.Changeset{}}

  """
  def create_update(attrs \\ %{}) do
    %Update{}
    |> Update.changeset(attrs)
    |> Repo.insert()
  end

  def update_parameters(job, parameters) do
    job_parameters =
      job.parameters
      |> update_parameter(parameters)

    Jobs.update_job(job, %{parameters: job_parameters})
    Status.set_job_status(job.id, :update, "Updating parameters")

    create_update(%{
      job_id: job.id,
      datetime: NaiveDateTime.utc_now(),
      parameters: parameters
    })
  end

  def update_parameter(job_parameters, [parameter | parameters]) do
    Enum.map(job_parameters, fn x ->
      if x["id"] == parameter.id do
        x
        |> Map.replace("value", parameter.value)
      else
        x
      end
    end)
    |> update_parameter(parameters)
  end

  def update_parameter(job_parameters, []), do: job_parameters
end