Skip to content

Commit

Permalink
Refactored apps to have access to a router
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ErisDS committed Nov 1, 2017
1 parent bcf5a1b commit 9b54ed0
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 19 deletions.
4 changes: 1 addition & 3 deletions core/server/apps/amp/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
};
6 changes: 2 additions & 4 deletions core/server/apps/private-blogging/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
};
5 changes: 2 additions & 3 deletions core/server/apps/subscribers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
7 changes: 7 additions & 0 deletions core/server/services/apps/proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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')
Expand Down
15 changes: 15 additions & 0 deletions core/server/services/route/AppRouter.js
Original file line number Diff line number Diff line change
@@ -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;
9 changes: 9 additions & 0 deletions core/server/services/route/base/Router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
var expressRouter = require('express').Router;

class Router {
constructor() {
this.router = expressRouter({mergeParams: true});
}
}

module.exports = Router;
9 changes: 9 additions & 0 deletions core/server/services/route/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* # Route Service
*
* Everything in here is 100% experimental
*/

var AppRouter = require('./AppRouter');

module.exports.appRouter = new AppRouter();
12 changes: 3 additions & 9 deletions core/server/site/routes.js
Original file line number Diff line number Diff line change
@@ -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() {
Expand All @@ -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);
Expand Down

0 comments on commit 9b54ed0

Please sign in to comment.