mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
597ec51afb
refs https://linear.app/tryghost/issue/CORE-104/decouple-frontend-routing-events-from-urlserver-events - The 'router.created' event should eventually be killed. For now the aim is to create a clear communication pathway between frontend's routing module and the URL service (similar to the frontend bridge concept on the "server" side)
93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
const debug = require('@tryghost/debug')('routing:static-pages-router');
|
|
const urlUtils = require('../../../shared/url-utils');
|
|
const ParentRouter = require('./ParentRouter');
|
|
const controllers = require('./controllers');
|
|
const bootstrap = require('./bootstrap');
|
|
|
|
/**
|
|
* @description Resource: pages
|
|
*/
|
|
class StaticPagesRouter extends ParentRouter {
|
|
constructor(RESOURCE_CONFIG) {
|
|
super('StaticPagesRouter');
|
|
|
|
this.RESOURCE_CONFIG = RESOURCE_CONFIG.QUERY.page;
|
|
|
|
// @NOTE: Permalink is always /:slug, not configure able
|
|
this.permalinks = {
|
|
value: '/:slug/'
|
|
};
|
|
|
|
this.permalinks.getValue = (options = {}) => {
|
|
options = options || {};
|
|
|
|
// @NOTE: url options are only required when registering urls in express.
|
|
// e.g. the UrlService will access the routes and doesn't want to know about possible url options
|
|
if (options.withUrlOptions) {
|
|
return urlUtils.urlJoin(this.permalinks.value, '/:options(edit)?/');
|
|
}
|
|
|
|
return this.permalinks.value;
|
|
};
|
|
|
|
debug(this.permalinks);
|
|
|
|
this._registerRoutes();
|
|
}
|
|
|
|
/**
|
|
* @description Register all routes of this router.
|
|
* @private
|
|
*/
|
|
_registerRoutes() {
|
|
// REGISTER: prepare context
|
|
this.router().use(this._prepareContext.bind(this));
|
|
|
|
this.router().param('slug', this._respectDominantRouter.bind(this));
|
|
|
|
// REGISTER: permalink for static pages
|
|
this.mountRoute(this.permalinks.getValue({withUrlOptions: true}), controllers.entry);
|
|
|
|
bootstrap.internal.routerCreated(this);
|
|
}
|
|
|
|
/**
|
|
* @description Prepare context for futher middlewares/controllers.
|
|
* @param {Object} req
|
|
* @param {Object} res
|
|
* @param {Function} next
|
|
* @private
|
|
*/
|
|
_prepareContext(req, res, next) {
|
|
res.routerOptions = {
|
|
type: 'entry',
|
|
filter: this.filter,
|
|
permalinks: this.permalinks.getValue({withUrlOptions: true}),
|
|
resourceType: this.getResourceType(),
|
|
query: this.RESOURCE_CONFIG,
|
|
context: ['page']
|
|
};
|
|
|
|
next();
|
|
}
|
|
|
|
/**
|
|
* @description Resource type.
|
|
* @returns {string}
|
|
*/
|
|
getResourceType() {
|
|
return 'pages';
|
|
}
|
|
|
|
/**
|
|
* @description This router has no index/default route. "/:slug/" is dynamic.
|
|
* @returns {null}
|
|
*/
|
|
getRoute() {
|
|
return null;
|
|
}
|
|
|
|
reset() {}
|
|
}
|
|
|
|
module.exports = StaticPagesRouter;
|