mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
refs #9192, refs #9178 After trying to progress with current implementation, it became clear that the route service can't control the boot sequence, because then we end up with circular dependencies between the route service and the channel service. The route service now exposes: - a siteRouter - a way for apps to register routes. - ParentRouter base class for other modules to use - the registry ... - moved the default route setup back to site/routes.js 🙈 - moved the parent channel router back to the channel service (this makes way more sense imo) - this structure prevents circular dependencies - split the registry out into it's own thing - fixed-up various bits of tests and comments - DEBUG will print a list of routes 🎉
134 lines
4.9 KiB
JavaScript
134 lines
4.9 KiB
JavaScript
var debug = require('ghost-ignition').debug('blog'),
|
|
path = require('path'),
|
|
express = require('express'),
|
|
|
|
// App requires
|
|
config = require('../config'),
|
|
storage = require('../adapters/storage'),
|
|
utils = require('../utils'),
|
|
|
|
// This should probably be an internal app
|
|
sitemapHandler = require('../data/xml/sitemap/handler'),
|
|
|
|
// Route Service
|
|
siteRoutes = require('./routes'),
|
|
|
|
// Global/shared middleware
|
|
cacheControl = require('../middleware/cache-control'),
|
|
errorHandler = require('../middleware/error-handler'),
|
|
frontendClient = require('../middleware/frontend-client'),
|
|
maintenance = require('../middleware/maintenance'),
|
|
prettyURLs = require('../middleware/pretty-urls'),
|
|
urlRedirects = require('../middleware/url-redirects'),
|
|
|
|
// local middleware
|
|
servePublicFile = require('../middleware/serve-public-file'),
|
|
staticTheme = require('../middleware/static-theme'),
|
|
customRedirects = require('../middleware/custom-redirects'),
|
|
serveFavicon = require('../middleware/serve-favicon'),
|
|
adminRedirects = require('../middleware/admin-redirects'),
|
|
|
|
// middleware for themes
|
|
themeMiddleware = require('../themes').middleware;
|
|
|
|
module.exports = function setupSiteApp() {
|
|
debug('Site setup start');
|
|
|
|
var siteApp = express();
|
|
|
|
// ## App - specific code
|
|
// set the view engine
|
|
siteApp.set('view engine', 'hbs');
|
|
|
|
// you can extend Ghost with a custom redirects file
|
|
// see https://github.com/TryGhost/Ghost/issues/7707
|
|
customRedirects.use(siteApp);
|
|
// More redirects
|
|
siteApp.use(adminRedirects());
|
|
|
|
// Static content/assets
|
|
// @TODO make sure all of these have a local 404 error handler
|
|
// Favicon
|
|
siteApp.use(serveFavicon());
|
|
// /public/ghost-sdk.js
|
|
siteApp.use(servePublicFile('public/ghost-sdk.js', 'application/javascript', utils.ONE_HOUR_S));
|
|
siteApp.use(servePublicFile('public/ghost-sdk.min.js', 'application/javascript', utils.ONE_HOUR_S));
|
|
// Serve sitemap.xsl file
|
|
siteApp.use(servePublicFile('sitemap.xsl', 'text/xsl', utils.ONE_DAY_S));
|
|
|
|
// Serve stylesheets for default templates
|
|
siteApp.use(servePublicFile('public/ghost.css', 'text/css', utils.ONE_HOUR_S));
|
|
siteApp.use(servePublicFile('public/ghost.min.css', 'text/css', utils.ONE_HOUR_S));
|
|
|
|
// Serve images for default templates
|
|
siteApp.use(servePublicFile('public/404-ghost@2x.png', 'png', utils.ONE_HOUR_S));
|
|
siteApp.use(servePublicFile('public/404-ghost.png', 'png', utils.ONE_HOUR_S));
|
|
|
|
// Serve blog images using the storage adapter
|
|
siteApp.use('/' + utils.url.STATIC_IMAGE_URL_PREFIX, storage.getStorage().serve());
|
|
|
|
// @TODO find this a better home
|
|
// We do this here, at the top level, because helpers require so much stuff.
|
|
// Moving this to being inside themes, where it probably should be requires the proxy to be refactored
|
|
// Else we end up with circular dependencies
|
|
require('../helpers').loadCoreHelpers();
|
|
debug('Helpers done');
|
|
|
|
// Theme middleware
|
|
// This should happen AFTER any shared assets are served, as it only changes things to do with templates
|
|
// At this point the active theme object is already updated, so we have the right path, so it can probably
|
|
// go after staticTheme() as well, however I would really like to simplify this and be certain
|
|
siteApp.use(themeMiddleware);
|
|
debug('Themes done');
|
|
|
|
// Theme static assets/files
|
|
siteApp.use(staticTheme());
|
|
debug('Static content done');
|
|
|
|
// Serve robots.txt if not found in theme
|
|
siteApp.use(servePublicFile('robots.txt', 'text/plain', utils.ONE_HOUR_S));
|
|
|
|
// setup middleware for internal apps
|
|
// @TODO: refactor this to be a proper app middleware hook for internal & external apps
|
|
config.get('apps:internal').forEach(function (appName) {
|
|
var app = require(path.join(config.get('paths').internalAppPath, appName));
|
|
if (app.hasOwnProperty('setupMiddleware')) {
|
|
app.setupMiddleware(siteApp);
|
|
}
|
|
});
|
|
|
|
// site map - this should probably be refactored to be an internal app
|
|
sitemapHandler(siteApp);
|
|
debug('Internal apps done');
|
|
|
|
// send 503 error page in case of maintenance
|
|
siteApp.use(maintenance);
|
|
|
|
// Force SSL if required
|
|
// must happen AFTER asset loading and BEFORE routing
|
|
siteApp.use(urlRedirects);
|
|
|
|
// Add in all trailing slashes & remove uppercase
|
|
// must happen AFTER asset loading and BEFORE routing
|
|
siteApp.use(prettyURLs);
|
|
|
|
// ### Caching
|
|
// Site frontend is cacheable
|
|
siteApp.use(cacheControl('public'));
|
|
|
|
// Fetch the frontend client into res.locals
|
|
siteApp.use(frontendClient);
|
|
|
|
debug('General middleware done');
|
|
|
|
// Set up Frontend routes (including private blogging routes)
|
|
siteApp.use(siteRoutes());
|
|
|
|
// ### Error handlers
|
|
siteApp.use(errorHandler.pageNotFound);
|
|
siteApp.use(errorHandler.handleHTMLResponse);
|
|
|
|
debug('Site setup end');
|
|
|
|
return siteApp;
|
|
};
|