From 1fd356eedfceefe381985661d8459595458659ae Mon Sep 17 00:00:00 2001 From: Pierre Lehnen Date: Mon, 22 Mar 2021 18:51:47 -0300 Subject: [PATCH] [NEW] teams.leave "rooms" argument --- app/api/server/v1/teams.ts | 8 ++++++-- app/models/server/models/Rooms.js | 16 ++++++++++++++++ app/models/server/models/Subscriptions.js | 12 ++++++++++++ app/models/server/models/Users.js | 9 +++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/app/api/server/v1/teams.ts b/app/api/server/v1/teams.ts index a288de13ac460..bd672f38f84d8 100644 --- a/app/api/server/v1/teams.ts +++ b/app/api/server/v1/teams.ts @@ -3,7 +3,7 @@ import { Promise } from 'meteor/promise'; import { API } from '../api'; import { Team } from '../../../../server/sdk'; import { hasAtLeastOnePermission, hasPermission } from '../../../authorization/server'; -import { Rooms } from '../../../models/server'; +import { Rooms, Subscriptions } from '../../../models/server'; API.v1.addRoute('teams.list', { authRequired: true }, { get() { @@ -206,12 +206,16 @@ API.v1.addRoute('teams.removeMembers', { authRequired: true }, { API.v1.addRoute('teams.leave', { authRequired: true }, { post() { - const { teamId, teamName } = this.bodyParams; + const { teamId, teamName, rooms } = this.bodyParams; Promise.await(Team.removeMembers(teamId, teamName, [{ userId: this.userId, }])); + if (rooms?.length) { + Subscriptions.removeByRoomIdsAndUserId(rooms, this.userId); + } + return API.v1.success(); }, }); diff --git a/app/models/server/models/Rooms.js b/app/models/server/models/Rooms.js index fe13c47491011..8233f2ef161d1 100644 --- a/app/models/server/models/Rooms.js +++ b/app/models/server/models/Rooms.js @@ -808,6 +808,22 @@ export class Rooms extends Base { return this.update(query, update); } + incUsersCountByIds(ids, inc = 1) { + const query = { + _id: { + $in: ids, + }, + }; + + const update = { + $inc: { + usersCount: inc, + }, + }; + + return this.update(query, update, { multi: true }); + } + incUsersCountNotDMsByIds(ids, inc = 1) { const query = { _id: { diff --git a/app/models/server/models/Subscriptions.js b/app/models/server/models/Subscriptions.js index 748262d4e82ba..dc20000012f91 100644 --- a/app/models/server/models/Subscriptions.js +++ b/app/models/server/models/Subscriptions.js @@ -1274,6 +1274,18 @@ export class Subscriptions extends Base { return result; } + removeByRoomIdsAndUserId(rids, userId) { + const result = this.remove({ rid: { $in: rids }, 'u._id': userId }); + + if (Match.test(result, Number) && result > 0) { + Rooms.incUsersCountByIds(rids, -1); + } + + Users.removeRoomsByRoomIdsAndUserId(rids, userId); + + return result; + } + // ////////////////////////////////////////////////////////////////// // threads diff --git a/app/models/server/models/Users.js b/app/models/server/models/Users.js index 6d9cf9d972b16..ad9929c6b2629 100644 --- a/app/models/server/models/Users.js +++ b/app/models/server/models/Users.js @@ -443,6 +443,15 @@ export class Users extends Base { }, { multi: true }); } + removeRoomsByRoomIdsAndUserId(rids, userId) { + return this.update({ + _id: userId, + __rooms: { $in: rids }, + }, { + $pullAll: { __rooms: rids }, + }, { multi: true }); + } + update2FABackupCodesByUserId(userId, backupCodes) { return this.update({ _id: userId,