lib/step_flow/router.ex

defmodule StepFlow.Router do
  use StepFlow, :router

  pipeline :api do
    plug(Plug.Parsers,
      parsers: [:json],
      pass: ["application/json"],
      json_decoder: Jason
    )
  end

  @version Mix.Project.config()[:version]

  pipe_through(:api)

  get("/", StepFlow.IndexController, :index)

  # Roles and rights APIs
  resources("/roles", StepFlow.RoleController, except: [:new, :edit])
  get("/right_definitions", StepFlow.RightDefinitionController, :index)

  # Workflow definitions APIs
  resources("/definitions", StepFlow.WorkflowDefinitionController,
    except: [:new, :edit, :delete, :update]
  )

  # Workflows APIs
  resources "/workflows", StepFlow.WorkflowController, except: [:new, :edit] do
    post("/events", StepFlow.WorkflowEventsController, :handle)
  end

  get("/workflows_status", StepFlow.WorkflowStatusController, :list)

  post("/launch_workflow", StepFlow.WorkflowController, :create)
  get("/workflows_statistics", StepFlow.WorkflowController, :statistics)

  # Statistics APIs
  get("/durations/jobs", StepFlow.DurationsController, :list_jobs_durations)
  get("/durations/workflows", StepFlow.DurationsController, :list_workflows_durations)

  get(
    "/statistics/durations/workflows",
    StepFlow.StatisticsController,
    :get_workflows_duration_statistics
  )

  get(
    "/statistics/durations/jobs",
    StepFlow.StatisticsController,
    :get_jobs_duration_statistics
  )

  # Jobs APIs
  resources("/jobs", StepFlow.JobController, except: [:new, :edit, :delete, :update])

  # Workers APIs
  resources("/worker_definitions", StepFlow.WorkerDefinitionController,
    except: [:new, :edit, :delete, :update]
  )

  # Live Workers APIs
  get("/live_workers", StepFlow.LiveWorkersController, :index)

  # Workers APIs
  resources("/workers", StepFlow.WorkersController, only: [:index, :show, :update])

  # Metrics APIs
  get("/metrics", StepFlow.MetricController, :index)

  scope "/swagger" do
    forward("/", PhoenixSwagger.Plug.SwaggerUI,
      otp_app: :step_flow,
      swagger_file: "step_flow_swagger.json"
    )
  end

  get("/*path", StepFlow.IndexController, :not_found)

  def swagger_info do
    %{
      info: %{
        version: @version,
        title: "Step Flow"
      }
    }
  end
end