Goal: have a personal blog, and try out another point in the 'modular app design with elixir' space. Designing OTP systems with elixir had some interesting ideas.
51 lines
1.3 KiB
Elixir
51 lines
1.3 KiB
Elixir
defmodule FirehoseWeb.BlogController do
|
|
use FirehoseWeb, :controller
|
|
|
|
def index(conn, %{"blog_id" => blog_id} = params) do
|
|
blog = resolve_blog!(blog_id)
|
|
page = String.to_integer(params["page"] || "1")
|
|
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, %{"blog_id" => blog_id, "slug" => slug}) do
|
|
blog = resolve_blog!(blog_id)
|
|
post = blog.get_post!(slug)
|
|
|
|
render(conn, :show,
|
|
page_title: post.title,
|
|
post: post,
|
|
base_path: blog.base_path()
|
|
)
|
|
end
|
|
|
|
def tag(conn, %{"blog_id" => blog_id, "tag" => tag}) do
|
|
blog = resolve_blog!(blog_id)
|
|
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!("engineering"), do: Firehose.EngineeringBlog
|
|
defp resolve_blog!("releases"), do: Firehose.ReleaseNotes
|
|
|
|
defp resolve_blog!(id) do
|
|
raise Blogex.NotFoundError, "unknown blog: #{inspect(id)}"
|
|
end
|
|
end
|