mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	refactor: globalmods/groups
This commit is contained in:
		| @@ -1,38 +1,24 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var async = require('async'); | ||||
| const user = require('../user'); | ||||
| const adminBlacklistController = require('./admin/blacklist'); | ||||
| const usersController = require('./admin/users'); | ||||
|  | ||||
| var user = require('../user'); | ||||
| var adminBlacklistController = require('./admin/blacklist'); | ||||
| var usersController = require('./admin/users'); | ||||
| const globalModsController = module.exports; | ||||
|  | ||||
| var globalModsController = module.exports; | ||||
|  | ||||
| globalModsController.ipBlacklist = function (req, res, next) { | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			user.isAdminOrGlobalMod(req.uid, next); | ||||
| 		}, | ||||
| 		function (isAdminOrGlobalMod, next) { | ||||
| globalModsController.ipBlacklist = async function (req, res, next) { | ||||
| 	const isAdminOrGlobalMod = await user.isAdminOrGlobalMod(req.uid); | ||||
| 	if (!isAdminOrGlobalMod) { | ||||
| 		return next(); | ||||
| 	} | ||||
| 			adminBlacklistController.get(req, res, next); | ||||
| 		}, | ||||
| 	], next); | ||||
| 	await adminBlacklistController.get(req, res); | ||||
| }; | ||||
|  | ||||
|  | ||||
| globalModsController.registrationQueue = function (req, res, next) { | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			user.isAdminOrGlobalMod(req.uid, next); | ||||
| 		}, | ||||
| 		function (isAdminOrGlobalMod, next) { | ||||
| globalModsController.registrationQueue = async function (req, res, next) { | ||||
| 	const isAdminOrGlobalMod = await user.isAdminOrGlobalMod(req.uid); | ||||
| 	if (!isAdminOrGlobalMod) { | ||||
| 		return next(); | ||||
| 	} | ||||
| 			usersController.registrationQueue(req, res, next); | ||||
| 		}, | ||||
| 	], next); | ||||
| 	await usersController.registrationQueue(req, res); | ||||
| }; | ||||
|   | ||||
| @@ -1,193 +1,142 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var async = require('async'); | ||||
| var validator = require('validator'); | ||||
| const validator = require('validator'); | ||||
|  | ||||
| var meta = require('../meta'); | ||||
| var groups = require('../groups'); | ||||
| var user = require('../user'); | ||||
| var helpers = require('./helpers'); | ||||
| var pagination = require('../pagination'); | ||||
| var privileges = require('../privileges'); | ||||
| const meta = require('../meta'); | ||||
| const groups = require('../groups'); | ||||
| const user = require('../user'); | ||||
| const helpers = require('./helpers'); | ||||
| const pagination = require('../pagination'); | ||||
| const privileges = require('../privileges'); | ||||
|  | ||||
| var groupsController = module.exports; | ||||
| const groupsController = module.exports; | ||||
|  | ||||
| groupsController.list = function (req, res, next) { | ||||
| 	var sort = req.query.sort || 'alpha'; | ||||
| groupsController.list = async function (req, res) { | ||||
| 	const sort = req.query.sort || 'alpha'; | ||||
|  | ||||
| 	groupsController.getGroupsFromSet(req.uid, sort, 0, 14, function (err, data) { | ||||
| 		if (err) { | ||||
| 			return next(err); | ||||
| 		} | ||||
| 	const data = await groupsController.getGroupsFromSet(req.uid, sort, 0, 14); | ||||
| 	data.title = '[[pages:groups]]'; | ||||
| 	data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[pages:groups]]' }]); | ||||
| 	res.render('groups/list', data); | ||||
| 	}); | ||||
| }; | ||||
|  | ||||
| groupsController.getGroupsFromSet = function (uid, sort, start, stop, callback) { | ||||
| 	var set = 'groups:visible:name'; | ||||
| groupsController.getGroupsFromSet = async function (uid, sort, start, stop) { | ||||
| 	let set = 'groups:visible:name'; | ||||
| 	if (sort === 'count') { | ||||
| 		set = 'groups:visible:memberCount'; | ||||
| 	} else if (sort === 'date') { | ||||
| 		set = 'groups:visible:createtime'; | ||||
| 	} | ||||
|  | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			async.parallel({ | ||||
| 				groupsData: async.apply(groups.getGroupsFromSet, set, uid, start, stop), | ||||
| 				allowGroupCreation: async.apply(privileges.global.can, 'group:create', uid), | ||||
| 			}, next); | ||||
| 		}, | ||||
| 		function (results, next) { | ||||
| 			next(null, { | ||||
| 				groups: results.groupsData, | ||||
| 				allowGroupCreation: results.allowGroupCreation, | ||||
| 	const [groupsData, allowGroupCreation] = await Promise.all([ | ||||
| 		groups.getGroupsFromSet(set, uid, start, stop), | ||||
| 		privileges.global.can('group:create', uid), | ||||
| 	]); | ||||
| 	return { | ||||
| 		groups: groupsData, | ||||
| 		allowGroupCreation: allowGroupCreation, | ||||
| 		nextStart: stop + 1, | ||||
| 			}); | ||||
| 		}, | ||||
| 	], callback); | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| groupsController.details = function (req, res, callback) { | ||||
| 	var groupName; | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			groups.getGroupNameByGroupSlug(req.params.slug, next); | ||||
| 		}, | ||||
| 		function (_groupName, next) { | ||||
| 			groupName = _groupName; | ||||
| groupsController.details = async function (req, res, next) { | ||||
| 	const groupName = await groups.getGroupNameByGroupSlug(req.params.slug); | ||||
| 	if (!groupName) { | ||||
| 				return callback(); | ||||
| 			} | ||||
| 			async.parallel({ | ||||
| 				exists: async.apply(groups.exists, groupName), | ||||
| 				hidden: async.apply(groups.isHidden, groupName), | ||||
| 			}, next); | ||||
| 		}, | ||||
| 		function (results, next) { | ||||
| 			if (!results.exists) { | ||||
| 				return callback(); | ||||
| 			} | ||||
| 			if (!results.hidden) { | ||||
| 		return next(); | ||||
| 	} | ||||
| 			async.parallel({ | ||||
| 				isMember: async.apply(groups.isMember, req.uid, groupName), | ||||
| 				isInvited: async.apply(groups.isInvited, req.uid, groupName), | ||||
| 			}, function (err, checks) { | ||||
| 				if (err || checks.isMember || checks.isInvited) { | ||||
| 					return next(err); | ||||
| 	const [exists, isHidden] = await Promise.all([ | ||||
| 		groups.exists(groupName), | ||||
| 		groups.isHidden(groupName), | ||||
| 	]); | ||||
| 	if (!exists) { | ||||
| 		return next(); | ||||
| 	} | ||||
| 				callback(); | ||||
| 			}); | ||||
| 		}, | ||||
| 		function (next) { | ||||
| 			async.parallel({ | ||||
| 				group: function (next) { | ||||
| 	if (isHidden) { | ||||
| 		const [isMember, isInvited] = await Promise.all([ | ||||
| 			groups.isMember(req.uid, groupName), | ||||
| 			groups.isInvited(req.uid, groupName), | ||||
| 		]); | ||||
| 		if (!isMember && !isInvited) { | ||||
| 			return next(); | ||||
| 		} | ||||
| 	} | ||||
| 	const [groupData, posts, isAdmin, isGlobalMod] = await Promise.all([ | ||||
| 		groups.get(groupName, { | ||||
| 			uid: req.uid, | ||||
| 			truncateUserList: true, | ||||
| 			userListCount: 20, | ||||
| 					}, next); | ||||
| 				}, | ||||
| 				posts: function (next) { | ||||
| 					groups.getLatestMemberPosts(groupName, 10, req.uid, next); | ||||
| 				}, | ||||
| 				isAdmin: function (next) { | ||||
| 					user.isAdministrator(req.uid, next); | ||||
| 				}, | ||||
| 				isGlobalMod: function (next) { | ||||
| 					user.isGlobalModerator(req.uid, next); | ||||
| 				}, | ||||
| 			}, next); | ||||
| 		}, | ||||
| 		function (results) { | ||||
| 			if (!results.group) { | ||||
| 				return callback(); | ||||
| 		}), | ||||
| 		groups.getLatestMemberPosts(groupName, 10, req.uid), | ||||
| 		user.isAdministrator(req.uid), | ||||
| 		user.isGlobalModerator(req.uid), | ||||
| 	]); | ||||
| 	if (!groupData) { | ||||
| 		return next(); | ||||
| 	} | ||||
| 			results.group.isOwner = results.group.isOwner || results.isAdmin || (results.isGlobalMod && !results.group.system); | ||||
| 			results.title = '[[pages:group, ' + results.group.displayName + ']]'; | ||||
| 			results.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[pages:groups]]', url: '/groups' }, { text: results.group.displayName }]); | ||||
| 			results.allowPrivateGroups = meta.config.allowPrivateGroups; | ||||
| 	groupData.isOwner = groupData.isOwner || isAdmin || (isGlobalMod && !groupData.system); | ||||
| 	const results = { | ||||
| 		title: '[[pages:group, ' + groupData.displayName + ']]', | ||||
| 		group: groupData, | ||||
| 		posts: posts, | ||||
| 		isAdmin: isAdmin, | ||||
| 		isGlobalMod: isGlobalMod, | ||||
| 		allowPrivateGroups: meta.config.allowPrivateGroups, | ||||
| 		breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[pages:groups]]', url: '/groups' }, { text: groupData.displayName }]), | ||||
| 	}; | ||||
|  | ||||
| 	res.render('groups/details', results); | ||||
| 		}, | ||||
| 	], callback); | ||||
| }; | ||||
|  | ||||
| groupsController.members = function (req, res, callback) { | ||||
| 	var page = parseInt(req.query.page, 10) || 1; | ||||
| 	var usersPerPage = 50; | ||||
| 	var start = Math.max(0, (page - 1) * usersPerPage); | ||||
| 	var stop = start + usersPerPage - 1; | ||||
| 	var groupName; | ||||
| 	var groupData; | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			groups.getGroupNameByGroupSlug(req.params.slug, next); | ||||
| 		}, | ||||
| 		function (_groupName, next) { | ||||
| 			if (!_groupName) { | ||||
| 				return callback(); | ||||
| groupsController.members = async function (req, res, next) { | ||||
| 	const page = parseInt(req.query.page, 10) || 1; | ||||
| 	const usersPerPage = 50; | ||||
| 	const start = Math.max(0, (page - 1) * usersPerPage); | ||||
| 	const stop = start + usersPerPage - 1; | ||||
| 	const groupName = await groups.getGroupNameByGroupSlug(req.params.slug); | ||||
| 	if (!groupName) { | ||||
| 		return next(); | ||||
| 	} | ||||
| 			groupName = _groupName; | ||||
| 			async.parallel({ | ||||
| 				isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, req.uid), | ||||
| 				isMember: async.apply(groups.isMember, req.uid, groupName), | ||||
| 				isHidden: async.apply(groups.isHidden, groupName), | ||||
| 				groupData: async.apply(groups.getGroupData, groupName), | ||||
| 			}, next); | ||||
| 		}, | ||||
| 		function (results, next) { | ||||
| 			if (results.isHidden && !results.isMember && !results.isAdminOrGlobalMod) { | ||||
| 				return callback(); | ||||
| 			} | ||||
| 			groupData = results.groupData; | ||||
| 	const [groupData, isAdminOrGlobalMod, isMember, isHidden] = await Promise.all([ | ||||
| 		groups.getGroupData(groupName), | ||||
| 		user.isAdminOrGlobalMod(req.uid), | ||||
| 		groups.isMember(req.uid, groupName), | ||||
| 		groups.isHidden(groupName), | ||||
| 	]); | ||||
|  | ||||
| 			user.getUsersFromSet('group:' + groupName + ':members', req.uid, start, stop, next); | ||||
| 		}, | ||||
| 		function (users) { | ||||
| 			var breadcrumbs = helpers.buildBreadcrumbs([ | ||||
| 	if (isHidden && !isMember && !isAdminOrGlobalMod) { | ||||
| 		return next(); | ||||
| 	} | ||||
| 	const users = await user.getUsersFromSet('group:' + groupName + ':members', req.uid, start, stop); | ||||
|  | ||||
| 	const breadcrumbs = helpers.buildBreadcrumbs([ | ||||
| 		{ text: '[[pages:groups]]', url: '/groups' }, | ||||
| 		{ text: validator.escape(String(groupName)), url: '/groups/' + req.params.slug }, | ||||
| 		{ text: '[[groups:details.members]]' }, | ||||
| 	]); | ||||
|  | ||||
| 			var pageCount = Math.max(1, Math.ceil(groupData.memberCount / usersPerPage)); | ||||
| 	const pageCount = Math.max(1, Math.ceil(groupData.memberCount / usersPerPage)); | ||||
| 	res.render('groups/members', { | ||||
| 		users: users, | ||||
| 		pagination: pagination.create(page, pageCount, req.query), | ||||
| 		breadcrumbs: breadcrumbs, | ||||
| 	}); | ||||
| 		}, | ||||
| 	], callback); | ||||
| }; | ||||
|  | ||||
| groupsController.uploadCover = function (req, res, next) { | ||||
| groupsController.uploadCover = async function (req, res, next) { | ||||
| 	var params = JSON.parse(req.body.params); | ||||
|  | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			groups.ownership.isOwner(req.uid, params.groupName, next); | ||||
| 		}, | ||||
| 		function (isOwner, next) { | ||||
| 	try { | ||||
| 		const isOwner = await groups.ownership.isOwner(req.uid, params.groupName); | ||||
| 		if (!isOwner) { | ||||
| 				return next(new Error('[[error:no-privileges]]')); | ||||
| 			throw new Error('[[error:no-privileges]]'); | ||||
| 		} | ||||
|  | ||||
| 			groups.updateCover(req.uid, { | ||||
| 		const image = await groups.updateCover(req.uid, { | ||||
| 			file: req.files.files[0].path, | ||||
| 			groupName: params.groupName, | ||||
| 			}, next); | ||||
| 		}, | ||||
| 	], function (err, image) { | ||||
| 		if (err) { | ||||
| 			return next(err); | ||||
| 		} | ||||
| 		res.json([{ url: image.url }]); | ||||
| 		}); | ||||
| 		res.json([{ url: image.url }]); | ||||
| 	} catch (err) { | ||||
| 		next(err); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| require('../promisify')(groupsController); | ||||
| require('../promisify')(groupsController, ['list', 'details', 'members', 'uploadCover']); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user