Skip to main content

lib/router.ex

defmodule Ocelot.Router do
  use Plug.Router

  alias Ocelot.{HTML, Queries}

  plug(:match)
  plug(:fetch_query_params)
  plug(:put_base_path)
  plug(:dispatch)

  get "/" do
    base = conn.assigns.base
    redirect(conn, "#{base}/jobs")
  end

  get "/jobs" do
    repo = conn.private.repo
    base = conn.assigns.base

    page = parse_page(conn.query_params["page"])

    {jobs, total_pages} = Queries.list_jobs(repo, page: page)

    html(conn, HTML.job_list(jobs, page, total_pages, base))
  end

  get "/jobs/:id" do
    repo = conn.private.repo
    base = conn.assigns.base

    case Queries.get_job(repo, id) do
      nil -> send_resp(conn, 404, "Job not found")
      job -> html(conn, HTML.job_detail(job, base))
    end
  end

  match _ do
    send_resp(conn, 404, "Not found")
  end

  defp put_base_path(conn, _opts) do
    assign(conn, :base, "/" <> Enum.join(conn.script_name, "/"))
  end

  defp html(conn, body) do
    conn
    |> Plug.Conn.put_resp_content_type("text/html")
    |> send_resp(200, body)
  end

  defp redirect(conn, to) do
    conn
    |> Plug.Conn.put_resp_header("location", to)
    |> send_resp(302, "")
  end

  defp parse_page(nil), do: 1

  defp parse_page(s) do
    case Integer.parse(s) do
      {n, _} when n > 0 -> n
      _ -> 1
    end
  end
end