Skip to content

Commit

Permalink
Extract feed and post serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
hanneskaeufler committed Oct 12, 2018
1 parent d49f7ab commit db5e7c8
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 44 deletions.
47 changes: 3 additions & 44 deletions src/actions/blog/feed.cr
Original file line number Diff line number Diff line change
@@ -1,50 +1,9 @@
class Blog::Feed < ApiAction
@renderer = PostContentRenderer.new

param page : Int32 = 1

get "/feed.json" do
feed = {
"version" => "https://jsonfeed.org/version/1",
"title" => "racing · software · open-source",
"home_page_url" => Blog::Posts::Index.url,
"feed_url" => Blog::Feed.url,
"description" => Blog::Components::TAGLINE,
"author" => {"name" => "Hannes Käufler"},
"favicon" => "#{host}/favicon.ico",
"items" => items,
}

if has_next_page
feed["next_url"] = Blog::Feed.with(page + 1).url
end

json(feed)
end

private def items
PostQuery.new.latest.map { |post| post_json(post) }
end

private def post_json(post : Post)
{
"id": "#{post.id}",
"title": post.title,
"content_html": @renderer.render(post),
"url": Blog::Posts::Show.with(post.slug).url,
"date_published": post.published_at.to_rfc3339,
"date_updated": post.updated_at.to_rfc3339,
}
end

private def has_next_page
posts_count = PostQuery.new.published.count.to_i
not_last_page = page * PostQuery::PER_PAGE < posts_count
more_than_one_page = posts_count > PostQuery::PER_PAGE
more_than_one_page && not_last_page
end

private def host
Lucky::RouteHelper.settings.base_uri
json(FeedSerializer.new(PostQuery.new.latest.results,
PostQuery.new.published.count,
page))
end
end
1 change: 1 addition & 0 deletions src/app.cr
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ require "./pipes/**"
require "./actions/**"
require "./components/**"
require "./pages/**"
require "./serializers/**"
require "./handlers/**"
require "../config/env"
require "../config/**"
Expand Down
37 changes: 37 additions & 0 deletions src/serializers/feed_serializer.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
class FeedSerializer < Lucky::Serializer
def initialize(@posts : Array(Post), @total_posts : Int64, @page : Int32)
end

def render
feed = {
"version" => "https://jsonfeed.org/version/1",
"title" => "racing · software · open-source",
"home_page_url" => Blog::Posts::Index.url,
"feed_url" => Blog::Feed.url,
"description" => Blog::Components::TAGLINE,
"author" => {"name" => "Hannes Käufler"},
"favicon" => "#{host}/favicon.ico",
"items" => items,
}

if has_next_page
feed["next_url"] = Blog::Feed.with(@page + 1).url
end

feed
end

private def items
@posts.map { |post| PostSerializer.new(post).render }
end

private def has_next_page
not_last_page = @page * PostQuery::PER_PAGE < @total_posts
more_than_one_page = @total_posts > PostQuery::PER_PAGE
more_than_one_page && not_last_page
end

private def host
Lucky::RouteHelper.settings.base_uri
end
end
17 changes: 17 additions & 0 deletions src/serializers/post_serializer.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class PostSerializer < Lucky::Serializer
@renderer = PostContentRenderer.new

def initialize(@post : Post)
end

def render
{
id: "#{@post.id}",
title: @post.title,
content_html: @renderer.render(@post),
url: Blog::Posts::Show.with(@post.slug).url,
date_published: @post.published_at.to_rfc3339,
date_updated: @post.updated_at.to_rfc3339,
}
end
end

0 comments on commit db5e7c8

Please sign in to comment.