lib/step_flow/controllers/job_controller.ex

defmodule StepFlow.JobController do
  use StepFlow, :controller

  alias StepFlow.Controller.Helpers
  alias StepFlow.Jobs
  alias StepFlow.Repo
  alias StepFlow.Workflows

  action_fallback(ExBackendWeb.FallbackController)

  def index(%Plug.Conn{assigns: %{current_user: user}} = conn, params) do
    jobs =
      params
      |> Map.put("roles", user.roles)
      |> Jobs.list_jobs()

    conn
    |> put_view(StepFlow.JobView)
    |> render("index.json", jobs: jobs)
  end

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

  def show(%Plug.Conn{assigns: %{current_user: user}} = conn, %{"id" => id}) do
    job =
      Jobs.get_job!(id)
      |> Repo.preload([:status])

    workflow = Workflows.get_workflow_for_job!(id)

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

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