feat: #7743 groups/cover,create,data

v1.18.x
Baris Usakli 6 years ago
parent 382a9c4187
commit 5e8614e15b

@ -1,80 +1,60 @@
'use strict'; 'use strict';
var async = require('async'); const path = require('path');
var path = require('path');
var db = require('../database'); const db = require('../database');
var image = require('../image'); const image = require('../image');
var file = require('../file'); const file = require('../file');
module.exports = function (Groups) { module.exports = function (Groups) {
Groups.updateCoverPosition = function (groupName, position, callback) { Groups.updateCoverPosition = async function (groupName, position) {
if (!groupName) { if (!groupName) {
return callback(new Error('[[error:invalid-data]]')); throw new Error('[[error:invalid-data]]');
} }
Groups.setGroupField(groupName, 'cover:position', position, callback); await Groups.setGroupField(groupName, 'cover:position', position);
}; };
Groups.updateCover = function (uid, data, callback) { Groups.updateCover = async function (uid, data) {
// Position only? That's fine let tempPath = data.file ? data.file : '';
if (!data.imageData && !data.file && data.position) { try {
return Groups.updateCoverPosition(data.groupName, data.position, callback); // Position only? That's fine
} if (!data.imageData && !data.file && data.position) {
return await Groups.updateCoverPosition(data.groupName, data.position);
var tempPath = data.file ? data.file : ''; }
var url; if (!tempPath) {
tempPath = await image.writeImageDataToTempFile(data.imageData);
async.waterfall([ }
function (next) { const filename = 'groupCover-' + data.groupName + path.extname(tempPath);
if (tempPath) { const uploadData = await image.uploadImage(filename, 'files', {
return next(null, tempPath); path: tempPath,
} uid: uid,
image.writeImageDataToTempFile(data.imageData, next); name: 'groupCover',
}, });
function (_tempPath, next) { const url = uploadData.url;
tempPath = _tempPath; await Groups.setGroupField(data.groupName, 'cover:url', url);
const filename = 'groupCover-' + data.groupName + path.extname(tempPath); await image.resizeImage({
image.uploadImage(filename, 'files', { path: tempPath,
path: tempPath, width: 358,
uid: uid, });
name: 'groupCover', const thumbUploadData = await image.uploadImage('groupCoverThumb-' + data.groupName + path.extname(tempPath), 'files', {
}, next); path: tempPath,
}, uid: uid,
function (uploadData, next) { name: 'groupCover',
url = uploadData.url; });
Groups.setGroupField(data.groupName, 'cover:url', url, next); await Groups.setGroupField(data.groupName, 'cover:thumb:url', thumbUploadData.url);
},
function (next) { if (data.position) {
image.resizeImage({ await Groups.updateCoverPosition(data.groupName, data.position);
path: tempPath, }
width: 358,
}, next); return { url: url };
}, } finally {
function (next) {
image.uploadImage('groupCoverThumb-' + data.groupName + path.extname(tempPath), 'files', {
path: tempPath,
uid: uid,
name: 'groupCover',
}, next);
},
function (uploadData, next) {
Groups.setGroupField(data.groupName, 'cover:thumb:url', uploadData.url, next);
},
function (next) {
if (data.position) {
Groups.updateCoverPosition(data.groupName, data.position, next);
} else {
next(null);
}
},
], function (err) {
file.delete(tempPath); file.delete(tempPath);
callback(err, { url: url }); }
});
}; };
Groups.removeCover = function (data, callback) { Groups.removeCover = async function (data) {
db.deleteObjectFields('group:' + data.groupName, ['cover:url', 'cover:thumb:url', 'cover:position'], callback); await db.deleteObjectFields('group:' + data.groupName, ['cover:url', 'cover:thumb:url', 'cover:position']);
}; };
}; };

