1717 *
1818 */
1919
20- import { DeleteEvent , MessageAddEvent } from 'Repositories/conversation/EventBuilder' ;
20+ import { DeleteEvent , MessageAddEvent , MultipartMessageAddEvent } from 'Repositories/conversation/EventBuilder' ;
2121import { StoredEvent } from 'Repositories/storage/record/EventRecord' ;
2222import { getLogger , Logger } from 'Util/Logger' ;
2323
@@ -45,6 +45,11 @@ export class RepliesUpdaterMiddleware implements EventMiddleware {
4545 return originalMessageId ? this . handleEditEvent ( event , originalMessageId ) : event ;
4646 }
4747
48+ case ClientEvent . CONVERSATION . MULTIPART_MESSAGE_ADD : {
49+ const originalMessageId = event . data . replacing_message_id ;
50+ return originalMessageId ? this . handleMultipartEditEvent ( event , originalMessageId ) : event ;
51+ }
52+
4853 case ClientEvent . CONVERSATION . MESSAGE_DELETE : {
4954 return this . handleDeleteEvent ( event ) ;
5055 }
@@ -60,7 +65,11 @@ export class RepliesUpdaterMiddleware implements EventMiddleware {
6065 const { replies} = await this . findRepliesToMessage ( event . conversation , originalMessageId ) ;
6166 this . logger . info ( `Invalidating '${ replies . length } ' replies to deleted message '${ originalMessageId } '` ) ;
6267 replies . forEach ( async reply => {
63- reply . data . quote = { error : { type : QuoteEntity . ERROR . MESSAGE_NOT_FOUND } } ;
68+ if ( reply . type === ClientEvent . CONVERSATION . MESSAGE_ADD ) {
69+ reply . data . quote = { error : { type : QuoteEntity . ERROR . MESSAGE_NOT_FOUND } } ;
70+ } else if ( reply . type === ClientEvent . CONVERSATION . MULTIPART_MESSAGE_ADD && reply . data . text ) {
71+ reply . data . text . quote = { error : { type : QuoteEntity . ERROR . MESSAGE_NOT_FOUND } } as any ;
72+ }
6473 await this . eventService . replaceEvent ( reply ) ;
6574 } ) ;
6675 return event ;
@@ -77,9 +86,43 @@ export class RepliesUpdaterMiddleware implements EventMiddleware {
7786
7887 this . logger . info ( `Updating '${ replies . length } ' replies to updated message '${ originalMessageId } '` ) ;
7988 replies . forEach ( async reply => {
80- const quote = reply . data . quote ;
81- if ( quote && typeof quote !== 'string' && 'message_id' in quote && 'id' in event ) {
82- quote . message_id = event . id as string ;
89+ if ( reply . type === ClientEvent . CONVERSATION . MESSAGE_ADD ) {
90+ const quote = reply . data . quote ;
91+ if ( quote && typeof quote !== 'string' && 'message_id' in quote && 'id' in event ) {
92+ quote . message_id = event . id as string ;
93+ }
94+ } else if ( reply . type === ClientEvent . CONVERSATION . MULTIPART_MESSAGE_ADD && reply . data . text ?. quote ) {
95+ const quote = reply . data . text . quote ;
96+ if ( quote && typeof quote !== 'string' && 'message_id' in quote && 'id' in event ) {
97+ quote . message_id = event . id as string ;
98+ }
99+ }
100+ await this . eventService . replaceEvent ( reply ) ;
101+ } ) ;
102+ return event ;
103+ }
104+
105+ /**
106+ * will update the message ID of all the replies to an edited multipart message
107+ */
108+ private async handleMultipartEditEvent ( event : MultipartMessageAddEvent , originalMessageId : string ) {
109+ const { originalEvent, replies} = await this . findRepliesToMessage ( event . conversation , originalMessageId , event . id ) ;
110+ if ( ! originalEvent ) {
111+ return event ;
112+ }
113+
114+ this . logger . info ( `Updating '${ replies . length } ' replies to updated multipart message '${ originalMessageId } '` ) ;
115+ replies . forEach ( async reply => {
116+ if ( reply . type === ClientEvent . CONVERSATION . MESSAGE_ADD ) {
117+ const quote = reply . data . quote ;
118+ if ( quote && typeof quote !== 'string' && 'message_id' in quote && 'id' in event ) {
119+ quote . message_id = event . id as string ;
120+ }
121+ } else if ( reply . type === ClientEvent . CONVERSATION . MULTIPART_MESSAGE_ADD && reply . data . text ?. quote ) {
122+ const quote = reply . data . text . quote ;
123+ if ( quote && typeof quote !== 'string' && 'message_id' in quote && 'id' in event ) {
124+ quote . message_id = event . id as string ;
125+ }
83126 }
84127 await this . eventService . replaceEvent ( reply ) ;
85128 } ) ;
@@ -91,10 +134,17 @@ export class RepliesUpdaterMiddleware implements EventMiddleware {
91134 messageId : string ,
92135 /** in case the message was edited, we need to query the DB using the old event ID */
93136 previousMessageId ?: string ,
94- ) : Promise < { originalEvent ?: MessageAddEvent ; replies : StoredEvent < MessageAddEvent > [ ] } > {
137+ ) : Promise < {
138+ originalEvent ?: MessageAddEvent | MultipartMessageAddEvent ;
139+ replies : StoredEvent < MessageAddEvent | MultipartMessageAddEvent > [ ] ;
140+ } > {
95141 const originalEvent = await this . eventService . loadEvent ( conversationId , previousMessageId ?? messageId ) ;
96142
97- if ( ! originalEvent || originalEvent . type !== ClientEvent . CONVERSATION . MESSAGE_ADD ) {
143+ if (
144+ ! originalEvent ||
145+ ( originalEvent . type !== ClientEvent . CONVERSATION . MESSAGE_ADD &&
146+ originalEvent . type !== ClientEvent . CONVERSATION . MULTIPART_MESSAGE_ADD )
147+ ) {
98148 return {
99149 replies : [ ] ,
100150 } ;
0 commit comments