Refactored apps to have access to a router

refs #9192

- Instead of `setupRoutes` function in apps that gets passed a router, there is now a registerRouter function as part of the proxy
- Moved towards a route service, which will know about all routes
- Using classes to abstract away shared behaviour

Notes:

- changing the app proxy didn't result in a test failure!
- structure of route service is totally new and may change a lot yet
This commit is contained in:
Hannah Wolfe 2017-10-31 09:46:59 +00:00
parent bcf5a1bc34
commit 9b54ed0689
8 changed files with 48 additions and 19 deletions

View File

@ -5,9 +5,7 @@ var router = require('./lib/router'),
module.exports = {
activate: function activate(ghost) {
registerHelpers(ghost);
},
setupRoutes: function setupRoutes(siteRouter) {
siteRouter.use('*/' + config.get('routeKeywords').amp + '/', router);
ghost.routeService.registerRouter('*/' + config.get('routeKeywords').amp + '/', router);
}
};

View File

@ -26,15 +26,13 @@ module.exports = {
}
}
ghost.routeService.registerRouter('/' + config.get('routeKeywords').private + '/', router);
registerHelpers(ghost);
},
setupMiddleware: function setupMiddleware(siteApp) {
siteApp.use(middleware.checkIsPrivate);
siteApp.use(middleware.filterPrivateRoutes);
},
setupRoutes: function setupRoutes(siteRouter) {
siteRouter.use('/' + config.get('routeKeywords').private + '/', router);
}
};

View File

@ -7,11 +7,10 @@ var router = require('./lib/router'),
module.exports = {
activate: function activate(ghost) {
// TODO, how to do all this only if the Subscribers flag is set?!
registerHelpers(ghost);
},
setupRoutes: function setupRoutes(siteRouter) {
siteRouter.use('/' + config.get('routeKeywords').subscribe + '/', function labsEnabledRouter(req, res, next) {
ghost.routeService.registerRouter('/' + config.get('routeKeywords').subscribe + '/', function labsEnabledRouter(req, res, next) {
if (labs.isSet('subscribers') === true) {
return router.apply(this, arguments);
}

View File

@ -3,6 +3,7 @@ var _ = require('lodash'),
helpers = require('../../helpers/register'),
filters = require('../../filters'),
i18n = require('../../i18n'),
router = require('../route').appRouter,
generateProxyFunctions;
generateProxyFunctions = function (name, permissions, isInternal) {
@ -69,6 +70,12 @@ generateProxyFunctions = function (name, permissions, isInternal) {
register: checkRegisterPermissions('helpers', helpers.registerThemeHelper.bind(helpers)),
registerAsync: checkRegisterPermissions('helpers', helpers.registerAsyncThemeHelper.bind(helpers))
},
// Expose the route service...
routeService: {
// This allows for mounting an entirely new Router at a path...
registerRouter: checkRegisterPermissions('routes', router.registerRouter.bind(router))
},
// Mini proxy to the API - needs review
api: {
posts: passThruAppContextToApi('posts',
_.pick(api.posts, 'browse', 'read', 'edit', 'add', 'destroy')

View File

@ -0,0 +1,15 @@
/**
* An instance of router that is provided to Apps, to mount routes into.
*/
var debug = require('ghost-ignition').debug('services:routes:app'),
Router = require('./base/Router');
class AppRouter extends Router {
registerRouter(path, router) {
debug('registerRouter for', path);
this.router.use(path, router);
}
}
module.exports = AppRouter;

View File

@ -0,0 +1,9 @@
var expressRouter = require('express').Router;
class Router {
constructor() {
this.router = expressRouter({mergeParams: true});
}
}
module.exports = Router;

View File

@ -0,0 +1,9 @@
/**
* # Route Service
*
* Everything in here is 100% experimental
*/
var AppRouter = require('./AppRouter');
module.exports.appRouter = new AppRouter();

View File

@ -1,8 +1,8 @@
var express = require('express'),
path = require('path'),
config = require('../config'),
controllers = require('../controllers'),
channels = require('../controllers/channels'),
apps = require('../services/route').appRouter,
utils = require('../utils');
module.exports = function siteRouter() {
@ -21,14 +21,8 @@ module.exports = function siteRouter() {
// Channels
router.use(channels.router());
// setup routes for internal apps
// @TODO: refactor this to be a proper app route 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('setupRoutes')) {
app.setupRoutes(router);
}
});
// setup routes for apps
router.use(apps.router);
// Default
router.get('*', controllers.single);