sloanelybutsurely.com/lib/web/controllers/feed_controller.ex
2025-05-09 16:38:20 -04:00

56 lines
1.6 KiB
Elixir

defmodule Web.FeedController do
use Web, :controller
@feed_posts_count 50
def feed(conn, _params) do
posts =
Core.Posts.get_published_recent_posts([:blog, :status], @feed_posts_count)
updated =
posts
|> Enum.map(& &1.updated_at)
|> Enum.max(NaiveDateTime)
|> DateTime.from_naive!("Etc/UTC")
feed =
conn
|> url(~p"/")
|> Atomex.Feed.new(updated, "sloanelybutsurely.com")
|> Atomex.Feed.author("Sloane", uri: url(conn, ~p"/"))
|> Atomex.Feed.link(url(conn, ~p"/atom.xml"), rel: "self")
|> Atomex.Feed.entries(Enum.map(posts, &entry/1))
|> Atomex.Feed.build()
|> Atomex.generate_document()
conn
|> put_resp_content_type("application/atom+xml")
|> send_resp(200, feed)
end
defp entry(%Schema.Post{} = post) do
permalink = Web.Paths.public_post_url(post)
permalink
|> Atomex.Entry.new(DateTime.from_naive!(post.updated_at, "Etc/UTC"), entry_title(post))
|> Atomex.Entry.author("Sloane", uri: url(~p"/"))
|> Atomex.Entry.published(DateTime.from_naive!(post.published_at, "Etc/UTC"))
|> Atomex.Entry.link(permalink, rel: "alternate")
|> Atomex.Entry.content({:cdata, Web.Markdown.to_html(post.body)}, type: "html")
|> Atomex.Entry.build()
end
defp entry_title(%Schema.Post{kind: :blog, title: title}), do: title
@status_title_length 40
defp entry_title(%Schema.Post{kind: :status, body: body}) do
if String.length(body) <= @status_title_length do
body
else
(body
|> String.slice(0, @status_title_length - 1)
|> String.trim_trailing()) <> ""
end
end
end