[FIX] No warning message is sent when user is removed from a team's main channel (#21949)

pull/21991/head
Matheus Barbosa Silva 4 years ago committed by GitHub
parent 5e5161488a
commit 645b1191ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      app/api/server/v1/teams.ts
  2. 8
      app/models/server/raw/Users.js
  3. 2
      server/sdk/types/ITeamService.ts
  4. 19
      server/services/team/service.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();
},
});

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

@ -67,7 +67,7 @@ export interface ITeamService {
members(uid: string, teamId: string, canSeeAll: boolean, options?: IPaginationOptions, queryOptions?: IQueryOptions<ITeamMember>): Promise<IRecordsWithTotal<ITeamMemberInfo>>;
addMembers(uid: string, teamId: string, members: Array<ITeamMemberParams>): Promise<void>;
updateMember(teamId: string, members: ITeamMemberParams): Promise<void>;
removeMembers(teamId: string, members: Array<ITeamMemberParams>): Promise<boolean>;
removeMembers(uid: string, teamId: string, members: Array<ITeamMemberParams>): Promise<boolean>;
getInfoByName(teamName: string): Promise<Partial<ITeam> | undefined>;
getInfoById(teamId: string): Promise<Partial<ITeam> | undefined>;
deleteById(teamId: string): Promise<boolean>;

@ -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<ITeamMemberParams>): Promise<boolean> {
async removeMembers(uid: string, teamId: string, members: Array<ITeamMemberParams>): Promise<boolean> {
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<void> {
// 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);
}
}

Loading…
Cancel
Save