2013-10-26 14:56:55 +02:00
|
|
|
module Routes
|
|
|
|
class Post < Controller
|
2014-01-02 21:38:21 +01:00
|
|
|
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
|
|
|
|
|
2013-10-26 14:56:55 +02:00
|
|
|
def self.get(session)
|
2013-10-26 17:52:52 +02:00
|
|
|
define_posts(session)
|
|
|
|
session.options[:render] = 'posts/index'
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.define_posts(session)
|
2014-01-02 21:38:21 +01:00
|
|
|
posts = DB[:posts].
|
|
|
|
filter(:released => true).
|
|
|
|
select(:posts__id___post_id, :written, :title, :content, :username).
|
|
|
|
join(:accounts, :id___account_id => :account_id).
|
2014-01-16 09:00:18 +01:00
|
|
|
reverse_order(:written, :posts__id)
|
2014-01-02 21:38:21 +01:00
|
|
|
|
2014-02-11 23:09:34 +01:00
|
|
|
if session.options[:id]
|
|
|
|
posts = posts.filter(:posts__id => session.options[:id].to_i)
|
2014-02-11 23:12:59 +01:00
|
|
|
load_previous_and_next_post(session, posts) unless posts.empty?
|
2014-02-11 23:09:34 +01:00
|
|
|
else
|
|
|
|
if session.request.params['search']
|
|
|
|
posts = load_fulltextsearch(session, posts)
|
|
|
|
end
|
|
|
|
load_page_information(session, posts)
|
|
|
|
# return no_results if posts.empty?
|
|
|
|
end
|
2014-01-23 21:59:24 +01:00
|
|
|
|
2014-02-11 23:09:34 +01:00
|
|
|
session.options[:posts] = posts
|
2014-01-02 21:38:21 +01:00
|
|
|
end
|
|
|
|
|
2014-01-23 21:59:24 +01:00
|
|
|
# load posts depending on the pagination
|
2014-01-02 21:38:21 +01:00
|
|
|
def self.load_page_information(session, posts)
|
2013-10-29 20:39:47 +01:00
|
|
|
# compute pages
|
|
|
|
page = session.request.params['page'].to_i
|
|
|
|
session.options[:page] = page if page
|
|
|
|
per_page = session.request.params['per_page'].to_i
|
2014-01-02 21:38:21 +01:00
|
|
|
per_page = 10 if per_page < 1
|
2014-01-23 21:59:24 +01:00
|
|
|
session.options[:query][:per_page] = per_page if per_page
|
|
|
|
session.options[:pages] = posts.count / per_page
|
2013-10-26 14:56:55 +02:00
|
|
|
end
|
2014-01-02 21:38:21 +01:00
|
|
|
|
2014-01-23 21:59:24 +01:00
|
|
|
# load a single posts and the ids of the next and previous posts
|
2014-01-02 21:38:21 +01:00
|
|
|
def self.load_previous_and_next_post(session, posts)
|
|
|
|
written = posts.first[:written]
|
|
|
|
session.options[:post_ids_pn] = DB[PREV_AND_NEXT_QUERY, written, written].first
|
|
|
|
end
|
2014-01-23 21:59:24 +01:00
|
|
|
|
|
|
|
# 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
|
2013-10-26 14:56:55 +02:00
|
|
|
end
|
|
|
|
end
|