diff --git a/lib/home73k_web/controllers/feed_controller.ex b/lib/home73k_web/controllers/feed_controller.ex new file mode 100644 index 0000000..0b7a4b5 --- /dev/null +++ b/lib/home73k_web/controllers/feed_controller.ex @@ -0,0 +1,15 @@ +defmodule Home73kWeb.FeedController do + use Home73kWeb, :controller + + alias Home73k.Blog + + def rss(conn, _params) do + posts = Blog.list_posts() + last_build_date = posts |> List.first() |> Map.get(:date) + + conn + |> put_resp_content_type("application/rss+xml") + |> put_layout(:false) + |> render("rss.xml", posts: posts, last_build_date: last_build_date) + end +end diff --git a/lib/home73k_web/router.ex b/lib/home73k_web/router.ex index 2f1be2b..7513ea4 100644 --- a/lib/home73k_web/router.ex +++ b/lib/home73k_web/router.ex @@ -10,6 +10,10 @@ defmodule Home73kWeb.Router do plug :put_secure_browser_headers end + pipeline :xml_rss do + plug :accepts, ["xml", "rss", "atom"] + end + pipeline :api do plug :accepts, ["json"] end @@ -30,6 +34,13 @@ defmodule Home73kWeb.Router do live "/blog/:id", BlogLive, :show end + scope "/feed", Home73kWeb do + pipe_through :xml_rss + + # Feeds + get "/", FeedController, :rss + end + # Other scopes may use custom stacks. # scope "/api", Home73kWeb do # pipe_through :api diff --git a/lib/home73k_web/templates/feed/rss.xml.eex b/lib/home73k_web/templates/feed/rss.xml.eex new file mode 100644 index 0000000..827ed97 --- /dev/null +++ b/lib/home73k_web/templates/feed/rss.xml.eex @@ -0,0 +1,23 @@ + + + + 73k Blog - Adam Piontek + <%= Routes.blog_url(@conn, :index) %> + + Blog by Adam Piontek. Desktop Systems Engineer. Human. Casual anthropologist, cautious DIYer, cuckoo leftist, cat papa. + en + Copyright <%= DateTime.utc_now.year %> Adam Piontek + <%= @last_build_date |> to_rfc822 %> + Personal/Political/Society/Technology/IT/Internet/Web development + 60<%= for post <- @posts do %> + + <%= post.title %> + <%= Routes.blog_url(@conn, :show, post) %> + <%= Routes.blog_url(@conn, :show, post) %> + ]]> + <%= post.tags |> List.first() %> + <%= post.date |> to_rfc822 %> + 73k Blog - Adam Piontek + <% end %> + + \ No newline at end of file diff --git a/lib/home73k_web/views/feed_view.ex b/lib/home73k_web/views/feed_view.ex new file mode 100644 index 0000000..75048e5 --- /dev/null +++ b/lib/home73k_web/views/feed_view.ex @@ -0,0 +1,11 @@ +defmodule Home73kWeb.FeedView do + use Home73kWeb, :view + + import Home73k, only: [app_time_zone: 0] + + def to_rfc822(naive_dt) do + naive_dt + |> DateTime.from_naive!(app_time_zone()) + |> Calendar.strftime("%a, %d %b %Y %H:%M:%S %Z") + end +end