mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	feat(remountable-routes): allow /admin and /post to be remountable
This commit is contained in:
		| @@ -2,78 +2,78 @@ | |||||||
|  |  | ||||||
| const helpers = require('./helpers'); | const helpers = require('./helpers'); | ||||||
|  |  | ||||||
| module.exports = function (app, middleware, controllers) { | module.exports = function (app, name, middleware, controllers) { | ||||||
| 	const middlewares = [middleware.pluginHooks]; | 	const middlewares = [middleware.pluginHooks]; | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin', middleware, middlewares, controllers.admin.routeIndex); | 	helpers.setupAdminPageRoute(app, `/${name}`, middleware, middlewares, controllers.admin.routeIndex); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/dashboard', middleware, middlewares, controllers.admin.dashboard.get); | 	helpers.setupAdminPageRoute(app, `/${name}/dashboard`, middleware, middlewares, controllers.admin.dashboard.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/categories', middleware, middlewares, controllers.admin.categories.getAll); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/categories`, middleware, middlewares, controllers.admin.categories.getAll); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/categories/:category_id', middleware, middlewares, controllers.admin.categories.get); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/categories/:category_id`, middleware, middlewares, controllers.admin.categories.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/categories/:category_id/analytics', middleware, middlewares, controllers.admin.categories.getAnalytics); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/categories/:category_id/analytics`, middleware, middlewares, controllers.admin.categories.getAnalytics); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/privileges/:cid?', middleware, middlewares, controllers.admin.privileges.get); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/privileges/:cid?`, middleware, middlewares, controllers.admin.privileges.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/tags', middleware, middlewares, controllers.admin.tags.get); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/tags`, middleware, middlewares, controllers.admin.tags.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/users', middleware, middlewares, controllers.admin.users.index); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/users`, middleware, middlewares, controllers.admin.users.index); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/registration', middleware, middlewares, controllers.admin.users.registrationQueue); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/registration`, middleware, middlewares, controllers.admin.users.registrationQueue); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/admins-mods', middleware, middlewares, controllers.admin.adminsMods.get); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/admins-mods`, middleware, middlewares, controllers.admin.adminsMods.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/groups', middleware, middlewares, controllers.admin.groups.list); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/groups`, middleware, middlewares, controllers.admin.groups.list); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/groups/:name', middleware, middlewares, controllers.admin.groups.get); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/groups/:name`, middleware, middlewares, controllers.admin.groups.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/uploads', middleware, middlewares, controllers.admin.uploads.get); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/uploads`, middleware, middlewares, controllers.admin.uploads.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/manage/digest', middleware, middlewares, controllers.admin.digest.get); | 	helpers.setupAdminPageRoute(app, `/${name}/manage/digest`, middleware, middlewares, controllers.admin.digest.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/email', middleware, middlewares, controllers.admin.settings.email); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/email`, middleware, middlewares, controllers.admin.settings.email); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/user', middleware, middlewares, controllers.admin.settings.user); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/user`, middleware, middlewares, controllers.admin.settings.user); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/post', middleware, middlewares, controllers.admin.settings.post); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/post`, middleware, middlewares, controllers.admin.settings.post); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/languages', middleware, middlewares, controllers.admin.settings.languages); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/languages`, middleware, middlewares, controllers.admin.settings.languages); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/navigation', middleware, middlewares, controllers.admin.settings.navigation); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/navigation`, middleware, middlewares, controllers.admin.settings.navigation); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/homepage', middleware, middlewares, controllers.admin.settings.homepage); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/homepage`, middleware, middlewares, controllers.admin.settings.homepage); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/social', middleware, middlewares, controllers.admin.settings.social); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/social`, middleware, middlewares, controllers.admin.settings.social); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/settings/:term?', middleware, middlewares, controllers.admin.settings.get); | 	helpers.setupAdminPageRoute(app, `/${name}/settings/:term?`, middleware, middlewares, controllers.admin.settings.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/appearance/:term?', middleware, middlewares, controllers.admin.appearance.get); | 	helpers.setupAdminPageRoute(app, `/${name}/appearance/:term?`, middleware, middlewares, controllers.admin.appearance.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/extend/plugins', middleware, middlewares, controllers.admin.plugins.get); | 	helpers.setupAdminPageRoute(app, `/${name}/extend/plugins`, middleware, middlewares, controllers.admin.plugins.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/extend/widgets', middleware, middlewares, controllers.admin.extend.widgets.get); | 	helpers.setupAdminPageRoute(app, `/${name}/extend/widgets`, middleware, middlewares, controllers.admin.extend.widgets.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/extend/rewards', middleware, middlewares, controllers.admin.extend.rewards.get); | 	helpers.setupAdminPageRoute(app, `/${name}/extend/rewards`, middleware, middlewares, controllers.admin.extend.rewards.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/advanced/database', middleware, middlewares, controllers.admin.database.get); | 	helpers.setupAdminPageRoute(app, `/${name}/advanced/database`, middleware, middlewares, controllers.admin.database.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/advanced/events', middleware, middlewares, controllers.admin.events.get); | 	helpers.setupAdminPageRoute(app, `/${name}/advanced/events`, middleware, middlewares, controllers.admin.events.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/advanced/hooks', middleware, middlewares, controllers.admin.hooks.get); | 	helpers.setupAdminPageRoute(app, `/${name}/advanced/hooks`, middleware, middlewares, controllers.admin.hooks.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/advanced/logs', middleware, middlewares, controllers.admin.logs.get); | 	helpers.setupAdminPageRoute(app, `/${name}/advanced/logs`, middleware, middlewares, controllers.admin.logs.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/advanced/errors', middleware, middlewares, controllers.admin.errors.get); | 	helpers.setupAdminPageRoute(app, `/${name}/advanced/errors`, middleware, middlewares, controllers.admin.errors.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/advanced/errors/export', middleware, middlewares, controllers.admin.errors.export); | 	helpers.setupAdminPageRoute(app, `/${name}/advanced/errors/export`, middleware, middlewares, controllers.admin.errors.export); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/advanced/cache', middleware, middlewares, controllers.admin.cache.get); | 	helpers.setupAdminPageRoute(app, `/${name}/advanced/cache`, middleware, middlewares, controllers.admin.cache.get); | ||||||
|  |  | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/development/logger', middleware, middlewares, controllers.admin.logger.get); | 	helpers.setupAdminPageRoute(app, `/${name}/development/logger`, middleware, middlewares, controllers.admin.logger.get); | ||||||
| 	helpers.setupAdminPageRoute(app, '/admin/development/info', middleware, middlewares, controllers.admin.info.get); | 	helpers.setupAdminPageRoute(app, `/${name}/development/info`, middleware, middlewares, controllers.admin.info.get); | ||||||
|  |  | ||||||
| 	apiRoutes(app, middleware, controllers); | 	apiRoutes(app, name, middleware, controllers); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| function apiRoutes(router, middleware, controllers) { | function apiRoutes(router, name, middleware, controllers) { | ||||||
| 	router.get('/api/admin/users/csv', middleware.authenticate, helpers.tryRoute(controllers.admin.users.getCSV)); | 	router.get(`/api/${name}/users/csv`, middleware.authenticate, helpers.tryRoute(controllers.admin.users.getCSV)); | ||||||
| 	router.get('/api/admin/groups/:groupname/csv', middleware.authenticate, helpers.tryRoute(controllers.admin.groups.getCSV)); | 	router.get(`/api/${name}/groups/:groupname/csv`, middleware.authenticate, helpers.tryRoute(controllers.admin.groups.getCSV)); | ||||||
| 	router.get('/api/admin/analytics', middleware.authenticate, helpers.tryRoute(controllers.admin.dashboard.getAnalytics)); | 	router.get(`/api/${name}/analytics`, middleware.authenticate, helpers.tryRoute(controllers.admin.dashboard.getAnalytics)); | ||||||
| 	router.get('/api/admin/advanced/cache/dump', middleware.authenticate, helpers.tryRoute(controllers.admin.cache.dump)); | 	router.get(`/api/${name}/advanced/cache/dump`, middleware.authenticate, helpers.tryRoute(controllers.admin.cache.dump)); | ||||||
|  |  | ||||||
| 	const multipart = require('connect-multiparty'); | 	const multipart = require('connect-multiparty'); | ||||||
| 	const multipartMiddleware = multipart(); | 	const multipartMiddleware = multipart(); | ||||||
|  |  | ||||||
| 	const middlewares = [multipartMiddleware, middleware.validateFiles, middleware.applyCSRF, middleware.authenticate]; | 	const middlewares = [multipartMiddleware, middleware.validateFiles, middleware.applyCSRF, middleware.authenticate]; | ||||||
|  |  | ||||||
| 	router.post('/api/admin/category/uploadpicture', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadCategoryPicture)); | 	router.post(`/api/${name}/category/uploadpicture`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadCategoryPicture)); | ||||||
| 	router.post('/api/admin/uploadfavicon', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadFavicon)); | 	router.post(`/api/${name}/uploadfavicon`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadFavicon)); | ||||||
| 	router.post('/api/admin/uploadTouchIcon', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadTouchIcon)); | 	router.post(`/api/${name}/uploadTouchIcon`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadTouchIcon)); | ||||||
| 	router.post('/api/admin/uploadMaskableIcon', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadMaskableIcon)); | 	router.post(`/api/${name}/uploadMaskableIcon`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadMaskableIcon)); | ||||||
| 	router.post('/api/admin/uploadlogo', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadLogo)); | 	router.post(`/api/${name}/uploadlogo`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadLogo)); | ||||||
| 	router.post('/api/admin/uploadOgImage', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadOgImage)); | 	router.post(`/api/${name}/uploadOgImage`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadOgImage)); | ||||||
| 	router.post('/api/admin/upload/file', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadFile)); | 	router.post(`/api/${name}/upload/file`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadFile)); | ||||||
| 	router.post('/api/admin/uploadDefaultAvatar', middlewares, helpers.tryRoute(controllers.admin.uploads.uploadDefaultAvatar)); | 	router.post(`/api/${name}/uploadDefaultAvatar`, middlewares, helpers.tryRoute(controllers.admin.uploads.uploadDefaultAvatar)); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -59,10 +59,10 @@ _mounts.topic = (app, mount, middleware, controllers) => { | |||||||
| 	setupPageRoute(app, `/${mount}/:topic_id/:slug?`, middleware, [], controllers.topics.get); | 	setupPageRoute(app, `/${mount}/:topic_id/:slug?`, middleware, [], controllers.topics.get); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| _mounts.post = (app, middleware, controllers) => { | _mounts.post = (app, mount, middleware, controllers) => { | ||||||
| 	const middlewares = [middleware.maintenanceMode, middleware.registrationComplete, middleware.pluginHooks]; | 	const middlewares = [middleware.maintenanceMode, middleware.registrationComplete, middleware.pluginHooks]; | ||||||
| 	app.get('/post/:pid', middleware.busyCheck, middlewares, controllers.posts.redirectToPost); | 	app.get(`/${mount}/:pid`, middleware.busyCheck, middlewares, controllers.posts.redirectToPost); | ||||||
| 	app.get('/api/post/:pid', middlewares, controllers.posts.redirectToPost); | 	app.get(`/api/${mount}/:pid`, middlewares, controllers.posts.redirectToPost); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| _mounts.tag = (app, middleware, controllers) => { | _mounts.tag = (app, middleware, controllers) => { | ||||||
| @@ -123,14 +123,11 @@ module.exports = async function (app, middleware) { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| async function addCoreRoutes(app, router, middleware) { | async function addCoreRoutes(app, router, middleware) { | ||||||
| 	_mounts.admin(router, middleware, controllers); |  | ||||||
| 	_mounts.meta(router, middleware, controllers); | 	_mounts.meta(router, middleware, controllers); | ||||||
| 	_mounts.api(router, middleware, controllers); | 	_mounts.api(router, middleware, controllers); | ||||||
| 	_mounts.feed(router, middleware, controllers); | 	_mounts.feed(router, middleware, controllers); | ||||||
|  |  | ||||||
| 	_mounts.main(router, middleware, controllers); | 	_mounts.main(router, middleware, controllers); | ||||||
| 	// _mounts.topic(router, middleware, controllers); |  | ||||||
| 	_mounts.post(router, middleware, controllers); |  | ||||||
| 	_mounts.mod(router, middleware, controllers); | 	_mounts.mod(router, middleware, controllers); | ||||||
| 	_mounts.globalMod(router, middleware, controllers); | 	_mounts.globalMod(router, middleware, controllers); | ||||||
| 	_mounts.tag(router, middleware, controllers); | 	_mounts.tag(router, middleware, controllers); | ||||||
| @@ -140,16 +137,18 @@ async function addCoreRoutes(app, router, middleware) { | |||||||
| 	_mounts.group(router, middleware, controllers); | 	_mounts.group(router, middleware, controllers); | ||||||
|  |  | ||||||
| 	// Allow plugins/themes to mount some routes elsewhere | 	// Allow plugins/themes to mount some routes elsewhere | ||||||
| 	const remountable = ['topic']; | 	const remountable = ['admin', 'topic', 'post']; | ||||||
| 	await Promise.all(remountable.map(async (mount) => { | 	await Promise.all(remountable.map(async (mount) => { | ||||||
| 		const original = mount; | 		const original = mount; | ||||||
| 		({ mount } = await plugins.hooks.fire('filter:router.add', { mount })); | 		({ mount } = await plugins.hooks.fire('filter:router.add', { mount })); | ||||||
| 		if (mount === null) {	// do not mount at all | 		if (mount === null) {	// do not mount at all | ||||||
|  | 			winston.warn(`[router] Not mounting /${original}`); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (mount !== original) { | 		if (mount !== original) { | ||||||
| 			// Set up redirect for fallback handling (some js/tpls may still refer to the traditional mount point) | 			// Set up redirect for fallback handling (some js/tpls may still refer to the traditional mount point) | ||||||
|  | 			winston.info(`[router] /${original} prefix re-mounted to /${mount}. Requests to /${original}/* will now redirect to /${mount}`); | ||||||
| 			router.use(new RegExp(`/(api/)?${original}`), (req, res) => { | 			router.use(new RegExp(`/(api/)?${original}`), (req, res) => { | ||||||
| 				controllerHelpers.redirect(res, `${nconf.get('relative_path')}/${mount}${req.path}`); | 				controllerHelpers.redirect(res, `${nconf.get('relative_path')}/${mount}${req.path}`); | ||||||
| 			}); | 			}); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user