0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-27 22:49:56 -05:00
ghost/core/server/controllers/frontend.js
Sebastian Gierlinger bd8db968ea Add setting filter
closes #172
- added type to ghost.settings()
- added /api/settings?type=<filter>
- added availableThemes to settingsCache
- removed cachedSettingsRequestHandler
- removed /api/themes (including front end)
- changed activePlugins to type "plugin" in default-settings.json
2013-09-15 18:04:01 +02:00

126 lines
No EOL
4.1 KiB
JavaScript

/**
* Main controller for Ghost frontend
*/
/*global require, module */
var Ghost = require('../../ghost'),
api = require('../api'),
RSS = require('rss'),
ghost = new Ghost(),
frontendControllers;
frontendControllers = {
'homepage': function (req, res) {
// Parse the page number
var pageParam = req.params.page !== undefined ? parseInt(req.params.page, 10) : 1,
postsPerPage = parseInt(ghost.settings().postsPerPage.value, 10),
options = {};
// No negative pages
if (isNaN(pageParam) || pageParam < 1) {
//redirect to 404 page?
return res.redirect("/");
}
options.page = pageParam;
// Redirect '/page/1/' to '/' for all teh good SEO
if (pageParam === 1 && req.route.path === '/page/:page/') {
return res.redirect('/');
}
// No negative posts per page, must be number
if (!isNaN(postsPerPage) && postsPerPage > 0) {
options.limit = postsPerPage;
}
api.posts.browse(options).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(maxPage === 1 ? '/' : ('/page/' + maxPage + '/'));
}
// Render the page of posts
ghost.doFilter('prePostsRender', page.posts, function (posts) {
res.render('index', {posts: posts, pagination: {page: page.page, prev: page.prev, next: page.next, limit: page.limit, total: page.total, pages: page.pages}});
});
});
},
'single': function (req, res) {
api.posts.read({'slug': req.params.slug}).then(function (post) {
ghost.doFilter('prePostsRender', post.toJSON(), function (post) {
res.render('post', {post: post});
});
});
},
'rss': function (req, res) {
// Initialize RSS
var siteUrl = ghost.config().url,
feed = new RSS({
title: ghost.settings().title.value,
description: ghost.settings().description.value,
generator: 'Ghost v' + res.locals.version,
author: ghost.settings().author.value,
feed_url: siteUrl + '/rss/',
site_url: siteUrl,
ttl: '60'
}),
// Parse the page number
pageParam = req.params.page !== undefined ? parseInt(req.params.page, 10) : 1;
// No negative pages
if (isNaN(pageParam) || pageParam < 1) {
return res.redirect("/rss/");
}
if (pageParam === 1 && req.route.path === '/rss/:page/') {
return res.redirect('/rss/');
}
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,
url: siteUrl + '/' + post.slug + '/',
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());
});
});
}
};
module.exports = frontendControllers;