Ghost/core/server/site/routes.js
Hannah Wolfe 016ee17ebb
Rework route service to prevent circular dependencies (#9229)
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 🎉
2017-11-09 13:58:22 +00:00

47 lines
1.8 KiB
JavaScript

var debug = require('ghost-ignition').debug('site:routes'),
routeService = require('../services/route'),
siteRouter = routeService.siteRouter,
// Sub Routers
appRouter = routeService.appRouter,
channelsService = require('../services/channels'),
// Controllers
controllers = require('../controllers'),
// Utils for creating paths
// @TODO: refactor these away
config = require('../config'),
utils = require('../utils');
module.exports = function siteRoutes() {
// @TODO move this path out of this file!
// Note this also exists in api/index.js
var previewRoute = utils.url.urlJoin('/', config.get('routeKeywords').preview, ':uuid', ':options?');
// Preview - register controller as route
// Ideal version, as we don't want these paths all over the place
// previewRoute = new Route('GET /:t_preview/:uuid/:options?', previewController);
// siteRouter.mountRoute(previewRoute);
// Orrrrr maybe preview should be an internal App??!
siteRouter.mountRoute(previewRoute, controllers.preview);
// Channels - register sub-router
// The purpose of having a parentRouter for channels, is so that we can load channels from wherever we want:
// config, settings, apps, etc, and that it will be possible for the router to be reloaded.
siteRouter.mountRouter(channelsService.router());
// Apps - register sub-router
// The purpose of having a parentRouter for apps, is that Apps can register a route whenever they want.
// Apps cannot yet deregister, it's complex to implement and I don't yet have a clear use-case for this.
siteRouter.mountRouter(appRouter.router());
// Default - register entry controller as route
siteRouter.mountRoute('*', controllers.entry);
debug('Routes:', routeService.registry.getAll());
return siteRouter.router();
};