Regression: Add isLastOwner property on teams.listRoomsOfUser endpoint (#21323)

Co-authored-by: Diego Sampaio <chinello@gmail.com>
pull/21395/head^2
Kevin Aleman 5 years ago committed by GitHub
parent cb4ae70b17
commit a544743dcc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      app/lib/server/functions/getRoomsWithSingleOwner.js
  2. 31
      app/lib/server/lib/getRoomRoles.js
  3. 29
      app/lib/server/methods/getRoomRoles.js
  4. 9
      app/models/server/models/Subscriptions.js
  5. 13
      server/services/team/service.ts

@ -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);

@ -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;
});
}

@ -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);
},
});

@ -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,

@ -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,
};
}

Loading…
Cancel
Save