Refactored how we require shared middlewares from web/ (#9893)

refs #9866

- use package notation
- get rid of x requires for middlewares
- improved readability
- do not refactor web/api/v0.1
This commit is contained in:
Katharina Irrgang 2018-09-21 12:47:11 +02:00 committed by Rishabh Garg
parent 7d25c36a7b
commit 213474835b
19 changed files with 213 additions and 182 deletions

View File

@ -10,7 +10,7 @@ const Promise = require('bluebird'),
urlService = require('../services/url'),
localUtils = require('./utils'),
models = require('../models'),
spamPrevention = require('../web/shared/middlewares/api/spam-prevention'),
web = require('../web'),
mailAPI = require('./mail'),
settingsAPI = require('./settings'),
tokenSecurity = {};
@ -314,7 +314,8 @@ authentication = {
}));
}
spamPrevention.userLogin().reset(opts.ip, `${tokenParts.email}login`);
web.shared.middlewares.api.spamPrevention.userLogin()
.reset(opts.ip, `${tokenParts.email}login`);
return models.User.changePassword({
oldPassword: oldPassword,

View File

@ -6,7 +6,7 @@ const fs = require('fs-extra'),
common = require('../lib/common'),
validation = require('../data/validation'),
localUtils = require('./utils'),
customRedirectsMiddleware = require('../web/shared/middlewares/custom-redirects');
web = require('../web');
let redirectsAPI,
_private = {};
@ -80,7 +80,7 @@ redirectsAPI = {
})
.then(() => {
// CASE: trigger that redirects are getting re-registered
customRedirectsMiddleware.reload();
web.shared.middlewares.customRedirects.reload();
});
});
});

View File

@ -3,7 +3,7 @@ const path = require('path'),
middleware = require('./middleware'),
bodyParser = require('body-parser'),
routing = require('../../../services/routing'),
brute = require('../../../web/shared/middlewares/brute'),
web = require('../../../web'),
templateName = 'private',
privateRouter = express.Router();
@ -36,7 +36,7 @@ privateRouter
.post(
bodyParser.urlencoded({extended: true}),
middleware.isPrivateSessionAuth,
brute.privateBlog,
web.shared.middlewares.brute.privateBlog,
middleware.authenticateProtection,
_renderer
);

View File

