mirror of
https://github.com/ash-project/ash_blog.git
synced 2024-09-19 21:03:21 +12:00
fix: more fixes around rss feed
This commit is contained in:
parent
8a3bee3a49
commit
083102a214
1 changed files with 22 additions and 19 deletions
|
@ -8,9 +8,11 @@ defmodule AshBlog do
|
||||||
def rss_feed(blog_posts, opts \\ []) do
|
def rss_feed(blog_posts, opts \\ []) do
|
||||||
blog_posts = Enum.filter(blog_posts, &(&1.state == :published))
|
blog_posts = Enum.filter(blog_posts, &(&1.state == :published))
|
||||||
|
|
||||||
default_updated =
|
updated = opts[:updated] || fn blog_post -> blog_post.published_at end
|
||||||
|
|
||||||
|
last_updated =
|
||||||
blog_posts
|
blog_posts
|
||||||
|> Enum.map(& &1.published_at)
|
|> Enum.map(updated)
|
||||||
|> case do
|
|> case do
|
||||||
[] ->
|
[] ->
|
||||||
DateTime.utc_now()
|
DateTime.utc_now()
|
||||||
|
@ -27,25 +29,34 @@ defmodule AshBlog do
|
||||||
element(:title, opts[:title]),
|
element(:title, opts[:title]),
|
||||||
element(:link, %{href: opts[:link], rel: "alternate", type: "text/html"}),
|
element(:link, %{href: opts[:link], rel: "alternate", type: "text/html"}),
|
||||||
element(:link, %{href: opts[:rss_link], rel: "self", type: "application/atom+xml"}),
|
element(:link, %{href: opts[:rss_link], rel: "self", type: "application/atom+xml"}),
|
||||||
element(:updated, to_string(opts[:updated] || default_updated))
|
element(:updated, DateTime.to_iso8601(last_updated))
|
||||||
] ++
|
] ++
|
||||||
Enum.map(blog_posts, fn %resource{} = blog_post ->
|
Enum.map(blog_posts, fn %resource{} = blog_post ->
|
||||||
data = [
|
inners = [
|
||||||
title: Map.get(blog_post, AshBlog.DataLayer.Info.title_attribute(resource))
|
element(
|
||||||
|
:id,
|
||||||
|
Ash.Resource.Info.primary_key(resource)
|
||||||
|
|> Enum.map_join("-", &to_string(Map.get(blog_post, &1)))
|
||||||
|
),
|
||||||
|
element(:title, Map.get(blog_post, AshBlog.DataLayer.Info.title_attribute(resource))),
|
||||||
|
element(:updated, DateTime.to_iso8601(updated.(blog_post)))
|
||||||
]
|
]
|
||||||
|
|
||||||
data =
|
inners =
|
||||||
if opts[:linker] do
|
if opts[:linker] do
|
||||||
Keyword.put(data, :link, opts[:linker].(blog_post))
|
[element(:link, %{rel: "alternate", href: opts[:linker].(blog_post)}) | inners]
|
||||||
else
|
else
|
||||||
data
|
inners
|
||||||
end
|
end
|
||||||
|
|
||||||
inners =
|
inners =
|
||||||
if opts[:html_body] do
|
if opts[:html_body] do
|
||||||
[element(:content, %{type: "html"}, {:cdata, opts[:html_body].(blog_post)})]
|
[
|
||||||
|
element(:content, %{type: "html"}, {:cdata, opts[:html_body].(blog_post)})
|
||||||
|
| inners
|
||||||
|
]
|
||||||
else
|
else
|
||||||
[]
|
inners
|
||||||
end
|
end
|
||||||
|
|
||||||
inners =
|
inners =
|
||||||
|
@ -62,15 +73,7 @@ defmodule AshBlog do
|
||||||
inners
|
inners
|
||||||
end
|
end
|
||||||
|
|
||||||
data =
|
element(:entry, inners)
|
||||||
Keyword.put(
|
|
||||||
data,
|
|
||||||
:id,
|
|
||||||
Ash.Resource.Info.primary_key(resource)
|
|
||||||
|> Enum.map_join("-", &to_string(Map.get(blog_post, &1)))
|
|
||||||
)
|
|
||||||
|
|
||||||
element(:entry, data, inners)
|
|
||||||
end)
|
end)
|
||||||
)
|
)
|
||||||
|> XmlBuilder.generate()
|
|> XmlBuilder.generate()
|
||||||
|
|
Loading…
Reference in a new issue