diff --git a/app/lib/server/functions/getRoomsWithSingleOwner.js b/app/lib/server/functions/getRoomsWithSingleOwner.js index b966de6f958..cc192156d32 100644 --- a/app/lib/server/functions/getRoomsWithSingleOwner.js +++ b/app/lib/server/functions/getRoomsWithSingleOwner.js @@ -6,25 +6,30 @@ export function shouldRemoveOrChangeOwner(subscribedRooms) { .some(({ shouldBeRemoved, shouldChangeOwner }) => shouldBeRemoved || shouldChangeOwner); } -export function getSubscribedRoomsForUserWithDetails(userId) { +export function getSubscribedRoomsForUserWithDetails(userId, assignNewOwner = true, roomIds = []) { const subscribedRooms = []; + const cursor = roomIds.length > 0 + ? Subscriptions.findByUserIdAndRoomIds(userId, roomIds) + : Subscriptions.findByUserIdExceptType(userId, 'd'); + // Iterate through all the rooms the user is subscribed to, to check if he is the last owner of any of them. - Subscriptions.findByUserIdExceptType(userId, 'd').forEach((subscription) => { + cursor.forEach((subscription) => { const roomData = { rid: subscription.rid, t: subscription.t, shouldBeRemoved: false, shouldChangeOwner: false, + userIsLastOwner: false, newOwner: null, }; if (subscriptionHasRole(subscription, 'owner')) { // Fetch the number of owners const numOwners = Subscriptions.findByRoomIdAndRoles(subscription.rid, ['owner']).count(); - // If it's only one, then this user is the only owner. - if (numOwners === 1) { + roomData.userIsLastOwner = numOwners === 1; + if (numOwners === 1 && assignNewOwner) { // Let's check how many subscribers the room has. const options = { fields: { 'u._id': 1 }, sort: { ts: 1 } }; const subscribersCursor = Subscriptions.findByRoomId(subscription.rid, options); diff --git a/app/lib/server/lib/getRoomRoles.js b/app/lib/server/lib/getRoomRoles.js new file mode 100644 index 00000000000..9c371862878 --- /dev/null +++ b/app/lib/server/lib/getRoomRoles.js @@ -0,0 +1,31 @@ +import _ from 'underscore'; + +import { settings } from '../../../settings'; +import { Subscriptions, Users, Roles } from '../../../models'; + +export function getRoomRoles(rid) { + const options = { + sort: { + 'u.username': 1, + }, + fields: { + rid: 1, + u: 1, + roles: 1, + }, + }; + + const UI_Use_Real_Name = settings.get('UI_Use_Real_Name') === true; + + const roles = Roles.find({ scope: 'Subscriptions', description: { $exists: 1, $ne: '' } }).fetch(); + const subscriptions = Subscriptions.findByRoomIdAndRoles(rid, _.pluck(roles, '_id'), options).fetch(); + + if (!UI_Use_Real_Name) { + return subscriptions; + } + return subscriptions.map((subscription) => { + const user = Users.findOneById(subscription.u._id); + subscription.u.name = user && user.name; + return subscription; + }); +} diff --git a/app/lib/server/methods/getRoomRoles.js b/app/lib/server/methods/getRoomRoles.js index 779ae94215f..72de6ef8425 100644 --- a/app/lib/server/methods/getRoomRoles.js +++ b/app/lib/server/methods/getRoomRoles.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import _ from 'underscore'; import { settings } from '../../../settings'; -import { Subscriptions, Users, Roles } from '../../../models'; +import { getRoomRoles } from '../lib/getRoomRoles'; + Meteor.methods({ getRoomRoles(rid) { @@ -15,29 +15,6 @@ Meteor.methods({ check(rid, String); - const options = { - sort: { - 'u.username': 1, - }, - fields: { - rid: 1, - u: 1, - roles: 1, - }, - }; - - const UI_Use_Real_Name = settings.get('UI_Use_Real_Name') === true; - - const roles = Roles.find({ scope: 'Subscriptions', description: { $exists: 1, $ne: '' } }).fetch(); - const subscriptions = Subscriptions.findByRoomIdAndRoles(rid, _.pluck(roles, '_id'), options).fetch(); - - if (!UI_Use_Real_Name) { - return subscriptions; - } - return subscriptions.map((subscription) => { - const user = Users.findOneById(subscription.u._id); - subscription.u.name = user && user.name; - return subscription; - }); + return getRoomRoles(rid); }, }); diff --git a/app/models/server/models/Subscriptions.js b/app/models/server/models/Subscriptions.js index b4094d1acc2..c6e29179c86 100644 --- a/app/models/server/models/Subscriptions.js +++ b/app/models/server/models/Subscriptions.js @@ -439,6 +439,15 @@ export class Subscriptions extends Base { return this.find(query, options); } + findByUserIdAndRoomIds(userId, roomIds, options) { + const query = { + 'u._id': userId, + rid: { $in: roomIds }, + }; + + return this.find(query, options); + } + findByUserIdAndType(userId, type, options) { const query = { 'u._id': userId, diff --git a/server/services/team/service.ts b/server/services/team/service.ts index f3ed2224e2d..393f194dc4d 100644 --- a/server/services/team/service.ts +++ b/server/services/team/service.ts @@ -16,6 +16,7 @@ import { IRoom } from '../../../definition/IRoom'; import { addUserToRoom } from '../../../app/lib/server/functions/addUserToRoom'; import { canAccessRoom } from '../authorization/canAccessRoom'; import { escapeRegExp } from '../../../lib/escapeRegExp'; +import { getSubscribedRoomsForUserWithDetails } from '../../../app/lib/server/functions/getRoomsWithSingleOwner'; import { checkUsernameAvailability } from '../../../app/lib/server/functions'; export class TeamService extends ServiceClass implements ITeamService { @@ -453,9 +454,19 @@ export class TeamService extends ServiceClass implements ITeamService { const subscriptionsCursor = this.SubscriptionsModel.findByUserIdAndRoomIds(userId, teamRoomIds); const subscriptionRoomIds = (await subscriptionsCursor.toArray()).map((subscription) => subscription.rid); const availableRoomsCursor = this.RoomsModel.findManyByRoomIds(subscriptionRoomIds, { skip, limit }); + const rooms = await availableRoomsCursor.toArray(); + const roomData = getSubscribedRoomsForUserWithDetails(userId, false, teamRoomIds); + const records = []; + + for (const room of rooms) { + const roomInfo = roomData.find((data) => data.rid === room._id); + room.isLastOwner = roomInfo.userIsLastOwner; + records.push(room); + } + return { total: await availableRoomsCursor.count(), - records: await availableRoomsCursor.toArray(), + records, }; }