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

97 lines
4 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
public final class CallRecordDeleteAllJobRecord: JobRecord, FactoryInitializableFromRecordType {
override class var jobRecordType: JobRecord.JobRecordType { .callRecordDeleteAll }
/// Whether this job should send a "delete all" `CallLogEvent` sync message.
/// - SeeAlso ``OutgoingCallLogEventSyncMessage``.
let sendDeleteAllSyncMessage: Bool
/// A stringified call ID of a ``CallRecord`` that represents the
/// most-recent call that should be deleted by this job. The call ID itself
/// is a `UInt64`, but SQLite can only store `Int64`, so we wrap it in a
/// string to accomodate `UInt64` values greater than `Int64.max`.
///
/// - SeeAlso ``CallRecord/callId``
private let _deleteAllBeforeCallIdString: String?
/// The call ID of a ``CallRecord`` that represents the most-recent call
/// that should be deleted by this job.
///
/// - Important
/// This property will be `nil` for legacy job records, or jobs enqueued
/// based on a legacy sync message, in which case we will fall back to
/// `deleteAllBeforeTimestamp`.
var deleteAllBeforeCallId: UInt64? {
_deleteAllBeforeCallIdString.map { UInt64($0)! }
}
/// The call ID of a ``CallRecord`` that represents the most-recent call
/// that should be deleted by this job.
///
/// - Important
/// This property will be `nil` for legacy job records, or jobs enqueued
/// based on a legacy sync message, in which case we will fall back to
/// `deleteAllBeforeTimestamp`.
let deleteAllBeforeConversationId: Data?
/// A "call began" timestamp before (and at) which all earlier calls should
/// be deleted.
let deleteAllBeforeTimestamp: UInt64
init(
sendDeleteAllSyncMessage: Bool,
deleteAllBeforeCallId: UInt64?,
deleteAllBeforeConversationId: Data?,
deleteAllBeforeTimestamp: UInt64,
failureCount: UInt = 0,
status: Status = .ready
) {
self.sendDeleteAllSyncMessage = sendDeleteAllSyncMessage
self._deleteAllBeforeCallIdString = deleteAllBeforeCallId.map { String($0) }
self.deleteAllBeforeConversationId = deleteAllBeforeConversationId
self.deleteAllBeforeTimestamp = deleteAllBeforeTimestamp
super.init(
failureCount: failureCount,
status: status
)
}
required init(forRecordTypeFactoryInitializationFrom decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
sendDeleteAllSyncMessage = try container.decode(Bool.self, forKey: .sendDeleteAllSyncMessage)
deleteAllBeforeTimestamp = try container.decode(UInt64.self, forKey: .deleteAllBeforeTimestamp)
if
let callIdString = try container.decodeIfPresent(String.self, forKey: .deleteAllBeforeCallId),
let conversationId = try container.decodeIfPresent(Data.self, forKey: .deleteAllBeforeConversationId)
{
_deleteAllBeforeCallIdString = callIdString
deleteAllBeforeConversationId = conversationId
} else {
_deleteAllBeforeCallIdString = nil
deleteAllBeforeConversationId = nil
}
try super.init(baseClassDuringFactoryInitializationFrom: container.superDecoder())
}
override public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try super.encode(to: container.superEncoder())
try container.encode(sendDeleteAllSyncMessage, forKey: .sendDeleteAllSyncMessage)
try container.encode(deleteAllBeforeTimestamp, forKey: .deleteAllBeforeTimestamp)
if let _deleteAllBeforeCallIdString, let deleteAllBeforeConversationId {
try container.encode(_deleteAllBeforeCallIdString, forKey: .deleteAllBeforeCallId)
try container.encode(deleteAllBeforeConversationId, forKey: .deleteAllBeforeConversationId)
}
}
}