lib/step_flow/controllers/workers_controller.ex

defmodule StepFlow.WorkersController do
  use StepFlow, :controller

  require Logger

  alias StepFlow.Amqp.CommonEmitter
  alias StepFlow.Workers.WorkerStatuses

  action_fallback(StepFlow.FallbackController)

  def index(conn, params) do
    Logger.debug("[#{__MODULE__}] List worker statuses request: #{inspect(params)}")

    worker_statuses = WorkerStatuses.list_worker_statuses(params)

    conn
    |> put_view(StepFlow.WorkerStatusView)
    |> render("index.json", worker_statuses)
  end

  def show(conn, %{"id" => instance_id}) do
    Logger.debug("[#{__MODULE__}] Show worker status request: #{inspect(instance_id)}")

    case WorkerStatuses.get_worker_status(instance_id) do
      nil ->
        conn
        |> send_resp(404, "No such a worker could be found. ")

      worker_status ->
        conn
        |> put_view(StepFlow.WorkerStatusView)
        |> render("worker_status.json", %{worker_status: worker_status})
    end
  end

  def update(conn, params) do
    Logger.debug("[#{__MODULE__}] Put order message request: #{inspect(params)}")

    instance_id = Map.get(params, "id")

    order_message =
      Map.delete(params, "id")
      |> Jason.encode!()

    Logger.info(
      "[#{__MODULE__}] Send order to worker #{inspect(instance_id)}: #{inspect(order_message)}"
    )

    CommonEmitter.publish(
      "",
      order_message,
      [headers: [instance_id: instance_id]],
      "direct_messaging"
    )

    conn
    |> send_resp(204, "")
  end
end