@@ -9,11 +9,17 @@ final class DeviceTransferServerDataSource {
99 private let key : DeviceTransferKey
1010 private let remotePlatform : DeviceTransferPlatform
1111 private let fileContentBuffer : UnsafeMutablePointer < UInt8 >
12+ private let conversationIDs : String ?
13+ private let fromDate : String ?
14+ private let needsFilterData : Bool
1215
13- init ( key: DeviceTransferKey , remotePlatform: DeviceTransferPlatform ) {
16+ init ( key: DeviceTransferKey , remotePlatform: DeviceTransferPlatform , filter : DeviceTransferFilter ) {
1417 self . key = key
1518 self . remotePlatform = remotePlatform
1619 self . fileContentBuffer = . allocate( capacity: fileChunkSize)
20+ conversationIDs = filter. conversation. joinedIDs
21+ fromDate = filter. time. utcString
22+ needsFilterData = conversationIDs != nil || fromDate != nil
1723 }
1824
1925 deinit {
@@ -27,22 +33,27 @@ extension DeviceTransferServerDataSource {
2733
2834 func totalCount( ) -> Int {
2935 assert ( !Queue. main. isCurrent)
30- let messagesCount = MessageDAO . shared. messagesCount ( )
31- let attachmentsCount = attachmentsCount ( )
32- let total = ConversationDAO . shared. conversationsCount ( )
33- + ParticipantDAO. shared. participantsCount ( )
36+ let messagesCount = MessageDAO . shared. messagesCount ( matching: conversationIDs, sinceDate: fromDate)
37+ let attachmentsCount = needsFilterData
38+ ? MessageDAO . shared. mediaMessagesCount ( matching: conversationIDs)
39+ : attachmentsCount ( )
40+ let transcriptMessageCount = needsFilterData
41+ ? MessageDAO . shared. transcriptMessageCount ( matching: conversationIDs, sinceDate: fromDate)
42+ : TranscriptMessageDAO . shared. transcriptMessagesCount ( )
43+ let total = ConversationDAO . shared. conversationsCount ( matching: conversationIDs)
44+ + ParticipantDAO. shared. participantsCount ( matching: conversationIDs)
3445 + UserDAO. shared. usersCount ( )
3546 + AppDAO. shared. appsCount ( )
3647 + AssetDAO. shared. assetsCount ( )
3748 + SnapshotDAO. shared. snapshotsCount ( )
3849 + StickerDAO. shared. stickersCount ( )
39- + PinMessageDAO. shared. pinMessagesCount ( )
40- + TranscriptMessageDAO . shared . transcriptMessagesCount ( )
50+ + PinMessageDAO. shared. pinMessagesCount ( matching : conversationIDs , sinceDate : fromDate )
51+ + transcriptMessageCount
4152 + messagesCount
42- + MessageMentionDAO. shared. messageMentionsCount ( )
53+ + MessageMentionDAO. shared. messageMentionsCount ( matching : conversationIDs )
4354 + ExpiredMessageDAO. shared. expiredMessagesCount ( )
4455 + attachmentsCount
45- Logger . general. info ( category: " DeviceTransferServerDataSource " , message: " Total: \( total) , Messages: \( messagesCount) , attachments: \( attachmentsCount) " )
56+ Logger . general. info ( category: " DeviceTransferServerDataSource " , message: " Total: \( total) , Messages: \( messagesCount) , attachments: \( attachmentsCount) , transcriptMessageCount: \( transcriptMessageCount ) " )
4657 return total
4758 }
4859
@@ -156,7 +167,9 @@ extension DeviceTransferServerDataSource {
156167 let databaseItemCount : Int
157168 switch location. type {
158169 case . conversation:
159- let conversations = ConversationDAO . shared. conversations ( limit: limit, after: location. primaryID)
170+ let conversations = ConversationDAO . shared. conversations ( limit: limit,
171+ after: location. primaryID,
172+ matching: conversationIDs)
160173 databaseItemCount = conversations. count
161174 nextPrimaryID = conversations. last? . conversationId
162175 nextSecondaryID = nil
@@ -171,7 +184,10 @@ extension DeviceTransferServerDataSource {
171184 }
172185 }
173186 case . participant:
174- let participants = ParticipantDAO . shared. participants ( limit: limit, after: location. primaryID, with: location. secondaryID)
187+ let participants = ParticipantDAO . shared. participants ( limit: limit,
188+ after: location. primaryID,
189+ with: location. secondaryID,
190+ matching: conversationIDs)
175191 databaseItemCount = participants. count
176192 nextPrimaryID = participants. last? . conversationId
177193 nextSecondaryID = participants. last? . userId
@@ -261,7 +277,10 @@ extension DeviceTransferServerDataSource {
261277 }
262278 }
263279 case . pinMessage:
264- let pinMessages = PinMessageDAO . shared. pinMessages ( limit: limit, after: location. primaryID)
280+ let pinMessages = PinMessageDAO . shared. pinMessages ( limit: limit,
281+ after: location. primaryID,
282+ matching: conversationIDs,
283+ sinceDate: fromDate)
265284 databaseItemCount = pinMessages. count
266285 nextPrimaryID = pinMessages. last? . messageId
267286 nextSecondaryID = nil
@@ -276,49 +295,61 @@ extension DeviceTransferServerDataSource {
276295 }
277296 }
278297 case . transcriptMessage:
279- let transcriptMessages = TranscriptMessageDAO . shared. transcriptMessages ( limit: limit, after: location. primaryID, with: location. secondaryID)
280- databaseItemCount = transcriptMessages. count
281- nextPrimaryID = transcriptMessages. last? . transcriptId
282- nextSecondaryID = transcriptMessages. last? . messageId
283- transferItems = transcriptMessages. compactMap { transcriptMessage in
284- let deviceTransferTranscriptMessage = DeviceTransferTranscriptMessage ( transcriptMessage: transcriptMessage, to: remotePlatform)
285- do {
286- let outputData = try DeviceTransferProtocol . output ( type: location. type, data: deviceTransferTranscriptMessage, key: key)
287- if let mediaURL = transcriptMessage. mediaUrl, !mediaURL. isEmpty, transcriptMessage. mediaStatus == MediaStatus . DONE. rawValue {
288- let url = AttachmentContainer . url ( transcriptId: transcriptMessage. transcriptId, filename: mediaURL)
289- let attachment = TransferItem . Attachment ( messageID: transcriptMessage. messageId, url: url)
290- return TransferItem ( rawItem: transcriptMessage, outputData: outputData, attachment: attachment)
291- } else {
292- return TransferItem ( rawItem: transcriptMessage, outputData: outputData, attachment: nil )
293- }
294- } catch {
295- Logger . general. error ( category: " DeviceTransferServerDataSource " , message: " Failed to output: \( error) " )
296- return nil
297- }
298+ if needsFilterData {
299+ databaseItemCount = 0
300+ nextPrimaryID = nil
301+ nextSecondaryID = nil
302+ transferItems = [ ]
303+ } else {
304+ let transcriptMessages = TranscriptMessageDAO . shared. transcriptMessages ( limit: limit, after: location. primaryID, with: location. secondaryID)
305+ databaseItemCount = transcriptMessages. count
306+ nextPrimaryID = transcriptMessages. last? . transcriptId
307+ nextSecondaryID = transcriptMessages. last? . messageId
308+ transferItems = transcriptTransferItems ( for: transcriptMessages)
298309 }
299310 case . message:
300- let messages = MessageDAO . shared. messages ( limit: limit, after: location. primaryID)
311+ let messages = MessageDAO . shared. messages ( limit: limit,
312+ after: location. primaryID,
313+ matching: conversationIDs,
314+ sinceDate: fromDate)
301315 databaseItemCount = messages. count
302316 nextPrimaryID = messages. last? . messageId
303317 nextSecondaryID = nil
304- transferItems = messages. compactMap { message in
318+ var messageItems = [ TransferItem] ( )
319+ var transcriptMessageItems = [ TransferItem] ( )
320+ var transcriptMessageCount = 0
321+ for message in messages {
305322 let deviceTransferMessage = DeviceTransferMessage ( message: message, to: remotePlatform)
306323 do {
307324 let outputData = try DeviceTransferProtocol . output ( type: location. type, data: deviceTransferMessage, key: key)
325+ let attachment : TransferItem . Attachment ?
308326 if let mediaURL = message. mediaUrl, !mediaURL. isEmpty, message. mediaStatus == MediaStatus . DONE. rawValue, let category = AttachmentContainer . Category ( messageCategory: message. category) {
309327 let url = AttachmentContainer . url ( for: category, filename: mediaURL)
310- let attachment = TransferItem . Attachment ( messageID: message. messageId, url: url)
311- return TransferItem ( rawItem: message, outputData: outputData, attachment: attachment)
328+ attachment = TransferItem . Attachment ( messageID: message. messageId, url: url)
312329 } else {
313- return TransferItem ( rawItem: message, outputData: outputData, attachment: nil )
330+ attachment = nil
331+ }
332+ if let item = TransferItem ( rawItem: message, outputData: outputData, attachment: attachment) {
333+ messageItems. append ( item)
314334 }
315335 } catch {
316- Logger . general. error ( category: " DeviceTransferServerDataSource " , message: " Failed to output: \( error) " )
317- return nil
336+ Logger . general. error ( category: " DeviceTransferServerDataSource " , message: " Failed to output message: \( error) " )
318337 }
338+ // TranscriptMessage
339+ if needsFilterData && message. category. hasSuffix ( " _TRANSCRIPT " ) {
340+ transcriptMessageCount += 1
341+ let transcriptMessages = TranscriptMessageDAO . shared. transcriptMessages ( transcriptId: message. messageId)
342+ transcriptMessageItems = transcriptTransferItems ( for: transcriptMessages)
343+ }
344+ }
345+ if transcriptMessageCount != 0 {
346+ Logger . general. info ( category: " DeviceTransferServerDataSource " , message: " Send transcriptMessages along with messages: \( transcriptMessageCount) " )
319347 }
348+ transferItems = transcriptMessageItems + messageItems
320349 case . messageMention:
321- let messageMentions = MessageMentionDAO . shared. messageMentions ( limit: limit, after: location. primaryID)
350+ let messageMentions = MessageMentionDAO . shared. messageMentions ( limit: limit,
351+ after: location. primaryID,
352+ matching: conversationIDs)
322353 databaseItemCount = messageMentions. count
323354 nextPrimaryID = messageMentions. last? . messageId
324355 nextSecondaryID = nil
@@ -430,4 +461,23 @@ extension DeviceTransferServerDataSource {
430461 return true
431462 }
432463
464+ private func transcriptTransferItems( for transcriptMessages: [ TranscriptMessage ] ) -> [ TransferItem ] {
465+ transcriptMessages. compactMap { transcriptMessage in
466+ let deviceTransferTranscriptMessage = DeviceTransferTranscriptMessage ( transcriptMessage: transcriptMessage, to: remotePlatform)
467+ do {
468+ let outputData = try DeviceTransferProtocol . output ( type: . transcriptMessage, data: deviceTransferTranscriptMessage, key: key)
469+ if let mediaURL = transcriptMessage. mediaUrl, !mediaURL. isEmpty, transcriptMessage. mediaStatus == MediaStatus . DONE. rawValue {
470+ let url = AttachmentContainer . url ( transcriptId: transcriptMessage. transcriptId, filename: mediaURL)
471+ let attachment = TransferItem . Attachment ( messageID: transcriptMessage. messageId, url: url)
472+ return TransferItem ( rawItem: transcriptMessage, outputData: outputData, attachment: attachment)
473+ } else {
474+ return TransferItem ( rawItem: transcriptMessage, outputData: outputData, attachment: nil )
475+ }
476+ } catch {
477+ Logger . general. error ( category: " DeviceTransferServerDataSource " , message: " Failed to output: \( error) " )
478+ return nil
479+ }
480+ }
481+ }
482+
433483}
0 commit comments