Skip to content

Commit 8b29417

Browse files
author
Thomas Belin
authored
runfix(core): Fix qualified ids setting on message entities (#11960)
1 parent a7901a0 commit 8b29417

File tree

2 files changed

+50
-23
lines changed

2 files changed

+50
-23
lines changed

src/script/conversation/EventBuilder.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919

2020
import type {LegalHoldStatus} from '@wireapp/protocol-messaging';
21+
import {MemberLeaveReason} from '@wireapp/api-client/src/conversation/data/';
2122
import {CONVERSATION_EVENT} from '@wireapp/api-client/src/event/';
2223
import type {QualifiedId} from '@wireapp/api-client/src/user/';
2324
import type {REASON as AVS_REASON} from '@wireapp/avs';
@@ -99,8 +100,13 @@ export type GroupCreationEvent = ConversationEvent<GroupCreationEventData> & {ty
99100
export type LegalHoldMessageEvent = ConversationEvent<{legal_hold_status: LegalHoldStatus}> & {
100101
type: CONVERSATION.LEGAL_HOLD_UPDATE;
101102
};
102-
export type MemberJoinEvent = BackendEventMessage<{user_ids: string[]}>;
103-
export type MemberLeaveEvent = BackendEventMessage<{user_ids: string[]}>;
103+
export type MemberJoinEvent = BackendEventMessage<{qualified_user_ids?: QualifiedId[]; user_ids: string[]}>;
104+
export type MemberLeaveEvent = BackendEventMessage<{
105+
name?: string;
106+
qualified_user_ids?: QualifiedId[];
107+
reason?: MemberLeaveReason;
108+
user_ids: string[];
109+
}>;
104110
export type MessageAddEvent = Omit<ConversationEvent<{}>, 'id'> & {
105111
edited_time?: string;
106112
status: StatusType;
@@ -412,6 +418,7 @@ export const EventBuilder = {
412418
return {
413419
conversation: conversationEntity.id,
414420
data: {
421+
qualified_user_ids: [userId],
415422
user_ids: [userId.id],
416423
},
417424
from: removedBySelfUser ? conversationEntity.selfUser().id : userId.id,

src/script/conversation/EventMapper.ts

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*
1818
*/
1919

20-
import {CONVERSATION_EVENT} from '@wireapp/api-client/src/event/';
20+
import {CONVERSATION_EVENT, ConversationEvent} from '@wireapp/api-client/src/event/';
2121
import {LinkPreview, ITweet, Mention} from '@wireapp/protocol-messaging';
2222

2323
import {getLogger, Logger} from 'Util/Logger';
@@ -64,6 +64,7 @@ import type {Text as TextAsset} from '../entity/message/Text';
6464
import type {LinkPreviewMetaDataType} from '../links/LinkPreviewMetaDataType';
6565
import {LinkPreview as LinkPreviewEntity} from '../entity/message/LinkPreview';
6666
import {CallingTimeoutMessage} from '../entity/message/CallingTimeoutMessage';
67+
import {MemberJoinEvent, MemberLeaveEvent, TeamMemberLeaveEvent} from './EventBuilder';
6768

6869
// Event Mapper to convert all server side JSON events into core entities.
6970
export class EventMapper {
@@ -192,17 +193,17 @@ export class EventMapper {
192193
* @param conversationEntity Conversation entity the event belong to
193194
* @returns Mapped message entity
194195
*/
195-
async _mapJsonEvent(event: EventRecord, conversationEntity: Conversation) {
196+
async _mapJsonEvent(event: ConversationEvent | EventRecord, conversationEntity: Conversation) {
196197
let messageEntity;
197198

198199
switch (event.type) {
199200
case CONVERSATION_EVENT.MEMBER_JOIN: {
200-
messageEntity = this._mapEventMemberJoin(event, conversationEntity);
201+
messageEntity = this._mapEventMemberJoin(event as MemberJoinEvent, conversationEntity);
201202
break;
202203
}
203204

204205
case CONVERSATION_EVENT.MEMBER_LEAVE: {
205-
messageEntity = this._mapEventMemberLeave(event);
206+
messageEntity = this._mapEventMemberLeave(event as MemberLeaveEvent);
206207
break;
207208
}
208209

@@ -285,7 +286,7 @@ export class EventMapper {
285286
}
286287

287288
case ClientEvent.CONVERSATION.TEAM_MEMBER_LEAVE: {
288-
messageEntity = this._mapEventTeamMemberLeave(event);
289+
messageEntity = this._mapEventTeamMemberLeave(event as TeamMemberLeaveEvent);
289290
break;
290291
}
291292

@@ -310,20 +311,33 @@ export class EventMapper {
310311
}
311312

312313
default: {
313-
this.logger.warn(`Ignored unhandled '${event.type}' event ${event.id ? `'${event.id}' ` : ''}`, event);
314+
const {type, id} = event as EventRecord;
315+
this.logger.warn(`Ignored unhandled '${type}' event ${id ? `'${id}' ` : ''}`, event);
314316
throw new ConversationError(
315317
ConversationError.TYPE.MESSAGE_NOT_FOUND,
316318
ConversationError.MESSAGE.MESSAGE_NOT_FOUND,
317319
);
318320
}
319321
}
320322

321-
const {category, data, from, id, primary_key, time, type, version} = event;
323+
const {
324+
category,
325+
data,
326+
from,
327+
id,
328+
primary_key,
329+
time,
330+
type,
331+
version,
332+
from_client_id,
333+
ephemeral_expires,
334+
ephemeral_started,
335+
} = event as EventRecord;
322336

323337
messageEntity.category = category;
324338
messageEntity.conversation_id = conversationEntity.id;
325339
messageEntity.from = from;
326-
messageEntity.fromClientId = event.from_client_id;
340+
messageEntity.fromClientId = from_client_id;
327341
messageEntity.id = id;
328342
messageEntity.primary_key = primary_key;
329343
messageEntity.timestamp(new Date(time).getTime());
@@ -335,20 +349,21 @@ export class EventMapper {
335349
}
336350

337351
if (messageEntity.isContent() || messageEntity.isPing()) {
338-
messageEntity.status(event.status || StatusType.SENT);
352+
messageEntity.status((event as EventRecord).status || StatusType.SENT);
339353
}
340354

341355
if (messageEntity.isComposite()) {
342-
messageEntity.selectedButtonId(event.selected_button_id);
343-
messageEntity.waitingButtonId(event.waiting_button_id);
356+
const {selected_button_id, waiting_button_id} = event as EventRecord;
357+
messageEntity.selectedButtonId(selected_button_id);
358+
messageEntity.waitingButtonId(waiting_button_id);
344359
}
345360
if (messageEntity.isReactable()) {
346-
(messageEntity as ContentMessage).reactions(event.reactions || {});
361+
(messageEntity as ContentMessage).reactions((event as EventRecord).reactions || {});
347362
}
348363

349-
if (event.ephemeral_expires) {
350-
messageEntity.ephemeral_expires(event.ephemeral_expires);
351-
messageEntity.ephemeral_started(Number(event.ephemeral_started) || 0);
364+
if (ephemeral_expires) {
365+
messageEntity.ephemeral_expires(ephemeral_expires);
366+
messageEntity.ephemeral_started(Number(ephemeral_started) || 0);
352367
}
353368

354369
if (isNaN(messageEntity.timestamp())) {
@@ -460,9 +475,13 @@ export class EventMapper {
460475
* @param conversationEntity Conversation entity the event belong to
461476
* @returns Member message entity
462477
*/
463-
private _mapEventMemberJoin(event: EventRecord, conversationEntity: Conversation) {
478+
private _mapEventMemberJoin(
479+
event: MemberJoinEvent & {data: {has_service?: boolean}},
480+
conversationEntity: Conversation,
481+
) {
464482
const {data: eventData, from: sender} = event;
465-
const {has_service: hasService, user_ids: userIds} = eventData;
483+
const {has_service: hasService} = eventData;
484+
const userIds = eventData.qualified_user_ids || eventData.user_ids.map(id => ({domain: null, id}));
466485

467486
const messageEntity = new MemberMessage();
468487

@@ -471,7 +490,7 @@ export class EventMapper {
471490

472491
if (conversationEntity.isGroup()) {
473492
const messageFromCreator = sender === conversationEntity.creator;
474-
const creatorIndex = userIds.indexOf(sender);
493+
const creatorIndex = userIds.findIndex(user => user.id === sender);
475494
const creatorIsJoiningMember = messageFromCreator && creatorIndex !== -1;
476495

477496
if (creatorIsJoiningMember) {
@@ -495,9 +514,10 @@ export class EventMapper {
495514
* @param eventData Message data
496515
* @returns Member message entity
497516
*/
498-
private _mapEventMemberLeave({data: eventData}: EventRecord) {
517+
private _mapEventMemberLeave({data: eventData}: MemberLeaveEvent) {
499518
const messageEntity = new MemberMessage();
500-
messageEntity.userIds(eventData.user_ids);
519+
const userIds = eventData.qualified_user_ids || eventData.user_ids.map(id => ({domain: null, id}));
520+
messageEntity.userIds(userIds);
501521
messageEntity.reason = eventData.reason;
502522
return messageEntity;
503523
}
@@ -596,7 +616,7 @@ export class EventMapper {
596616
* @param event Message data
597617
* @returns Member message entity
598618
*/
599-
private _mapEventTeamMemberLeave(event: EventRecord) {
619+
private _mapEventTeamMemberLeave(event: MemberLeaveEvent) {
600620
const messageEntity = this._mapEventMemberLeave(event);
601621
const eventData = event.data;
602622
messageEntity.name(eventData.name || t('conversationSomeone'));

0 commit comments

Comments
 (0)