From 645b1191eeecc152a04c5453f71f6afd2a077f7e Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Fri, 7 May 2021 14:18:37 -0300 Subject: [PATCH] [FIX] No warning message is sent when user is removed from a team's main channel (#21949) --- app/api/server/v1/teams.ts | 7 ++----- app/models/server/raw/Users.js | 8 ++++++++ server/sdk/types/ITeamService.ts | 2 +- server/services/team/service.ts | 19 +++++++------------ 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/api/server/v1/teams.ts b/app/api/server/v1/teams.ts index fb972a4d219..480a20f5672 100644 --- a/app/api/server/v1/teams.ts +++ b/app/api/server/v1/teams.ts @@ -266,7 +266,7 @@ API.v1.addRoute('teams.removeMember', { authRequired: true }, { return API.v1.failure('invalid-user'); } - if (!Promise.await(Team.removeMembers(team._id, [{ userId }]))) { + if (!Promise.await(Team.removeMembers(this.userId, team._id, [{ userId }]))) { return API.v1.failure(); } @@ -279,7 +279,6 @@ API.v1.addRoute('teams.removeMember', { authRequired: true }, { }); }); } - return API.v1.success(); }, }); @@ -290,7 +289,7 @@ API.v1.addRoute('teams.leave', { authRequired: true }, { const team = teamId ? Promise.await(Team.getOneById(teamId)) : Promise.await(Team.getOneByName(teamName)); - Promise.await(Team.removeMembers(team._id, [{ + Promise.await(Team.removeMembers(this.userId, team._id, [{ userId: this.userId, }])); @@ -302,8 +301,6 @@ API.v1.addRoute('teams.leave', { authRequired: true }, { }); } - removeUserFromRoom(team.roomId, this.user); - return API.v1.success(); }, }); diff --git a/app/models/server/raw/Users.js b/app/models/server/raw/Users.js index 0fce3cb47be..abc100d54b8 100644 --- a/app/models/server/raw/Users.js +++ b/app/models/server/raw/Users.js @@ -119,6 +119,14 @@ export class UsersRaw extends BaseRaw { return this.find(query, options); } + findByIds(userIds, options = {}) { + const query = { + _id: { $in: userIds }, + }; + + return this.find(query, options); + } + findOneByUsernameIgnoringCase(username, options) { if (typeof username === 'string') { username = new RegExp(`^${ escapeRegExp(username) }$`, 'i'); diff --git a/server/sdk/types/ITeamService.ts b/server/sdk/types/ITeamService.ts index 03a2d535425..c301b966c56 100644 --- a/server/sdk/types/ITeamService.ts +++ b/server/sdk/types/ITeamService.ts @@ -67,7 +67,7 @@ export interface ITeamService { members(uid: string, teamId: string, canSeeAll: boolean, options?: IPaginationOptions, queryOptions?: IQueryOptions): Promise>; addMembers(uid: string, teamId: string, members: Array): Promise; updateMember(teamId: string, members: ITeamMemberParams): Promise; - removeMembers(teamId: string, members: Array): Promise; + removeMembers(uid: string, teamId: string, members: Array): Promise; getInfoByName(teamName: string): Promise | undefined>; getInfoById(teamId: string): Promise | undefined>; deleteById(teamId: string): Promise; diff --git a/server/services/team/service.ts b/server/services/team/service.ts index 3ba6ee1c2d3..33f4a7cc136 100644 --- a/server/services/team/service.ts +++ b/server/services/team/service.ts @@ -4,7 +4,6 @@ import { checkUsernameAvailability } from '../../../app/lib/server/functions'; import { addUserToRoom } from '../../../app/lib/server/functions/addUserToRoom'; import { removeUserFromRoom } from '../../../app/lib/server/functions/removeUserFromRoom'; import { getSubscribedRoomsForUserWithDetails } from '../../../app/lib/server/functions/getRoomsWithSingleOwner'; -import { Subscriptions } from '../../../app/models/server'; import { MessagesRaw } from '../../../app/models/server/raw/Messages'; import { RoomsRaw } from '../../../app/models/server/raw/Rooms'; import { SubscriptionsRaw } from '../../../app/models/server/raw/Subscriptions'; @@ -584,12 +583,16 @@ export class TeamService extends ServiceClass implements ITeamService { await this.TeamMembersModel.deleteByUserIdAndTeamId(userId, teamId); } - async removeMembers(teamId: string, members: Array): Promise { + async removeMembers(uid: string, teamId: string, members: Array): Promise { const team = await this.TeamModel.findOneById(teamId, { projection: { _id: 1, roomId: 1 } }); if (!team) { throw new Error('team-does-not-exist'); } + const membersIds = members.map((m) => m.userId); + const usersToRemove = await this.Users.findByIds(membersIds, { projection: { _id: 1, username: 1 } }).toArray(); + const byUser = await this.Users.findOneById(uid, { projection: { _id: 1, username: 1 } }); + for await (const member of members) { if (!member.userId) { throw new Error('invalid-user'); @@ -609,8 +612,8 @@ export class TeamService extends ServiceClass implements ITeamService { } this.TeamMembersModel.removeById(existingMember._id); - - await this.unsubscribeFromMain(team.roomId, member.userId); + const removedUser = usersToRemove.find((u) => u._id === existingMember.userId); + removeUserFromRoom(team.roomId, removedUser, { byUser: uid !== member.userId ? byUser : undefined }); } return true; @@ -821,12 +824,4 @@ export class TeamService extends ServiceClass implements ITeamService { return rooms; } - - async unsubscribeFromMain(roomId: string, userId: string): Promise { - // we need to use the normal model here. The raw one didn't propagate the changes to the FE - // let me know if there's a way of doing that - await Subscriptions.removeByRoomIdsAndUserId([roomId], userId); - await this.RoomsModel.incUsersCountByIds([roomId], -1); - await this.Users.removeRoomsByRoomIdsAndUserId([roomId], userId); - } }