firehose/app/lib/firehose_web/controllers/blog_controller.ex
Willem van den Ende 061787e897 Feature: OG Social media cards
Not Original Gangsta, but ObjectGraph

Reason: images were showing on LinkedIn, but small.
2026-05-10 21:34:07 +01:00

81 lines
2.0 KiB
Elixir

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)
meta = Blogex.SEO.meta_tags_for_blog(blog, FirehoseWeb.Endpoint.url())
conn
|> FirehoseWeb.Layouts.put_content_for(:meta_tags, meta)
|> render(: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)
visibility = Blogex.Post.visibility(post)
meta = Blogex.SEO.meta_tags(post, FirehoseWeb.Endpoint.url(), blog)
conn
|> FirehoseWeb.Layouts.put_content_for(:meta_tags, meta)
|> render(:show,
page_title: post.title,
post: post,
meta: meta,
base_path: blog.base_path(),
visibility: visibility,
authenticated: !!(conn.assigns[:current_scope] && conn.assigns.current_scope.user)
)
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