2013-05-11 20:44:25 +04:00
|
|
|
/**
|
|
|
|
* Main controller for Ghost frontend
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*global require, module */
|
|
|
|
|
2013-06-25 15:43:15 +04:00
|
|
|
var Ghost = require('../../ghost'),
|
2013-07-11 23:02:18 +04:00
|
|
|
api = require('../api'),
|
2013-08-28 02:31:43 +04:00
|
|
|
RSS = require('rss'),
|
2013-05-11 20:44:25 +04:00
|
|
|
|
2013-06-25 15:43:15 +04:00
|
|
|
ghost = new Ghost(),
|
|
|
|
frontendControllers;
|
2013-05-11 20:44:25 +04:00
|
|
|
|
2013-06-25 15:43:15 +04:00
|
|
|
frontendControllers = {
|
|
|
|
'homepage': function (req, res) {
|
2013-08-18 21:41:55 +04:00
|
|
|
// Parse the page number
|
2013-09-05 16:55:28 +04:00
|
|
|
var pageParam = req.params.page !== undefined ? parseInt(req.params.page, 10) : 1,
|
|
|
|
postsPerPage = parseInt(ghost.settings().postsPerPage, 10),
|
|
|
|
options = {};
|
2013-08-20 06:18:39 +04:00
|
|
|
|
|
|
|
// No negative pages
|
2013-09-05 16:55:28 +04:00
|
|
|
if (isNaN(pageParam) || pageParam < 1) {
|
|
|
|
//redirect to 404 page?
|
2013-09-06 06:09:47 +04:00
|
|
|
return res.redirect("/");
|
2013-08-20 06:18:39 +04:00
|
|
|
}
|
2013-09-05 16:55:28 +04:00
|
|
|
options.page = pageParam;
|
|
|
|
|
2013-09-06 06:09:47 +04:00
|
|
|
// Redirect '/page/1/' to '/' for all teh good SEO
|
|
|
|
if (pageParam === 1 && req.route.path === '/page/:page/') {
|
|
|
|
return res.redirect('/');
|
|
|
|
}
|
|
|
|
|
2013-09-05 16:55:28 +04:00
|
|
|
// No negative posts per page, must be number
|
|
|
|
if (!isNaN(postsPerPage) && postsPerPage > 0) {
|
|
|
|
options.limit = postsPerPage;
|
|
|
|
}
|
|
|
|
|
|
|
|
api.posts.browse(options).then(function (page) {
|
2013-08-20 06:18:39 +04:00
|
|
|
|
2013-08-21 18:05:17 +04:00
|
|
|
var maxPage = page.pages;
|
|
|
|
|
|
|
|
// A bit of a hack for situations with no content.
|
|
|
|
if (maxPage === 0) {
|
|
|
|
maxPage = 1;
|
|
|
|
page.pages = 1;
|
|
|
|
}
|
|
|
|
|
2013-08-18 21:41:55 +04:00
|
|
|
// If page is greater than number of pages we have, redirect to last page
|
2013-08-21 18:05:17 +04:00
|
|
|
if (pageParam > maxPage) {
|
2013-09-06 06:09:47 +04:00
|
|
|
return res.redirect(maxPage === 1 ? '/' : ('/page/' + maxPage + '/'));
|
2013-08-18 21:41:55 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// Render the page of posts
|
2013-06-25 15:43:15 +04:00
|
|
|
ghost.doFilter('prePostsRender', page.posts, function (posts) {
|
2013-06-25 19:13:19 +04:00
|
|
|
res.render('index', {posts: posts, pagination: {page: page.page, prev: page.prev, next: page.next, limit: page.limit, total: page.total, pages: page.pages}});
|
2013-05-11 20:44:25 +04:00
|
|
|
});
|
2013-06-25 15:43:15 +04:00
|
|
|
});
|
|
|
|
},
|
|
|
|
'single': function (req, res) {
|
|
|
|
api.posts.read({'slug': req.params.slug}).then(function (post) {
|
|
|
|
ghost.doFilter('prePostsRender', post.toJSON(), function (post) {
|
2013-07-11 20:57:12 +04:00
|
|
|
res.render('post', {post: post});
|
2013-05-11 20:44:25 +04:00
|
|
|
});
|
2013-06-25 15:43:15 +04:00
|
|
|
});
|
2013-08-28 02:31:43 +04:00
|
|
|
},
|
|
|
|
'rss': function (req, res) {
|
|
|
|
// Initialize RSS
|
2013-09-11 19:23:07 +04:00
|
|
|
var siteUrl = ghost.config().url,
|
2013-09-02 05:29:56 +04:00
|
|
|
feed = new RSS({
|
|
|
|
title: ghost.settings().title,
|
|
|
|
description: ghost.settings().description,
|
2013-09-14 15:12:27 +04:00
|
|
|
generator: 'Ghost v' + res.locals.version,
|
2013-09-02 05:29:56 +04:00
|
|
|
author: ghost.settings().author,
|
|
|
|
feed_url: siteUrl + '/rss/',
|
|
|
|
site_url: siteUrl,
|
|
|
|
ttl: '60'
|
|
|
|
}),
|
|
|
|
// Parse the page number
|
2013-08-28 02:31:43 +04:00
|
|
|
pageParam = req.params.page !== undefined ? parseInt(req.params.page, 10) : 1;
|
|
|
|
|
|
|
|
// No negative pages
|
2013-09-14 15:12:27 +04:00
|
|
|
if (isNaN(pageParam) || pageParam < 1) {
|
|
|
|
return res.redirect("/rss/");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pageParam === 1 && req.route.path === '/rss/:page/') {
|
|
|
|
return res.redirect('/rss/');
|
2013-08-28 02:31:43 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
api.posts.browse({page: pageParam}).then(function (page) {
|
|
|
|
var maxPage = page.pages;
|
|
|
|
|
|
|
|
// A bit of a hack for situations with no content.
|
|
|
|
if (maxPage === 0) {
|
|
|
|
maxPage = 1;
|
|
|
|
page.pages = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If page is greater than number of pages we have, redirect to last page
|
|
|
|
if (pageParam > maxPage) {
|
|
|
|
return res.redirect("/rss/" + maxPage + "/");
|
|
|
|
}
|
|
|
|
|
|
|
|
ghost.doFilter('prePostsRender', page.posts, function (posts) {
|
|
|
|
posts.forEach(function (post) {
|
|
|
|
var item = {
|
|
|
|
title: post.title,
|
|
|
|
guid: post.uuid,
|
2013-09-02 05:29:56 +04:00
|
|
|
url: siteUrl + '/' + post.slug + '/',
|
2013-08-28 02:31:43 +04:00
|
|
|
date: post.published_at
|
|
|
|
};
|
|
|
|
|
|
|
|
if (post.meta_description !== null) {
|
|
|
|
item.push({ description: post.meta_description });
|
|
|
|
}
|
|
|
|
|
|
|
|
feed.item(item);
|
|
|
|
});
|
|
|
|
res.set('Content-Type', 'text/xml');
|
|
|
|
res.send(feed.xml());
|
|
|
|
});
|
|
|
|
});
|
2013-06-25 15:43:15 +04:00
|
|
|
}
|
|
|
|
};
|
2013-05-11 20:44:25 +04:00
|
|
|
|
2013-06-25 15:43:15 +04:00
|
|
|
module.exports = frontendControllers;
|