firehose/blogex/examples/router_example.ex
Your Name bc14696f57 Static blog with front page summary
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.
2026-03-17 11:17:21 +00:00

90 lines
2.5 KiB
Elixir

defmodule FirehoseWeb.Router do
@moduledoc """
Example router showing how to integrate Blogex.
You have two options for mounting blogs:
## Option A: Plug Router (JSON API / feeds only)
Uses `Blogex.Router` directly — great for headless / API usage:
scope "/blog" do
pipe_through :browser
forward "/engineering", Blogex.Router, blog: Firehose.EngineeringBlog
forward "/releases", Blogex.Router, blog: Firehose.ReleaseNotes
end
## Option B: LiveView (full UI, recommended)
Uses your own LiveViews with Blogex components — full control over layout:
scope "/blog", MyAppWeb do
pipe_through :browser
live "/engineering", BlogLive.Index, :index,
metadata: %{blog: :engineering}
live "/engineering/:slug", BlogLive.Show, :show,
metadata: %{blog: :engineering}
live "/releases", BlogLive.Index, :index,
metadata: %{blog: :release_notes}
live "/releases/:slug", BlogLive.Show, :show,
metadata: %{blog: :release_notes}
end
# Still mount the Plug router for feeds
scope "/blog" do
forward "/engineering", Blogex.Router, blog: Firehose.EngineeringBlog
forward "/releases", Blogex.Router, blog: Firehose.ReleaseNotes
end
## Option C: Mixed
Use LiveView for the HTML pages but let Blogex.Router handle
feeds and the JSON API. Just make sure the LiveView routes are
defined first so they take priority.
"""
use Phoenix.Router
import Phoenix.LiveView.Router
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_live_flash
plug :put_root_layout, html: {FirehoseWeb.Layouts, :root}
plug :protect_from_forgery
plug :put_secure_browser_headers
end
# -- Option B: LiveView routes (recommended) --
scope "/blog", MyAppWeb do
pipe_through :browser
# Engineering blog
live "/engineering", BlogLive.Index, :index
live "/engineering/tag/:tag", BlogLive.Index, :tag
live "/engineering/:slug", BlogLive.Show, :show
# Release notes
live "/releases", BlogLive.Index, :index
live "/releases/tag/:tag", BlogLive.Index, :tag
live "/releases/:slug", BlogLive.Show, :show
end
# Feeds (served by Blogex.Router as Plug)
scope "/blog" do
forward "/engineering", Blogex.Router, blog: Firehose.EngineeringBlog
forward "/releases", Blogex.Router, blog: Firehose.ReleaseNotes
end
# Sitemap
scope "/" do
get "/sitemap.xml", FirehoseWeb.SitemapController, :index
end
end