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