Current section

Files

Jump to
roger_ui lib web jobs_plug.ex
Raw

lib/web/jobs_plug.ex

defmodule RogerUI.Web.JobsPlug do
@moduledoc """
Handles endpoints for processing jobs API calls
Jobs are managed in the UI trough API calls. These jobs are presented, filtred, canceled, among others operations
by handlers herein described with Plug
"""
require Logger
alias RogerUI.Web.JobsPlug.Router
def init(opts), do: opts
def call(conn, opts) do
Router.call(conn, Router.init(opts))
end
defmodule Router do
@moduledoc """
Plug Router extension for JobsPlug
"""
@roger_api Application.get_env(:roger_ui, :roger_api, RogerUI.RogerApi)
import Plug.Conn
alias RogerUI.Web.Helpers.{Page, Response, Request, Filter}
alias RogerUI.Jobs
use Plug.Router
plug(:match)
plug(:dispatch)
get "/:page_size/:page_number" do
conn = Request.fill_params(conn)
params = Request.normalize_params(conn)
jobs =
[]
|> selected_jobs(params)
|> Page.extract("jobs", params.page_size, params.page_number)
Response.json(conn, jobs)
end
options("/", do: Response.no_content(conn, 207))
delete "/" do
conn = Request.fill_params(conn)
params = Request.normalize_params(conn)
params.jobs
|> selected_jobs(params)
|> Enum.each(fn j ->
@roger_api.cancel_job(j["partition_name"], j["job_id"])
end)
Response.no_content(conn)
end
defp selected_jobs([], params) do
jobs =
if params.partition_name != "" && params.queue_name != "" do
@roger_api.queued_jobs(params.partition_name, params.queue_name)
else
@roger_api.running_jobs() |> Jobs.normalize()
end
jobs
|> Enum.sort_by(&Map.get(&1, :id))
|> Filter.call([:module, :id, :retry_count], params.filter)
end
defp selected_jobs(jobs, _), do: jobs
end
end