2021-07-06 13:02:37 +03:00
|
|
|
const debug = require('@tryghost/debug')('routing');
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
const _ = require('lodash');
|
|
|
|
const StaticRoutesRouter = require('./StaticRoutesRouter');
|
|
|
|
const StaticPagesRouter = require('./StaticPagesRouter');
|
|
|
|
const CollectionRouter = require('./CollectionRouter');
|
|
|
|
const TaxonomyRouter = require('./TaxonomyRouter');
|
|
|
|
const PreviewRouter = require('./PreviewRouter');
|
|
|
|
const ParentRouter = require('./ParentRouter');
|
2021-08-13 11:09:11 +03:00
|
|
|
const EmailRouter = require('./EmailRouter');
|
2019-11-15 12:36:49 +03:00
|
|
|
const UnsubscribeRouter = require('./UnsubscribeRouter');
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
|
2021-07-07 17:49:45 +03:00
|
|
|
// This emits its own routing events
|
|
|
|
const events = require('../../../server/lib/common/events');
|
|
|
|
|
2021-02-23 17:02:11 +03:00
|
|
|
const defaultApiVersion = 'v4';
|
2019-11-08 13:24:10 +03:00
|
|
|
|
2021-10-14 20:10:36 +03:00
|
|
|
// This registry thing should be passed into here as a dependency once the module
|
|
|
|
// is rewritten into the class + DI pattern
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
const registry = require('./registry');
|
2018-07-12 14:40:37 +03:00
|
|
|
let siteRouter;
|
2021-10-13 17:14:33 +03:00
|
|
|
let _urlService;
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
|
2019-04-22 00:55:22 +03:00
|
|
|
/**
|
|
|
|
* @description The `init` function will return the wrapped parent express router and will start creating all
|
|
|
|
* routers if you pass the option "start: true".
|
|
|
|
*
|
|
|
|
* CASES:
|
|
|
|
* - if Ghost starts, it will first init the site app with the wrapper router and then call `start`
|
|
|
|
* separately, because it could be that your blog goes into maintenance mode
|
2021-06-28 14:24:16 +03:00
|
|
|
* - if you change your route settings, we will re-initialise routing
|
2019-04-22 00:55:22 +03:00
|
|
|
*
|
|
|
|
* @param {Object} options
|
2021-10-13 19:26:47 +03:00
|
|
|
* @param {Boolean} [options.start] - flag controlling if the frontend Routes should be reinitialized
|
|
|
|
* @param {String} options.apiVersion - API version frontend Routes should communicate through
|
|
|
|
* @param {Object} options.routerSettings - JSON configuration to build frontend Routes
|
|
|
|
* @param {Object} options.urlService - service providing resouce URL utility functions such as owns, getUrlByResourceId, and getResourceById
|
2019-04-22 00:55:22 +03:00
|
|
|
* @returns {ExpressRouter}
|
|
|
|
*/
|
2021-10-13 17:14:33 +03:00
|
|
|
const init = ({start = false, routerSettings, apiVersion, urlService}) => {
|
|
|
|
_urlService = urlService;
|
2021-07-06 13:38:52 +03:00
|
|
|
debug('bootstrap init', start, apiVersion, routerSettings);
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
|
|
|
|
registry.resetAllRouters();
|
|
|
|
registry.resetAllRoutes();
|
|
|
|
|
2020-05-22 21:22:20 +03:00
|
|
|
events.emit('routers.reset');
|
2018-10-08 06:29:21 +03:00
|
|
|
|
2018-07-12 14:40:37 +03:00
|
|
|
siteRouter = new ParentRouter('SiteRouter');
|
2018-08-06 18:18:59 +03:00
|
|
|
registry.setRouter('siteRouter', siteRouter);
|
|
|
|
|
2021-07-06 13:38:52 +03:00
|
|
|
if (start) {
|
|
|
|
apiVersion = apiVersion || defaultApiVersion;
|
|
|
|
this.start(apiVersion, routerSettings);
|
2018-08-06 18:18:59 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return siteRouter.router();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-06-28 14:24:16 +03:00
|
|
|
* @description This function will create the routers based on the route settings
|
2019-04-22 00:55:22 +03:00
|
|
|
*
|
|
|
|
* The routers are created in a specific order. This order defines who can get a resource first or
|
|
|
|
* who can dominant other routers.
|
2018-08-06 18:18:59 +03:00
|
|
|
*
|
2019-11-15 12:36:49 +03:00
|
|
|
* 1. Preview + Unsubscribe Routers: Strongest inbuilt features, which you can never override.
|
2019-04-22 00:55:22 +03:00
|
|
|
* 2. Static Routes: Very strong, because you can override any urls and redirect to a static route.
|
|
|
|
* 3. Taxonomies: Stronger than collections, because it's an inbuilt feature.
|
|
|
|
* 4. Collections
|
|
|
|
* 5. Static Pages: Weaker than collections, because we first try to find a post slug and fallback to lookup a static page.
|
2020-03-19 18:23:10 +03:00
|
|
|
* 6. Internal Apps: Weakest
|
2021-06-28 14:24:16 +03:00
|
|
|
*
|
|
|
|
* @param {string} apiVersion
|
2021-07-06 13:38:52 +03:00
|
|
|
* @param {object} routerSettings
|
2018-08-06 18:18:59 +03:00
|
|
|
*/
|
2021-10-13 16:39:43 +03:00
|
|
|
const start = (apiVersion, routerSettings) => {
|
2021-07-06 13:38:52 +03:00
|
|
|
debug('bootstrap start', apiVersion, routerSettings);
|
2019-06-19 12:30:28 +03:00
|
|
|
const RESOURCE_CONFIG = require(`./config/${apiVersion}`);
|
2019-01-04 23:59:39 +03:00
|
|
|
|
2019-11-15 12:36:49 +03:00
|
|
|
const unsubscribeRouter = new UnsubscribeRouter();
|
|
|
|
siteRouter.mountRouter(unsubscribeRouter.router());
|
|
|
|
registry.setRouter('unsubscribeRouter', unsubscribeRouter);
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
|
2021-10-06 22:23:42 +03:00
|
|
|
const emailRouter = new EmailRouter(RESOURCE_CONFIG);
|
|
|
|
siteRouter.mountRouter(emailRouter.router());
|
|
|
|
registry.setRouter('emailRouter', emailRouter);
|
2021-08-13 11:09:11 +03:00
|
|
|
|
2019-11-15 12:36:49 +03:00
|
|
|
const previewRouter = new PreviewRouter(RESOURCE_CONFIG);
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
siteRouter.mountRouter(previewRouter.router());
|
|
|
|
registry.setRouter('previewRouter', previewRouter);
|
|
|
|
|
2021-07-06 13:38:52 +03:00
|
|
|
_.each(routerSettings.routes, (value, key) => {
|
2021-06-28 14:24:16 +03:00
|
|
|
const staticRoutesRouter = new StaticRoutesRouter(key, value);
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
siteRouter.mountRouter(staticRoutesRouter.router());
|
|
|
|
|
|
|
|
registry.setRouter(staticRoutesRouter.identifier, staticRoutesRouter);
|
|
|
|
});
|
|
|
|
|
2021-07-06 13:38:52 +03:00
|
|
|
_.each(routerSettings.collections, (value, key) => {
|
2019-01-04 23:59:39 +03:00
|
|
|
const collectionRouter = new CollectionRouter(key, value, RESOURCE_CONFIG);
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
siteRouter.mountRouter(collectionRouter.router());
|
|
|
|
registry.setRouter(collectionRouter.identifier, collectionRouter);
|
|
|
|
});
|
|
|
|
|
2019-01-04 23:59:39 +03:00
|
|
|
const staticPagesRouter = new StaticPagesRouter(RESOURCE_CONFIG);
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
siteRouter.mountRouter(staticPagesRouter.router());
|
|
|
|
|
|
|
|
registry.setRouter('staticPagesRouter', staticPagesRouter);
|
|
|
|
|
2021-07-06 13:38:52 +03:00
|
|
|
_.each(routerSettings.taxonomies, (value, key) => {
|
2020-06-27 19:52:03 +03:00
|
|
|
const taxonomyRouter = new TaxonomyRouter(key, value, RESOURCE_CONFIG);
|
|
|
|
siteRouter.mountRouter(taxonomyRouter.router());
|
|
|
|
|
|
|
|
registry.setRouter(taxonomyRouter.identifier, taxonomyRouter);
|
|
|
|
});
|
|
|
|
|
2018-06-24 01:31:59 +03:00
|
|
|
const appRouter = new ParentRouter('AppsRouter');
|
✨Dynamic Routing Beta (#9596)
refs #9601
### Dynamic Routing
This is the beta version of dynamic routing.
- we had a initial implementation of "channels" available in the codebase
- we have removed and moved this implementation
- there is now a centralised place for dynamic routing - server/services/routing
- each routing component is represented by a router type e.g. collections, routes, static pages, taxonomies, rss, preview of posts
- keep as much as possible logic of routing helpers, middlewares and controllers
- ensure test coverage
- connect all the things together
- yaml file + validation
- routing + routers
- url service
- sitemaps
- url access
- deeper implementation of yaml validations
- e.g. hard require slashes
- ensure routing hierarchy/order
- e.g. you enable the subscriber app
- you have a custom static page, which lives under the same slug /subscribe
- static pages are stronger than apps
- e.g. the first collection owns the post it has filtered
- a post cannot live in two collections
- ensure apps are still working and hook into the routers layer (or better said: and register in the routing service)
- put as much as possible comments to the code base for better understanding
- ensure a clean debug log
- ensure we can unmount routes
- e.g. you have a collection permalink of /:slug/ represented by {globals.permalink}
- and you change the permalink in the admin to dated permalink
- the express route get's refreshed from /:slug/ to /:year/:month/:day/:slug/
- unmount without server restart, yey
- ensure we are backwards compatible
- e.g. render home.hbs for collection index if collection route is /
- ensure you can access your configured permalink from the settings table with {globals.permalink}
### Render 503 if url service did not finish
- return 503 if the url service has not finished generating the resource urls
### Rewrite sitemaps
- we have rewritten the sitemaps "service", because the url generator does no longer happen on runtime
- we generate all urls on bootstrap
- the sitemaps service will consume created resource and router urls
- these urls will be shown on the xml pages
- we listen on url events
- we listen on router events
- we no longer have to fetch the resources, which is nice
- the urlservice pre-fetches resources and emits their urls
- the urlservice is the only component who knows which urls are valid
- i made some ES6 adaptions
- we keep the caching logic -> only regenerate xml if there is a change
- updated tests
- checked test coverage (100%)
### Re-work usage of Url utility
- replace all usages of `urlService.utils.urlFor` by `urlService.getByResourceId`
- only for resources e.g. post, author, tag
- this is important, because with dynamic routing we no longer create static urls based on the settings permalink on runtime
- adapt url utility
- adapt tests
2018-06-05 20:02:20 +03:00
|
|
|
siteRouter.mountRouter(appRouter.router());
|
|
|
|
|
|
|
|
registry.setRouter('appRouter', appRouter);
|
|
|
|
|
|
|
|
debug('Routes:', registry.getAllRoutes());
|
|
|
|
};
|
2021-10-13 16:39:43 +03:00
|
|
|
|
2021-10-14 20:10:36 +03:00
|
|
|
/**
|
|
|
|
* This is a glue code to keep the implementation of routers away from
|
|
|
|
* this sort of logic. Ideally this method should not be ever called
|
|
|
|
* and handled completely on the URL Service layer without touching the frontend
|
|
|
|
* @param {Object} settingModel instance of the settings model
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
const handleTimezoneEdit = (settingModel) => {
|
|
|
|
const newTimezone = settingModel.attributes.value;
|
|
|
|
const previousTimezone = settingModel._previousAttributes.value;
|
|
|
|
|
|
|
|
if (newTimezone === previousTimezone) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* CASE: timezone changes
|
|
|
|
*
|
|
|
|
* If your permalink contains a date reference, we have to regenerate the urls.
|
|
|
|
*
|
|
|
|
* e.g. /:year/:month/:day/:slug/ or /:day/:slug/
|
|
|
|
*/
|
|
|
|
|
|
|
|
// NOTE: timezone change only affects the collection router with dated permalinks
|
|
|
|
const collectionRouter = registry.getRouterByName('CollectionRouter');
|
|
|
|
if (collectionRouter.getPermalinks().getValue().match(/:year|:month|:day/)) {
|
|
|
|
debug('handleTimezoneEdit: trigger regeneration');
|
|
|
|
|
|
|
|
this.internal.routerUpdated(collectionRouter);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-10-13 17:14:33 +03:00
|
|
|
module.exports.internal = {
|
|
|
|
owns: (routerId, id) => {
|
|
|
|
return _urlService.owns(routerId, id);
|
|
|
|
},
|
|
|
|
getUrlByResourceId: (id, options) => {
|
|
|
|
return _urlService.getUrlByResourceId(id, options);
|
|
|
|
},
|
|
|
|
getResourceById: (resourceId) => {
|
|
|
|
return _urlService.getResourceById(resourceId);
|
2021-10-14 14:22:49 +03:00
|
|
|
},
|
|
|
|
routerCreated: (router) => {
|
|
|
|
// NOTE: this event should be become an "internal frontend even"
|
|
|
|
// and should not be consumed by the modules outside the frontend
|
|
|
|
events.emit('router.created', this);
|
|
|
|
|
|
|
|
_urlService.onRouterAddedType(router);
|
2021-10-14 20:10:36 +03:00
|
|
|
},
|
|
|
|
routerUpdated: (router) => {
|
|
|
|
_urlService.onRouterUpdated(router);
|
2021-10-13 17:14:33 +03:00
|
|
|
}
|
|
|
|
};
|
2021-10-14 20:10:36 +03:00
|
|
|
|
|
|
|
// Public API methods called out by the backend
|
2021-10-13 16:39:43 +03:00
|
|
|
module.exports.init = init;
|
|
|
|
module.exports.start = start;
|
2021-10-14 20:10:36 +03:00
|
|
|
module.exports.handleTimezoneEdit = handleTimezoneEdit;
|