diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js index 934bf4e40d..944fdef6ec 100644 --- a/src/messaging/rooms.js +++ b/src/messaging/rooms.js @@ -105,11 +105,15 @@ module.exports = function (Messaging) { await Promise.all([ db.setObject(`chat:room:${roomId}`, room), db.sortedSetAdd('chat:rooms', now, roomId), - db.sortedSetAdd(`chat:room:${roomId}:owners`, now, uid), - db.sortedSetsAdd([ - `chat:room:${roomId}:uids`, - `chat:room:${roomId}:uids:online`, - ], now, uid), + db.sortedSetAddBulk([ + [`chat:room:${roomId}:uids`, now, uid], + [`chat:room:${roomId}:uids:online`, now, uid], + ...( + isPublic ? + [`chat:room:${roomId}:owners`, now, uid] : + [uid].concat(data.uids).map(uid => ([`chat:room:${roomId}:owners`, now, uid])) + ), + ]), ]); await Promise.all([ diff --git a/test/messaging.js b/test/messaging.js index fbde5d72f6..88d3e82033 100644 --- a/test/messaging.js +++ b/test/messaging.js @@ -15,7 +15,6 @@ const Messaging = require('../src/messaging'); const api = require('../src/api'); const helpers = require('./helpers'); const request = require('../src/request'); -const utils = require('../src/utils'); const translator = require('../src/translator'); describe('Messaging Library', () => { @@ -47,18 +46,10 @@ describe('Messaging Library', () => { }; before(async () => { - // Create 3 users: 1 admin, 2 regular - ({ - foo: mocks.users.foo.uid, - bar: mocks.users.bar.uid, - baz: mocks.users.baz.uid, - herp: mocks.users.herp.uid, - } = await utils.promiseParallel({ - foo: User.create({ username: 'foo', password: 'barbar' }), // admin - bar: User.create({ username: 'bar', password: 'bazbaz' }), // admin - baz: User.create({ username: 'baz', password: 'quuxquux' }), // restricted user - herp: User.create({ username: 'herp', password: 'derpderp' }), // a regular user - })); + mocks.users.foo.uid = await User.create({ username: 'foo', password: 'barbar' }); // admin + mocks.users.bar.uid = await User.create({ username: 'bar', password: 'bazbaz' }); // admin + mocks.users.baz.uid = await User.create({ username: 'baz', password: 'quuxquux' }); // restricted user + mocks.users.herp.uid = await User.create({ username: 'herp', password: 'derpderp' }); // a regular user await Groups.join('administrators', mocks.users.foo.uid); await User.setSetting(mocks.users.baz.uid, 'disableIncomingChats', '1'); @@ -295,6 +286,16 @@ describe('Messaging Library', () => { assert.strictEqual(message.content, 'user-join'); }); + it('should make both users owners on room creation', async () => { + const { body } = await callv3API('post', '/chats', { + uids: [mocks.users.foo.uid], + }, 'herp'); + const { roomId } = body.response; + assert.deepStrictEqual( + await Messaging.isRoomOwner([mocks.users.herp.uid, mocks.users.foo.uid], roomId), [true, true] + ); + }); + it('should change owner when owner leaves room', async () => { const { body } = await callv3API('post', '/chats', { uids: [mocks.users.foo.uid], @@ -804,7 +805,7 @@ describe('Messaging Library', () => { assert.equal(response.statusCode, 200); assert(Array.isArray(body.rooms)); - assert.equal(body.rooms.length, 2); + assert.equal(body.rooms.length, 3); assert.equal(body.title, '[[pages:chats]]'); });