mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 02:55:58 +01:00 
			
		
		
		
	feat: async/await controllers/admin/dashboard
This commit is contained in:
		| @@ -54,3 +54,5 @@ function getLatestVersion(callback) { | ||||
|  | ||||
| exports.getLatestVersion = getLatestVersion; | ||||
| exports.isPrerelease = isPrerelease; | ||||
|  | ||||
| require('../promisify')(exports); | ||||
|   | ||||
| @@ -1,28 +1,44 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var async = require('async'); | ||||
| var nconf = require('nconf'); | ||||
| var semver = require('semver'); | ||||
| var winston = require('winston'); | ||||
| const nconf = require('nconf'); | ||||
| const semver = require('semver'); | ||||
| const winston = require('winston'); | ||||
| const _ = require('lodash'); | ||||
|  | ||||
| var versions = require('../../admin/versions'); | ||||
| var db = require('../../database'); | ||||
| var meta = require('../../meta'); | ||||
| const versions = require('../../admin/versions'); | ||||
| const db = require('../../database'); | ||||
| const meta = require('../../meta'); | ||||
| const analytics = require('../../analytics').async; | ||||
| var plugins = require('../../plugins'); | ||||
| var user = require('../../user'); | ||||
| var utils = require('../../utils'); | ||||
| const plugins = require('../../plugins'); | ||||
| const user = require('../../user'); | ||||
| const utils = require('../../utils'); | ||||
|  | ||||
| var dashboardController = module.exports; | ||||
| const dashboardController = module.exports; | ||||
|  | ||||
| dashboardController.get = function (req, res, next) { | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			async.parallel({ | ||||
| 				stats: getStats, | ||||
| 				notices: function (next) { | ||||
| 					var notices = [ | ||||
| dashboardController.get = async function (req, res) { | ||||
| 	const [stats, notices, latestVersion, lastrestart] = await Promise.all([ | ||||
| 		getStats(), | ||||
| 		getNotices(), | ||||
| 		getLatestVersion(), | ||||
| 		getLastRestart(), | ||||
| 	]); | ||||
| 	const version = nconf.get('version'); | ||||
|  | ||||
| 	res.render('admin/general/dashboard', { | ||||
| 		version: version, | ||||
| 		lookupFailed: latestVersion === null, | ||||
| 		latestVersion: latestVersion, | ||||
| 		upgradeAvailable: latestVersion && semver.gt(latestVersion, version), | ||||
| 		currentPrerelease: versions.isPrerelease.test(version), | ||||
| 		notices: notices, | ||||
| 		stats: stats, | ||||
| 		canRestart: !!process.send, | ||||
| 		lastrestart: lastrestart, | ||||
| 	}); | ||||
| }; | ||||
|  | ||||
| async function getNotices() { | ||||
| 	const notices = [ | ||||
| 		{ | ||||
| 			done: !meta.reloadRequired, | ||||
| 			doneText: '[[admin/general/dashboard:restart-not-required]]', | ||||
| @@ -44,39 +60,18 @@ dashboardController.get = function (req, res, next) { | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 					plugins.fireHook('filter:admin.notices', notices, next); | ||||
| 				}, | ||||
| 				latestVersion: function (next) { | ||||
| 					versions.getLatestVersion(function (err, result) { | ||||
| 						if (err) { | ||||
| 	return await plugins.fireHook('filter:admin.notices', notices); | ||||
| } | ||||
|  | ||||
| async function getLatestVersion() { | ||||
| 	try { | ||||
| 		const result = await versions.getLatestVersion(); | ||||
| 		return result; | ||||
| 	} catch (err) { | ||||
| 		winston.error('[acp] Failed to fetch latest version', err); | ||||
| 	} | ||||
|  | ||||
| 						next(null, err ? null : result); | ||||
| 					}); | ||||
| 				}, | ||||
| 				lastrestart: function (next) { | ||||
| 					getLastRestart(next); | ||||
| 				}, | ||||
| 			}, next); | ||||
| 		}, | ||||
| 		function (results) { | ||||
| 			var version = nconf.get('version'); | ||||
|  | ||||
| 			res.render('admin/general/dashboard', { | ||||
| 				version: version, | ||||
| 				lookupFailed: results.latestVersion === null, | ||||
| 				latestVersion: results.latestVersion, | ||||
| 				upgradeAvailable: results.latestVersion && semver.gt(results.latestVersion, version), | ||||
| 				currentPrerelease: versions.isPrerelease.test(version), | ||||
| 				notices: results.notices, | ||||
| 				stats: results.stats, | ||||
| 				canRestart: !!process.send, | ||||
| 				lastrestart: results.lastrestart, | ||||
| 			}); | ||||
| 		}, | ||||
| 	], next); | ||||
| }; | ||||
| 	return null; | ||||
| } | ||||
|  | ||||
| dashboardController.getAnalytics = async (req, res, next) => { | ||||
| 	// Basic validation | ||||
| @@ -112,82 +107,48 @@ dashboardController.getAnalytics = async (req, res, next) => { | ||||
| 	}); | ||||
| }; | ||||
|  | ||||
| function getStats(callback) { | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			async.parallel([ | ||||
| 				function (next) { | ||||
| 					getStatsForSet('ip:recent', 'uniqueIPCount', next); | ||||
| 				}, | ||||
| 				function (next) { | ||||
| 					getStatsForSet('users:joindate', 'userCount', next); | ||||
| 				}, | ||||
| 				function (next) { | ||||
| 					getStatsForSet('posts:pid', 'postCount', next); | ||||
| 				}, | ||||
| 				function (next) { | ||||
| 					getStatsForSet('topics:tid', 'topicCount', next); | ||||
| 				}, | ||||
| 			], next); | ||||
| 		}, | ||||
| 		function (results, next) { | ||||
| async function getStats() { | ||||
| 	const results = await Promise.all([ | ||||
| 		getStatsForSet('ip:recent', 'uniqueIPCount'), | ||||
| 		getStatsForSet('users:joindate', 'userCount'), | ||||
| 		getStatsForSet('posts:pid', 'postCount'), | ||||
| 		getStatsForSet('topics:tid', 'topicCount'), | ||||
| 	]); | ||||
| 	results[0].name = '[[admin/general/dashboard:unique-visitors]]'; | ||||
| 	results[1].name = '[[admin/general/dashboard:users]]'; | ||||
| 	results[2].name = '[[admin/general/dashboard:posts]]'; | ||||
| 	results[3].name = '[[admin/general/dashboard:topics]]'; | ||||
|  | ||||
| 			next(null, results); | ||||
| 		}, | ||||
| 	], callback); | ||||
| 	return results; | ||||
| } | ||||
|  | ||||
| function getStatsForSet(set, field, callback) { | ||||
| 	var terms = { | ||||
| async function getStatsForSet(set, field) { | ||||
| 	const terms = { | ||||
| 		day: 86400000, | ||||
| 		week: 604800000, | ||||
| 		month: 2592000000, | ||||
| 	}; | ||||
|  | ||||
| 	var now = Date.now(); | ||||
| 	async.parallel({ | ||||
| 		day: function (next) { | ||||
| 			db.sortedSetCount(set, now - terms.day, '+inf', next); | ||||
| 		}, | ||||
| 		week: function (next) { | ||||
| 			db.sortedSetCount(set, now - terms.week, '+inf', next); | ||||
| 		}, | ||||
| 		month: function (next) { | ||||
| 			db.sortedSetCount(set, now - terms.month, '+inf', next); | ||||
| 		}, | ||||
| 		alltime: function (next) { | ||||
| 			getGlobalField(field, next); | ||||
| 		}, | ||||
| 	}, callback); | ||||
| } | ||||
|  | ||||
| function getGlobalField(field, callback) { | ||||
| 	db.getObjectField('global', field, function (err, count) { | ||||
| 		callback(err, parseInt(count, 10) || 0); | ||||
| 	const now = Date.now(); | ||||
| 	return await utils.promiseParallel({ | ||||
| 		day: db.sortedSetCount(set, now - terms.day, '+inf'), | ||||
| 		week: db.sortedSetCount(set, now - terms.week, '+inf'), | ||||
| 		month: db.sortedSetCount(set, now - terms.month, '+inf'), | ||||
| 		alltime: getGlobalField(field), | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| function getLastRestart(callback) { | ||||
| 	var lastrestart; | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			db.getObject('lastrestart', next); | ||||
| 		}, | ||||
| 		function (_lastrestart, next) { | ||||
| 			lastrestart = _lastrestart; | ||||
| async function getGlobalField(field) { | ||||
| 	const count = await db.getObjectField('global', field); | ||||
| 	return parseInt(count, 10) || 0; | ||||
| } | ||||
|  | ||||
| async function getLastRestart() { | ||||
| 	const lastrestart = await db.getObject('lastrestart'); | ||||
| 	if (!lastrestart) { | ||||
| 				return callback(); | ||||
| 		return null; | ||||
| 	} | ||||
| 			user.getUserData(lastrestart.uid, next); | ||||
| 		}, | ||||
| 		function (userData, next) { | ||||
| 	const userData = await user.getUserData(lastrestart.uid); | ||||
| 	lastrestart.user = userData; | ||||
| 	lastrestart.timestampISO = utils.toISOString(lastrestart.timestamp); | ||||
| 			next(null, lastrestart); | ||||
| 		}, | ||||
| 	], callback); | ||||
| 	return lastrestart; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user