@ -3,7 +3,7 @@ var oauth2orize = require('oauth2orize'),
passport = require('passport'),
models = require('../../models'),
authUtils = require('./utils'),
spamPrevention = require('../../web/shared/middlewares/api/spam-prevention'),
web = require('../../web'),
common = require('../../lib/common'),
oauthServer,
oauth;
@ -31,7 +31,8 @@ function exchangeRefreshToken(client, refreshToken, scope, body, authInfo, done)
}
// @TODO: this runs outside of the transaction
spamPrevention.userLogin().reset(authInfo.ip, body.refresh_token + 'login');
web.shared.middlewares.api.spamPrevention.userLogin()
.reset(authInfo.ip, body.refresh_token + 'login');
return authUtils.createTokens({
clientId: token.client_id,
@ -76,7 +77,9 @@ function exchangePassword(client, username, password, scope, body, authInfo, don
});
})
.then(function then(response) {
spamPrevention.userLogin().reset(authInfo.ip, username + 'login');
web.shared.middlewares.api.spamPrevention.userLogin()
.reset(authInfo.ip, username + 'login');
return done(null, response.access_token, response.refresh_token, {expires_in: response.expires_in});
})
.catch(function (err) {
@ -104,7 +107,8 @@ function exchangeAuthorizationCode(req, res, next) {
}));
}
spamPrevention.userLogin().reset(req.authInfo.ip, req.body.authorizationCode + 'login');
web.shared.middlewares.api.spamPrevention.userLogin()
.reset(req.authInfo.ip, req.body.authorizationCode + 'login');
authUtils.createTokens({
clientId: req.client.id,

View File

@ -1,22 +1,11 @@
const debug = require('ghost-ignition').debug('admin');
const express = require('express');
// App requires
const serveStatic = require('express').static;
const config = require('../../config');
const constants = require('../../lib/constants');
const urlService = require('../../services/url');
// Middleware
// Admin only middleware
const shared = require('../shared');
const adminMiddleware = require('./middleware');
const serveStatic = require('express').static;
// Global/shared middleware
const cacheControl = require('../shared/middlewares/cache-control');
const {adminRedirect} = require('../shared/middlewares/url-redirects');
const errorHandler = require('../shared/middlewares/error-handler');
const maintenance = require('../shared/middlewares/maintenance');
const prettyURLs = require('../shared/middlewares/pretty-urls');
module.exports = function setupAdminApp() {
debug('Admin setup start');
@ -41,27 +30,27 @@ module.exports = function setupAdminApp() {
}
// Render error page in case of maintenance
adminApp.use(maintenance);
adminApp.use(shared.middlewares.maintenance);
// Force SSL if required
// must happen AFTER asset loading and BEFORE routing
adminApp.use(adminRedirect);
adminApp.use(shared.middlewares.urlRedirects.adminRedirect);
// Add in all trailing slashes & remove uppercase
// must happen AFTER asset loading and BEFORE routing
adminApp.use(prettyURLs);
adminApp.use(shared.middlewares.prettyUrls);
// Cache headers go last before serving the request
// Admin is currently set to not be cached at all
adminApp.use(cacheControl('private'));
adminApp.use(shared.middlewares.cacheControl('private'));
// Special redirects for the admin (these should have their own cache-control headers)
adminApp.use(adminMiddleware);
// Finally, routing
adminApp.get('*', require('./controller'));
adminApp.use(errorHandler.pageNotFound);
adminApp.use(errorHandler.handleHTMLResponse);
adminApp.use(shared.middlewares.errorHandler.pageNotFound);
adminApp.use(shared.middlewares.errorHandler.handleHTMLResponse);
debug('Admin setup end');

View File

@ -1,22 +1,10 @@
// # API routes
const debug = require('ghost-ignition').debug('api');
const boolParser = require('express-query-boolean');
const express = require('express');
// routes
const bodyParser = require('body-parser');
const shared = require('../../../shared');
const routes = require('./routes');
// Include the middleware
// API specific
const versionMatch = require('../../../shared/middlewares/api/version-match'); // global
// Shared
const bodyParser = require('body-parser'); // global, shared
const cacheControl = require('../../../shared/middlewares/cache-control'); // global, shared
const maintenance = require('../../../shared/middlewares/maintenance'); // global, shared
const errorHandler = require('../../../shared/middlewares/error-handler'); // global, shared
module.exports = function setupApiApp() {
debug('Admin API v2 setup start');
const apiApp = express();
@ -31,21 +19,21 @@ module.exports = function setupApiApp() {
apiApp.use(boolParser());
// send 503 json response in case of maintenance
apiApp.use(maintenance);
apiApp.use(shared.middlewares.maintenance);
// Check version matches for API requests, depends on res.locals.safeVersion being set
// Therefore must come after themeHandler.ghostLocals, for now
apiApp.use(versionMatch);
apiApp.use(shared.middlewares.api.versionMatch);
// API shouldn't be cached
apiApp.use(cacheControl('private'));
apiApp.use(shared.middlewares.cacheControl('private'));
// Routing
apiApp.use(routes());
// API error handling
apiApp.use(errorHandler.resourceNotFound);
apiApp.use(errorHandler.handleJSONResponse);
apiApp.use(shared.middlewares.errorHandler.resourceNotFound);
apiApp.use(shared.middlewares.errorHandler.handleJSONResponse);
debug('Admin API v2 setup end');

View File

@ -1,7 +1,5 @@
const prettyURLs = require('../../../shared/middlewares/pretty-urls');
const cors = require('../../../shared/middlewares/api/cors');
const {adminRedirect} = require('../../../shared/middlewares/url-redirects');
const auth = require('../../../../services/auth');
const shared = require('../../../shared');
/**
* Authentication for private endpoints
@ -10,9 +8,9 @@ module.exports.authenticatePrivate = [
auth.authenticate.authenticateClient,
auth.authenticate.authenticateUser,
auth.authorize.requiresAuthorizedUser,
cors,
adminRedirect,
prettyURLs
shared.middlewares.api.cors,
shared.middlewares.urlRedirects.adminRedirect,
shared.middlewares.prettyUrls
];
/**
@ -23,8 +21,8 @@ module.exports.authenticateClient = function authenticateClient(client) {
auth.authenticate.authenticateClient,
auth.authenticate.authenticateUser,
auth.authorize.requiresAuthorizedClient(client),
cors,
adminRedirect,
prettyURLs
shared.middlewares.api.cors,
shared.middlewares.urlRedirects.adminRedirect,
shared.middlewares.prettyUrls
];
};

View File

@ -1,24 +1,15 @@
const express = require('express');
// This essentially provides the controllers for the routes
const os = require('os');
const multer = require('multer');
const api = require('../../../../api');
// Middleware
const mw = require('./middleware');
// API specific
const auth = require('../../../../services/auth');
const cors = require('../../../shared/middlewares/api/cors');
const brute = require('../../../shared/middlewares/brute');
const shared = require('../../../shared');
// Handling uploads & imports
const tmpdir = require('os').tmpdir;
const upload = require('multer')({dest: tmpdir()});
const validation = require('../../../shared/middlewares/validation');
const image = require('../../../shared/middlewares/image');
// Temporary
// @TODO find a more appy way to do this!
const labs = require('../../../shared/middlewares/labs');
const tmpdir = os.tmpdir;
const upload = multer({dest: tmpdir()});
module.exports = function apiRoutes() {
const router = express.Router();
@ -27,7 +18,7 @@ module.exports = function apiRoutes() {
router.del = router.delete;
// ## CORS pre-flight check
router.options('*', cors);
router.options('*', shared.middlewares.api.cors);
// ## Configuration
router.get('/configuration', api.http(api.configuration.read));
@ -53,7 +44,7 @@ module.exports = function apiRoutes() {
router.post('/settings/routes/yaml',
mw.authenticatePrivate,
upload.single('routes'),
validation.upload({type: 'routes'}),
shared.middlewares.validation.upload({type: 'routes'}),
api.http(api.settings.upload)
);
@ -82,21 +73,21 @@ module.exports = function apiRoutes() {
router.del('/tags/:id', mw.authenticatePrivate, api.http(api.tags.destroy));
// ## Subscribers
router.get('/subscribers', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.browse));
router.get('/subscribers/csv', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.exportCSV));
router.get('/subscribers', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.browse));
router.get('/subscribers/csv', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.exportCSV));
router.post('/subscribers/csv',
labs.subscribers,
shared.middlewares.labs.subscribers,
mw.authenticatePrivate,
upload.single('subscribersfile'),
validation.upload({type: 'subscribers'}),
shared.middlewares.validation.upload({type: 'subscribers'}),
api.http(api.subscribers.importCSV)
);
router.get('/subscribers/:id', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.read));
router.get('/subscribers/email/:email', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.read));
router.post('/subscribers', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.add));
router.put('/subscribers/:id', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.edit));
router.del('/subscribers/:id', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.destroy));
router.del('/subscribers/email/:email', labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.destroy));
router.get('/subscribers/:id', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.read));
router.get('/subscribers/email/:email', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.read));
router.post('/subscribers', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.add));
router.put('/subscribers/:id', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.edit));
router.del('/subscribers/:id', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.destroy));
router.del('/subscribers/email/:email', shared.middlewares.labs.subscribers, mw.authenticatePrivate, api.http(api.subscribers.destroy));
// ## Roles
router.get('/roles/', mw.authenticatePrivate, api.http(api.roles.browse));
@ -118,7 +109,7 @@ module.exports = function apiRoutes() {
router.post('/themes/upload',
mw.authenticatePrivate,
upload.single('theme'),
validation.upload({type: 'themes'}),
shared.middlewares.validation.upload({type: 'themes'}),
api.http(api.themes.upload)
);
@ -142,7 +133,7 @@ module.exports = function apiRoutes() {
router.post('/db',
mw.authenticatePrivate,
upload.single('importfile'),
validation.upload({type: 'db'}),
shared.middlewares.validation.upload({type: 'db'}),
api.http(api.db.importContent)
);
router.del('/db', mw.authenticatePrivate, api.http(api.db.deleteAllContent));
@ -156,11 +147,11 @@ module.exports = function apiRoutes() {
// ## Authentication
router.post('/authentication/passwordreset',
brute.globalReset,
brute.userReset,
shared.middlewares.brute.globalReset,
shared.middlewares.brute.userReset,
api.http(api.authentication.generateResetToken)
);
router.put('/authentication/passwordreset', brute.globalBlock, api.http(api.authentication.resetPassword));
router.put('/authentication/passwordreset', shared.middlewares.brute.globalBlock, api.http(api.authentication.resetPassword));
router.post('/authentication/invitation', api.http(api.authentication.acceptInvitation));
router.get('/authentication/invitation', api.http(api.authentication.isInvitation));
router.post('/authentication/setup', api.http(api.authentication.setup));
@ -169,8 +160,8 @@ module.exports = function apiRoutes() {
router.post('/authentication/token',
mw.authenticateClient(),
brute.globalBlock,
brute.userLogin,
shared.middlewares.brute.globalBlock,
shared.middlewares.brute.userLogin,
auth.oauth.generateAccessToken
);
@ -181,8 +172,8 @@ module.exports = function apiRoutes() {
router.post('/uploads',
mw.authenticatePrivate,
upload.single('uploadimage'),
validation.upload({type: 'images'}),
image.normalize,
shared.middlewares.validation.upload({type: 'images'}),
shared.middlewares.image.normalize,
api.http(api.uploads.add)
);
@ -191,8 +182,8 @@ module.exports = function apiRoutes() {
router.post('/uploads/icon',
mw.authenticatePrivate,
upload.single('uploadimage'),
validation.upload({type: 'icons'}),
validation.blogIcon(),
shared.middlewares.validation.upload({type: 'icons'}),
shared.middlewares.validation.blogIcon(),
api.http(api.uploads.add)
);
@ -207,7 +198,7 @@ module.exports = function apiRoutes() {
router.post('/redirects/json',
mw.authenticatePrivate,
upload.single('redirects'),
validation.upload({type: 'redirects'}),
shared.middlewares.validation.upload({type: 'redirects'}),
api.http(api.redirects.upload)
);

View File

@ -1,18 +1,9 @@
// # API routes
const debug = require('ghost-ignition').debug('api');
const boolParser = require('express-query-boolean');
const express = require('express');
// routes
const shared = require('../../../shared');
const routes = require('./routes');
// Include the middleware
// Shared
const cacheControl = require('../../../shared/middlewares/cache-control'); // global, shared
const maintenance = require('../../../shared/middlewares/maintenance'); // global, shared
const errorHandler = require('../../../shared/middlewares/error-handler'); // global, shared
module.exports = function setupApiApp() {
debug('Content API v2 setup start');
const apiApp = express();
@ -23,17 +14,17 @@ module.exports = function setupApiApp() {
apiApp.use(boolParser());
// send 503 json response in case of maintenance
apiApp.use(maintenance);
apiApp.use(shared.middlewares.maintenance);
// API shouldn't be cached
apiApp.use(cacheControl('private'));
apiApp.use(shared.middlewares.cacheControl('private'));
// Routing
apiApp.use(routes());
// API error handling
apiApp.use(errorHandler.resourceNotFound);
apiApp.use(errorHandler.handleJSONResponse);
apiApp.use(shared.middlewares.errorHandler.resourceNotFound);
apiApp.use(shared.middlewares.errorHandler.handleJSONResponse);
debug('Content API v2 setup end');

View File

@ -1,7 +1,5 @@
const prettyURLs = require('../../../shared/middlewares/pretty-urls');
const cors = require('../../../shared/middlewares/api/cors');
const {adminRedirect} = require('../../../shared/middlewares/url-redirects');
const auth = require('../../../../services/auth');
const shared = require('../../../shared');
/**
* Auth Middleware Packages
@ -20,7 +18,7 @@ module.exports.authenticatePublic = [
auth.authenticate.authenticateUser,
// This is a labs-enabled middleware
auth.authorize.requiresAuthorizedUserPublicAPI,
cors,
adminRedirect,
prettyURLs
shared.middlewares.api.cors,
shared.middlewares.urlRedirects.adminRedirect,
shared.middlewares.prettyUrls
];

View File

@ -1,17 +1,8 @@
const express = require('express');
// This essentially provides the controllers for the routes
const api = require('../../../../api');
// Middleware
const shared = require('../../../shared');
const mw = require('./middleware');
// API specific
const cors = require('../../../shared/middlewares/api/cors');
// Temporary
// @TODO find a more appy way to do this!
const labs = require('../../../shared/middlewares/labs');
module.exports = function apiRoutes() {
const router = express.Router();
@ -19,7 +10,7 @@ module.exports = function apiRoutes() {
router.del = router.delete;
// ## CORS pre-flight check
router.options('*', cors);
router.options('*', shared.middlewares.api.cors);
// ## Configuration
router.get('/configuration', api.http(api.configuration.read));
@ -40,7 +31,8 @@ module.exports = function apiRoutes() {
router.get('/tags/slug/:slug', mw.authenticatePublic, api.http(api.tags.read));
// ## Subscribers
router.post('/subscribers', labs.subscribers, mw.authenticatePublic, api.http(api.subscribers.add));
// @TODO: find a way than `middlewares.labs`
router.post('/subscribers', shared.middlewares.labs.subscribers, mw.authenticatePublic, api.http(api.subscribers.add));
// ## Clients
router.get('/clients/slug/:slug', api.http(api.clients.read));

5
core/server/web/index.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
get shared() {
return require('./shared');
}
};

View File

@ -1,16 +1,9 @@
const debug = require('ghost-ignition').debug('app');
const express = require('express');
// App requires
const config = require('../config');
// middleware
const compress = require('compression');
const netjet = require('netjet');
// local middleware
const ghostLocals = require('./shared/middlewares/ghost-locals');
const logRequest = require('./shared/middlewares/log-request');
const shared = require('./shared');
module.exports = function setupParentApp(options = {}) {
debug('ParentApp setup start');
@ -22,7 +15,7 @@ module.exports = function setupParentApp(options = {}) {
// (X-Forwarded-Proto header will be checked, if present)
parentApp.enable('trust proxy');
parentApp.use(logRequest);
parentApp.use(shared.middlewares.logRequest);
// enabled gzip compression by default
if (config.get('compress') !== false) {
@ -39,7 +32,7 @@ module.exports = function setupParentApp(options = {}) {
}
// This sets global res.locals which are needed everywhere
parentApp.use(ghostLocals);
parentApp.use(shared.middlewares.ghostLocals);
// Mount the apps on the parentApp
// API

View File

@ -0,0 +1,9 @@
module.exports = {
get middlewares() {
return require('./middlewares');
},
get utils() {
return require('./utils');
}
};

View File

@ -0,0 +1,13 @@
module.exports = {
get cors() {
return require('./cors');
},
get spamPrevention() {
return require('./spam-prevention');
},
get versionMatch() {
return require('./version-match');
}
};

View File

@ -1,5 +1,77 @@
module.exports = {
get api() {
return require('./api');
},
get image() {
return require('./image');
},
get validation() {
return require('./validation');
},
get adminRedirects() {
return require('./admin-redirects');
},
get brute() {
return require('./brute');
},
get cacheControl() {
return require('./cache-control');
},
get customRedirects() {
return require('./custom-redirects');
},
get errorHandler() {
return require('./error-handler');
},
get frontendClient() {
return require('./frontend-client');
},
get ghostLocals() {
return require('./ghost-locals');
},
get labs() {
return require('./labs');
},
get logRequest() {
return require('./log-request');
},
get maintenance() {
return require('./maintenance');
},
get prettyUrls() {
return require('./pretty-urls');
},
get serveFavicon() {
return require('./serve-favicon');
},
get servePublicFile() {
return require('./serve-public-file');
},
get staticTheme() {
return require('./static-theme');
},
get uncapitalise() {
return require('./uncapitalise');
},
get urlRedirects() {
return require('./url-redirects');
}
};

View File

@ -1,2 +1,9 @@
exports.upload = require('./upload');
exports.blogIcon = require('./blog-icon');
module.exports = {
get upload() {
return require('./upload');
},
get blogIcon() {
return require('./blog-icon');
}
};

View File

@ -8,30 +8,10 @@ const apps = require('../../services/apps');
const constants = require('../../lib/constants');
const storage = require('../../adapters/storage');
const urlService = require('../../services/url');
// This should probably be an internal app
const sitemapHandler = require('../../data/xml/sitemap/handler');
// Route Service
const siteRoutes = require('./routes');
// Global/shared middleware
const cacheControl = require('../shared/middlewares/cache-control');
const errorHandler = require('../shared/middlewares/error-handler');
const frontendClient = require('../shared/middlewares/frontend-client');
const maintenance = require('../shared/middlewares/maintenance');
const prettyURLs = require('../shared/middlewares/pretty-urls');
const urlRedirects = require('../shared/middlewares/url-redirects');
// local middleware
const servePublicFile = require('../shared/middlewares/serve-public-file');
const staticTheme = require('../shared/middlewares/static-theme');
const customRedirects = require('../shared/middlewares/custom-redirects');
const serveFavicon = require('../shared/middlewares/serve-favicon');
const adminRedirects = require('../shared/middlewares/admin-redirects');
// middleware for themes
const themeMiddleware = require('../../services/themes').middleware;
const siteRoutes = require('./routes');
const shared = require('../shared');
let router;
@ -50,32 +30,32 @@ module.exports = function setupSiteApp(options = {}) {
// you can extend Ghost with a custom redirects file
// see https://github.com/TryGhost/Ghost/issues/7707
customRedirects.use(siteApp);
shared.middlewares.customRedirects.use(siteApp);
// More redirects
siteApp.use(adminRedirects());
siteApp.use(shared.middlewares.adminRedirects());
// force SSL if blog url is set to https. The redirects handling must happen before asset and page routing,
// otherwise we serve assets/pages with http. This can cause mixed content warnings in the admin client.
siteApp.use(urlRedirects);
siteApp.use(shared.middlewares.urlRedirects);
// Static content/assets
// @TODO make sure all of these have a local 404 error handler
// Favicon
siteApp.use(serveFavicon());
siteApp.use(shared.middlewares.serveFavicon());
// /public/ghost-sdk.js
siteApp.use(servePublicFile('public/ghost-sdk.js', 'application/javascript', constants.ONE_HOUR_S));
siteApp.use(servePublicFile('public/ghost-sdk.min.js', 'application/javascript', constants.ONE_YEAR_S));
siteApp.use(shared.middlewares.servePublicFile('public/ghost-sdk.js', 'application/javascript', constants.ONE_HOUR_S));
siteApp.use(shared.middlewares.servePublicFile('public/ghost-sdk.min.js', 'application/javascript', constants.ONE_YEAR_S));
// Serve sitemap.xsl file
siteApp.use(servePublicFile('sitemap.xsl', 'text/xsl', constants.ONE_DAY_S));
siteApp.use(shared.middlewares.servePublicFile('sitemap.xsl', 'text/xsl', constants.ONE_DAY_S));
// Serve stylesheets for default templates
siteApp.use(servePublicFile('public/ghost.css', 'text/css', constants.ONE_HOUR_S));
siteApp.use(servePublicFile('public/ghost.min.css', 'text/css', constants.ONE_YEAR_S));
siteApp.use(shared.middlewares.servePublicFile('public/ghost.css', 'text/css', constants.ONE_HOUR_S));
siteApp.use(shared.middlewares.servePublicFile('public/ghost.min.css', 'text/css', constants.ONE_YEAR_S));
// Serve images for default templates
siteApp.use(servePublicFile('public/404-ghost@2x.png', 'png', constants.ONE_HOUR_S));
siteApp.use(servePublicFile('public/404-ghost.png', 'png', constants.ONE_HOUR_S));
siteApp.use(shared.middlewares.servePublicFile('public/404-ghost@2x.png', 'png', constants.ONE_HOUR_S));
siteApp.use(shared.middlewares.servePublicFile('public/404-ghost.png', 'png', constants.ONE_HOUR_S));
// Serve blog images using the storage adapter
siteApp.use('/' + urlService.utils.STATIC_IMAGE_URL_PREFIX, storage.getStorage().serve());
@ -95,11 +75,11 @@ module.exports = function setupSiteApp(options = {}) {
debug('Themes done');
// Theme static assets/files
siteApp.use(staticTheme());
siteApp.use(shared.middlewares.staticTheme());
debug('Static content done');
// Serve robots.txt if not found in theme
siteApp.use(servePublicFile('robots.txt', 'text/plain', constants.ONE_HOUR_S));
siteApp.use(shared.middlewares.servePublicFile('robots.txt', 'text/plain', constants.ONE_HOUR_S));
// setup middleware for internal apps
// @TODO: refactor this to be a proper app middleware hook for internal & external apps
@ -116,18 +96,18 @@ module.exports = function setupSiteApp(options = {}) {
debug('Internal apps done');
// send 503 error page in case of maintenance
siteApp.use(maintenance);
siteApp.use(shared.middlewares.maintenance);
// Add in all trailing slashes & remove uppercase
// must happen AFTER asset loading and BEFORE routing
siteApp.use(prettyURLs);
siteApp.use(shared.middlewares.prettyUrls);
// ### Caching
// Site frontend is cacheable
siteApp.use(cacheControl('public'));
siteApp.use(shared.middlewares.cacheControl('public'));
// Fetch the frontend client into res.locals
siteApp.use(frontendClient);
siteApp.use(shared.middlewares.frontendClient);
debug('General middleware done');
@ -138,8 +118,8 @@ module.exports = function setupSiteApp(options = {}) {
siteApp.use(SiteRouter);
// ### Error handlers
siteApp.use(errorHandler.pageNotFound);
siteApp.use(errorHandler.handleThemeResponse);
siteApp.use(shared.middlewares.errorHandler.pageNotFound);
siteApp.use(shared.middlewares.errorHandler.handleThemeResponse);
debug('Site setup end');

View File

@ -23,7 +23,7 @@ var Promise = require('bluebird'),
settingsService = require('../../server/services/settings'),
settingsCache = require('../../server/services/settings/cache'),
imageLib = require('../../server/lib/image'),
customRedirectsMiddleware = require('../../server/web/shared/middlewares/custom-redirects'),
web = require('../../server/web'),
permissions = require('../../server/services/permissions'),
sequence = require('../../server/lib/promise/sequence'),
themes = require('../../server/services/themes'),
@ -943,7 +943,7 @@ startGhost = function startGhost(options) {
});
})
.then(function () {
customRedirectsMiddleware.reload();
web.shared.middlewares.customRedirects.reload();
common.events.emit('server.start');
return ghostServer;