defmodule FirehoseWeb.BlogController do use FirehoseWeb, :controller plug :resolve_blog def index(conn, params) do blog = conn.assigns.blog page = parse_page(params["page"]) result = blog.paginate(page) render(conn, :index, page_title: blog.title(), blog_title: blog.title(), blog_description: blog.description(), posts: result.entries, base_path: blog.base_path(), page: result.page, total_pages: result.total_pages ) end def show(conn, %{"slug" => slug}) do blog = conn.assigns.blog post = blog.get_post!(slug) render(conn, :show, page_title: post.title, post: post, base_path: blog.base_path() ) end def tag(conn, %{"tag" => tag}) do blog = conn.assigns.blog posts = blog.posts_by_tag(tag) render(conn, :tag, page_title: "#{blog.title()} — #{tag}", blog_title: blog.title(), tag: tag, posts: posts, base_path: blog.base_path() ) end defp resolve_blog(%{params: %{"blog_id" => "engineering"}} = conn, _opts), do: assign(conn, :blog, Firehose.EngineeringBlog) defp resolve_blog(%{params: %{"blog_id" => "releases"}} = conn, _opts), do: assign(conn, :blog, Firehose.ReleaseNotes) defp resolve_blog(conn, _opts) do conn |> put_status(:not_found) |> put_view(FirehoseWeb.ErrorHTML) |> render(:"404") |> halt() end defp parse_page(nil), do: 1 defp parse_page(str) do case Integer.parse(str) do {page, ""} when page > 0 -> page _ -> 1 end end end