From 9d49ec60a1b94f82664d1204b20c847ace0fd12a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 5 Apr 2023 15:14:41 -0400 Subject: [PATCH] fix: remove socketGroups.issueMassInvite --- public/src/client/groups/details.js | 23 ++++++++++++----------- src/socket.io/groups.js | 21 --------------------- test/groups.js | 21 --------------------- 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 3dc4f79e3f..d6ae4df78c 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -285,21 +285,22 @@ define('forum/groups/details', [ }); }); - $('[component="groups/members/bulk-invite-button"]').on('click', function () { - const usernames = $('[component="groups/members/bulk-invite"]').val(); + $('[component="groups/members/bulk-invite-button"]').on('click', async () => { + let usernames = $('[component="groups/members/bulk-invite"]').val(); if (!usernames) { return false; } - socket.emit('groups.issueMassInvite', { - usernames: usernames, - groupName: ajaxify.data.group.name, - }, function (err) { - if (err) { - return alerts.error(err); - } + + // Filter out bad usernames + usernames = usernames.split(',').map(username => slugify(username)); + usernames = await Promise.all(usernames.map(slug => api.head(`/users/bySlug/${slug}`).then(() => slug).catch(() => false))); + usernames = usernames.filter(Boolean); + + const uids = await Promise.all(usernames.map(slug => api.get(`/users/bySlug/${slug}`).then(({ uid }) => uid))); + + await Promise.all(uids.map(async uid => api.post(`/groups/${ajaxify.data.group.slug}/invites/${uid}`))).then(() => { updateList(); - }); - return false; + }).catch(alerts.error); }); } diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index 00777d5824..1d058c01e5 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -56,27 +56,6 @@ async function isOwner(socket, data) { } } -SocketGroups.issueMassInvite = async (socket, data) => { - await isOwner(socket, data); - if (!data || !data.usernames || !data.groupName) { - throw new Error('[[error:invalid-data]]'); - } - let usernames = String(data.usernames).split(','); - usernames = usernames.map(username => username && username.trim()); - - let uids = await user.getUidsByUsernames(usernames); - uids = uids.filter(uid => !!uid && parseInt(uid, 10)); - - await groups.invite(data.groupName, uids); - - for (const uid of uids) { - logGroupEvent(socket, 'group-invite', { - groupName: data.groupName, - targetUid: uid, - }); - } -}; - SocketGroups.kick = async (socket, data) => { await isOwner(socket, data); if (socket.uid === parseInt(data.uid, 10)) { diff --git a/test/groups.js b/test/groups.js index 632f4f037f..678efd02e2 100644 --- a/test/groups.js +++ b/test/groups.js @@ -932,27 +932,6 @@ describe('Groups', () => { assert(isInvited); }); - it('should fail with invalid data', (done) => { - socketGroups.issueMassInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', usernames: null }, (err) => { - assert.equal(err.message, '[[error:invalid-data]]'); - done(); - }); - }); - - it('should issue mass invite to users', (done) => { - User.create({ username: 'invite2' }, (err, uid) => { - assert.ifError(err); - socketGroups.issueMassInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', usernames: 'invite1, invite2' }, (err) => { - assert.ifError(err); - Groups.isInvited([adminUid, uid], 'PrivateCanJoin', (err, isInvited) => { - assert.ifError(err); - assert.deepStrictEqual(isInvited, [false, true]); - done(); - }); - }); - }); - }); - it('should rescind invite', async () => { const uid = await User.create({ username: 'invite3' }); await apiGroups.issueInvite({ uid: adminUid }, { slug: 'privatecanjoin', uid });