0
0
zero-blog/controller/post.rb
Gibheer ea72da5259 rework post controller
To handle errors correctly the post controller needed some rework. Now
instead of single functions running all around the place, there is one
function collecting the data needed and raising errors when needed.

For that to work, the controller class can now return more classes to
keep the chain going. Unless a class is returned, it will call the
renderer.
2014-02-13 22:38:42 +01:00

63 lines
2.1 KiB
Ruby

module Routes
class Post < Controller
PREV_AND_NEXT_QUERY = <<SQL
select (
select id from posts where written < ? and released order by written desc limit 1
) older,
(
select id from posts where written > ? and released order by written limit 1
) younger
SQL
def self.get(session)
posts = define_posts_query(session)
if session.options[:id]
posts = posts.filter(:posts__id => session.options[:id].to_i)
return RouteNotFound if posts.empty?
set_previous_and_next_post(session, posts)
else
if session.request.params['search']
posts = load_fulltextsearch(session, posts)
end
set_page_information(session, posts)
end
session.options[:posts] = posts
session.options[:render] = 'posts/index'
end
def self.define_posts_query(session)
posts = DB[:posts].
filter(:released => true).
select(:posts__id___post_id, :written, :title, :content, :username).
join(:accounts, :id___account_id => :account_id).
reverse_order(:written, :posts__id)
end
# load posts depending on the pagination
def self.set_page_information(session, posts)
# compute pages
page = session.request.params['page'].to_i
session.options[:page] = page if page
per_page = session.request.params['per_page'].to_i
per_page = 10 if per_page < 1
session.options[:query][:per_page] = per_page if per_page
session.options[:pages] = posts.count / per_page
end
# load a single posts and the ids of the next and previous posts
def self.set_previous_and_next_post(session, posts)
written = posts.first[:written]
session.options[:post_ids_pn] = DB[PREV_AND_NEXT_QUERY, written, written].first
end
# adjust query to use fulltext search
def self.load_fulltextsearch(session, posts)
session.options[:query][:search] = session.request.params['search']
posts.filter(
'posts.search_field @@ to_tsquery(\'english\', ?)',
session.request.params['search'].tr(' ', '&')
)
end
end
end