lib/step_flow/models/worker_definitions/worker_definitions.ex

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

  import Ecto.Query, warn: false
  alias StepFlow.Repo

  alias StepFlow.WorkerDefinitions.WorkerDefinition

  @doc """
  Returns the list of WorkerDefinitions.

  ## Examples

      iex> StepFlow.WorkerDefinitions.list_worker_definitions()
      %{data: [], page: 0, size: 10, total: 0}

  """
  def list_worker_definitions(params \\ %{}) do
    page =
      Map.get(params, "page", 0)
      |> StepFlow.Integer.force()

    size =
      Map.get(params, "size", 10)
      |> StepFlow.Integer.force()

    offset = page * size

    query = from(worker_definition in WorkerDefinition)

    total_query = from(item in query, select: count(item.id))

    total =
      Repo.all(total_query)
      |> List.first()

    query =
      from(
        job in query,
        order_by: [desc: :inserted_at],
        offset: ^offset,
        limit: ^size
      )

    jobs = Repo.all(query)

    %{
      data: jobs,
      total: total,
      page: page,
      size: size
    }
  end

  @doc """
  Gets a single WorkerDefinition.

  Raises `Ecto.NoResultsError` if the WorkerDefinition does not exist.
  """
  def get_worker_definition!(id), do: Repo.get!(WorkerDefinition, id)

  @doc """
  Creates a WorkerDefinition.

  ## Examples

      iex> result = StepFlow.WorkerDefinitions.create_worker_definition(%{
      ...>   queue_name: "my_queue",
      ...>   label: "My Queue",
      ...>   version: "1.2.3",
      ...>   short_description: "short description",
      ...>   description: "long description",
      ...>   parameters: %{}
      ...> })
      ...> match?({:ok, %StepFlow.WorkerDefinitions.WorkerDefinition{}}, result)
      true

      iex> result = StepFlow.WorkerDefinitions.create_worker_definition(%{field: :bad_value})
      ...> match?({:error, %Ecto.Changeset{}}, result)
      true

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

  def exists(%{"queue_name" => queue_name, "version" => version}) do
    case Repo.get_by(WorkerDefinition, queue_name: queue_name, version: version) do
      nil -> false
      _ -> true
    end
  end

  def exists(_), do: false
end