TM-SGNL-iOS/SignalServiceKit/Groups/GroupUpdateInfoMessageInserterBackupHelper.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

61 lines
2.5 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
import LibSignalClient
public protocol GroupUpdateInfoMessageInserterBackupHelper {
/**
* When processing a backup, we may encounter a single group update item
* representing a collapsed sequence of requests and cancels from the same user
* (``GroupSequenceOfRequestsAndCancelsUpdate`` proto, which becomes
* ``TSInfoMessage.PersistableGroupUpdateItem.sequenceOfInviteLinkRequestAndCancels``).
*
* If we do, and it is immediately followed by a request to join by the same user in the same group,
* we have to update the prior collapsed sequence message to mark it as _not_ the tail (isTail = false).
* This method is a helper for that, which co-locates the code with the same code for processing
* incoming group updates during normal app functioning.
*
* This method handles two cases:
* 1. The sequence and subsequent request occur in the same TSInfoMessage, meaning they are both
* in the passed-in updates. In this case it updates the sequence's isTail to false, and returns the
* modified updates without touching the database.
* 2. The sequence is in the most recently inserted TSInfoMessage, and the passed-in updates have just
* the new request from the same user. In this case it updates the most recent TSInfoMessage in the db
* and returns the same update(s).
*
* MUST BE CALLED BEFORE INSERTING THE NEW TSINFOMESSAGE.
*
* - parameter updates: the updates pulled from the backup that we are about to generate
* a new TSInfoMessage for. This method may modify the updates.
*/
func collapseIfNeeded(
updates: inout [TSInfoMessage.PersistableGroupUpdateItem],
localIdentifiers: LocalIdentifiers,
groupThread: TSGroupThread,
tx: DBWriteTransaction
)
}
public class GroupUpdateInfoMessageInserterBackupHelperImpl: GroupUpdateInfoMessageInserterBackupHelper {
public init() {}
public func collapseIfNeeded(
updates: inout [TSInfoMessage.PersistableGroupUpdateItem],
localIdentifiers: LocalIdentifiers,
groupThread: TSGroupThread,
tx: DBWriteTransaction
) {
return GroupUpdateInfoMessageInserterImpl
.collapseFromBackupIfNeeded(
updates: &updates,
localIdentifiers: localIdentifiers,
groupThread: groupThread,
transaction: SDSDB.shimOnlyBridge(tx)
)
}
}