lib/step_flow/controllers/workflow_definition_controller.ex

defmodule StepFlow.WorkflowDefinitionController do
  use StepFlow, :controller
  use PhoenixSwagger

  import Plug.Conn

  alias StepFlow.Controller.Helpers
  alias StepFlow.WorkflowDefinitions
  alias StepFlow.WorkflowDefinitions.WorkflowDefinition
  require Logger

  action_fallback(StepFlow.FallbackController)

  swagger_path :index do
    get("/definitions")
    description("List workflow definitions")

    parameters do
      versions(:query, :array, "List of versions to match", items: [type: :string])
      mode(:query, :array, "Output mode", items: [type: :string, enum: [:full, :simple]])
    end

    response(200, "Success")
    response(403, "Forbidden")
  end

  def index(%Plug.Conn{assigns: %{current_user: user}} = conn, params) do
    params =
      params
      |> Map.put("roles", StepFlow.Map.get_by_key_or_atom(user, :roles, []))
      |> Map.put("versions", StepFlow.Map.get_by_key_or_atom(params, :versions, []))
      |> Map.put("mode", StepFlow.Map.get_by_key_or_atom(params, :mode, "full"))

    workflow_definitions = WorkflowDefinitions.list_workflow_definitions(params)

    conn
    |> put_view(StepFlow.WorkflowDefinitionView)
    |> render("index.json", workflow_definitions: workflow_definitions)
  end

  def index(conn, _) do
    conn
    |> put_status(403)
    |> put_view(StepFlow.WorkflowDefinitionView)
    |> render("error.json",
      errors: %{reason: "Forbidden to view workflows"}
    )
  end

  def show(%Plug.Conn{assigns: %{current_user: user}} = conn, %{"id" => identifier}) do
    case WorkflowDefinitions.get_workflow_definition(identifier) do
      nil ->
        conn
        |> put_status(:unprocessable_entity)
        |> put_view(StepFlow.WorkflowDefinitionView)
        |> render("error.json",
          errors: %{reason: "Unable to locate workflow with this identifier"}
        )

      workflow_definition ->
        if Helpers.has_right?("workflow::" <> identifier, user, "view") do
          conn
          |> put_view(StepFlow.WorkflowDefinitionView)
          |> render("show.json", workflow_definition: workflow_definition)
        else
          conn
          |> put_status(:forbidden)
          |> put_view(StepFlow.WorkflowDefinitionView)
          |> render("error.json",
            errors: %{reason: "Forbidden to access workflow definition with this identifier"}
          )
        end
    end
  end

  def show(conn, _) do
    conn
    |> put_status(403)
    |> put_view(StepFlow.WorkflowDefinitionView)
    |> render("error.json",
      errors: %{reason: "Forbidden to view workflow with this identifier"}
    )
  end

  def create(conn, _) do
    workflows = WorkflowDefinition.load_workflows_in_database()
    Logger.info("#{inspect(workflows)}")

    json(conn, %{})
  end
end