@ -1,79 +1,67 @@
'use strict'; 'use strict';
var async = require('async'); const meta = require('../meta');
var meta = require('../meta'); const plugins = require('../plugins');
var plugins = require('../plugins'); const utils = require('../utils');
var utils = require('../utils'); const db = require('../database');
var db = require('../database');
module.exports = function (Groups) { module.exports = function (Groups) {
Groups.create = function (data, callback) { Groups.create = async function (data) {
var isSystem = isSystemGroup(data); const isSystem = isSystemGroup(data);
var groupData; const timestamp = data.timestamp || Date.now();
var timestamp = data.timestamp || Date.now(); let disableJoinRequests = parseInt(data.disableJoinRequests, 10) === 1 ? 1 : 0;
var disableJoinRequests = parseInt(data.disableJoinRequests, 10) === 1 ? 1 : 0;
if (data.name === 'administrators') { if (data.name === 'administrators') {
disableJoinRequests = 1; disableJoinRequests = 1;
} }
var isHidden = parseInt(data.hidden, 10) === 1; const isHidden = parseInt(data.hidden, 10) === 1;
async.waterfall([
function (next) { validateGroupName(data.name);
validateGroupName(data.name, next);
}, const exists = await meta.userOrGroupExists(data.name);
function (next) { if (exists) {
meta.userOrGroupExists(data.name, next); throw new Error('[[error:group-already-exists]]');
}, }
function (exists, next) {
if (exists) { const memberCount = data.hasOwnProperty('ownerUid') ? 1 : 0;
return next(new Error('[[error:group-already-exists]]')); const isPrivate = data.hasOwnProperty('private') ? parseInt(data.private, 10) : 1;
} const groupData = {
name: data.name,
var memberCount = data.hasOwnProperty('ownerUid') ? 1 : 0; slug: utils.slugify(data.name),
var isPrivate = data.hasOwnProperty('private') ? parseInt(data.private, 10) : 1; createtime: timestamp,
var slug = utils.slugify(data.name); userTitle: data.userTitle || data.name,
groupData = { userTitleEnabled: parseInt(data.userTitleEnabled, 10) === 1 ? 1 : 0,
name: data.name, description: data.description || '',
slug: slug, memberCount: memberCount,
createtime: timestamp, hidden: isHidden ? 1 : 0,
userTitle: data.userTitle || data.name, system: isSystem ? 1 : 0,
userTitleEnabled: parseInt(data.userTitleEnabled, 10) === 1 ? 1 : 0, private: isPrivate,
description: data.description || '', disableJoinRequests: disableJoinRequests,
memberCount: memberCount, };
hidden: isHidden ? 1 : 0,
system: isSystem ? 1 : 0, plugins.fireHook('filter:group.create', { group: groupData, data: data });
private: isPrivate,
disableJoinRequests: disableJoinRequests, await db.sortedSetAdd('groups:createtime', groupData.createtime, groupData.name);
}; await db.setObject('group:' + groupData.name, groupData);
plugins.fireHook('filter:group.create', { group: groupData, data: data }, next);
}, if (data.hasOwnProperty('ownerUid')) {
function (results, next) { await db.setAdd('group:' + groupData.name + ':owners', data.ownerUid);
var tasks = [ await db.sortedSetAdd('group:' + groupData.name + ':members', timestamp, data.ownerUid);
async.apply(db.sortedSetAdd, 'groups:createtime', groupData.createtime, groupData.name),
async.apply(db.setObject, 'group:' + groupData.name, groupData), groupData.ownerUid = data.ownerUid;
]; }
if (data.hasOwnProperty('ownerUid')) { if (!isHidden && !isSystem) {
tasks.push(async.apply(db.setAdd, 'group:' + groupData.name + ':owners', data.ownerUid)); await db.sortedSetAddBulk([
tasks.push(async.apply(db.sortedSetAdd, 'group:' + groupData.name + ':members', timestamp, data.ownerUid)); ['groups:visible:createtime', timestamp, groupData.name],
['groups:visible:memberCount', groupData.memberCount, groupData.name],
groupData.ownerUid = data.ownerUid; ['groups:visible:name', 0, groupData.name.toLowerCase() + ':' + groupData.name],
} ]);
}
if (!isHidden && !isSystem) {
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:createtime', timestamp, groupData.name)); await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name);
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:memberCount', groupData.memberCount, groupData.name));
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:name', 0, groupData.name.toLowerCase() + ':' + groupData.name)); plugins.fireHook('action:group.create', { group: groupData });
} return groupData;
tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', groupData.slug, groupData.name));
async.series(tasks, next);
},
function (results, next) {
plugins.fireHook('action:group.create', { group: groupData });
next(null, groupData);
},
], callback);
}; };
function isSystemGroup(data) { function isSystemGroup(data) {
@ -82,23 +70,21 @@ module.exports = function (Groups) {
Groups.isPrivilegeGroup(data.name); Groups.isPrivilegeGroup(data.name);
} }
function validateGroupName(name, callback) { function validateGroupName(name) {
if (!name) { if (!name) {
return callback(new Error('[[error:group-name-too-short]]')); throw new Error('[[error:group-name-too-short]]');
} }
if (!Groups.isPrivilegeGroup(name) && name.length > meta.config.maximumGroupNameLength) { if (!Groups.isPrivilegeGroup(name) && name.length > meta.config.maximumGroupNameLength) {
return callback(new Error('[[error:group-name-too-long]]')); throw new Error('[[error:group-name-too-long]]');
} }
if (name === 'guests' || (!Groups.isPrivilegeGroup(name) && name.includes(':'))) { if (name === 'guests' || (!Groups.isPrivilegeGroup(name) && name.includes(':'))) {
return callback(new Error('[[error:invalid-group-name]]')); throw new Error('[[error:invalid-group-name]]');
} }
if (name.includes('/') || !utils.slugify(name)) { if (name.includes('/') || !utils.slugify(name)) {
return callback(new Error('[[error:invalid-group-name]]')); throw new Error('[[error:invalid-group-name]]');
} }
callback();
} }
}; };

@ -1,12 +1,11 @@
'use strict'; 'use strict';
var async = require('async'); const validator = require('validator');
var validator = require('validator'); const nconf = require('nconf');
var nconf = require('nconf');
var db = require('../database'); const db = require('../database');
var plugins = require('../plugins'); const plugins = require('../plugins');
var utils = require('../utils'); const utils = require('../utils');
const intFields = [ const intFields = [
'createtime', 'memberCount', 'hidden', 'system', 'private', 'createtime', 'memberCount', 'hidden', 'system', 'private',
@ -14,70 +13,54 @@ const intFields = [
]; ];
module.exports = function (Groups) { module.exports = function (Groups) {
Groups.getGroupsFields = function (groupNames, fields, callback) { Groups.getGroupsFields = async function (groupNames, fields) {
if (!Array.isArray(groupNames) || !groupNames.length) { if (!Array.isArray(groupNames) || !groupNames.length) {
return callback(null, []); return [];
} }
var ephemeralIdx = groupNames.reduce(function (memo, cur, idx) { const ephemeralIdx = groupNames.reduce(function (memo, cur, idx) {
if (Groups.ephemeralGroups.includes(cur)) { if (Groups.ephemeralGroups.includes(cur)) {
memo.push(idx); memo.push(idx);
} }
return memo; return memo;
}, []); }, []);
async.waterfall([ let groupData;
function (next) { const keys = groupNames.map(groupName => 'group:' + groupName);
const keys = groupNames.map(groupName => 'group:' + groupName); if (fields.length) {
if (fields.length) { groupData = await db.getObjectsFields(keys, fields);
db.getObjectsFields(keys, fields, next); } else {
} else { groupData = await db.getObjects(keys);
db.getObjects(keys, next); }
} if (ephemeralIdx.length) {
}, ephemeralIdx.forEach(function (idx) {
function (groupData, next) { groupData[idx] = Groups.getEphemeralGroup(groupNames[idx]);
if (ephemeralIdx.length) { });
ephemeralIdx.forEach(function (idx) { }
groupData[idx] = Groups.getEphemeralGroup(groupNames[idx]);
}); groupData.forEach(group => modifyGroup(group, fields));
}
const results = await plugins.fireHook('filter:groups.get', { groups: groupData });
groupData.forEach(group => modifyGroup(group, fields)); return results.groups;
plugins.fireHook('filter:groups.get', { groups: groupData }, next);
},
function (results, next) {
next(null, results.groups);
},
], callback);
}; };
Groups.getGroupsData = function (groupNames, callback) { Groups.getGroupsData = async function (groupNames) {
Groups.getGroupsFields(groupNames, [], callback); return await Groups.getGroupsFields(groupNames, []);
}; };
Groups.getGroupData = function (groupName, callback) { Groups.getGroupData = async function (groupName) {
Groups.getGroupsData([groupName], function (err, groupsData) { const groupsData = await Groups.getGroupsData([groupName]);
callback(err, Array.isArray(groupsData) && groupsData[0] ? groupsData[0] : null); return Array.isArray(groupsData) && groupsData[0] ? groupsData[0] : null;
});
}; };
Groups.getGroupFields = function (groupName, fields, callback) { Groups.getGroupFields = async function (groupName, fields) {
Groups.getGroupsFields([groupName], fields, function (err, groups) { const groups = await Groups.getGroupsFields([groupName], fields);
callback(err, groups ? groups[0] : null); return groups ? groups[0] : null;
});
}; };
Groups.setGroupField = function (groupName, field, value, callback) { Groups.setGroupField = async function (groupName, field, value) {
async.waterfall([ await db.setObjectField('group:' + groupName, field, value);
function (next) { plugins.fireHook('action:group.set', { field: field, value: value, type: 'set' });
db.setObjectField('group:' + groupName, field, value, next);
},
function (next) {
plugins.fireHook('action:group.set', { field: field, value: value, type: 'set' });
next();
},
], callback);
}; };
}; };

Loading…
Cancel
Save