From f9906fa4f7cd2c309882c6fd0ed1008f9fc95696 Mon Sep 17 00:00:00 2001 From: Jessica Phoenix Canady Date: Tue, 20 Aug 2024 16:50:26 -0400 Subject: [PATCH] Generate feed for posts. --- lib/jol_web/controllers/feed_controller.ex | 12 ++++++++++++ lib/jol_web/feeds.ex | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 lib/jol_web/controllers/feed_controller.ex create mode 100644 lib/jol_web/feeds.ex diff --git a/lib/jol_web/controllers/feed_controller.ex b/lib/jol_web/controllers/feed_controller.ex new file mode 100644 index 0000000..b8db889 --- /dev/null +++ b/lib/jol_web/controllers/feed_controller.ex @@ -0,0 +1,12 @@ +defmodule JOLWeb.FeedController do + use JOLWeb, :controller + + def feed(conn, _params) do + feed = JOL.Blog.all_posts() + |> JOLWeb.Feeds.build_feed() + + conn + |> put_resp_content_type("text/xml") + |> send_resp(200, feed) + end +end diff --git a/lib/jol_web/feeds.ex b/lib/jol_web/feeds.ex new file mode 100644 index 0000000..ff4cb95 --- /dev/null +++ b/lib/jol_web/feeds.ex @@ -0,0 +1,20 @@ +defmodule JOLWeb.Feeds do + use Phoenix.VerifiedRoutes, endpoint: JOLWeb.Endpoint, router: JOLWeb.Router + alias Atomex.{Feed, Entry} + + def build_feed(posts) do + Feed.new(url(~p"/"), DateTime.utc_now, "Jessica Online") + |> Feed.author("Jessica Phoenix Canady", email: "jess@canady.tech") + |> Feed.link(url(~p"/feed.xml"), rel: "self") + |> Feed.entries(Enum.map(posts, &build_entry/1)) + |> Feed.build() + |> Atomex.generate_document() + end + + defp build_entry(post) do + Entry.new(url(~p"/blog/#{post.slug}"), post.date, post.title) + |> Entry.author(post.author, uri: url(~p"/")) + |> Entry.content(post.body, type: "html") + |> Entry.build() + end +end