Signal-iOS/SignalServiceKit/Messages/Stickers/InstalledStickerRecord.swift
2026-06-01 12:49:00 -05:00

123 lines
4.1 KiB
Swift

//
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public import GRDB
public final class InstalledStickerRecord: SDSCodableModel, Decodable {
public static let databaseTableName: String = "model_InstalledSticker"
private static let recordType: UInt = 24
public var id: Int64?
public let uniqueId: String
public let info: StickerInfo
public let emojiString: String?
public let contentType: String?
public enum CodingKeys: String, CodingKey, ColumnExpression {
case id
case recordType
case uniqueId
case info
case emojiString
case contentType
}
public init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decodeIfPresent(Int64.self, forKey: .id)
self.uniqueId = try container.decode(String.self, forKey: .uniqueId)
let infoData = try container.decode(Data.self, forKey: .info)
self.info = try LegacySDSSerializer().deserializeLegacySDSData(infoData, ofClass: StickerInfo.self)
self.emojiString = try container.decodeIfPresent(String.self, forKey: .emojiString)
self.contentType = try container.decodeIfPresent(String.self, forKey: .contentType)
}
public func encode(to encoder: any Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(self.id, forKey: .id)
try container.encode(self.uniqueId, forKey: .uniqueId)
try container.encode(Self.recordType, forKey: .recordType)
try container.encode(LegacySDSSerializer().serializeAsLegacySDSData(self.info), forKey: .info)
try container.encodeIfPresent(self.emojiString, forKey: .emojiString)
try container.encodeIfPresent(self.contentType, forKey: .contentType)
}
init(
info: StickerInfo,
contentType: String?,
emojiString: String?,
) {
owsAssertDebug(!info.packId.isEmpty)
owsAssertDebug(!info.packKey.isEmpty)
self.id = nil
self.uniqueId = Self.uniqueId(for: info)
self.info = info
self.contentType = contentType?.nilIfEmpty
self.emojiString = emojiString
}
private init(
id: Int64?,
uniqueId: String,
info: StickerInfo,
contentType: String?,
emojiString: String?,
) {
self.id = id
self.uniqueId = uniqueId
self.info = info
self.contentType = contentType
self.emojiString = emojiString
}
func deepCopy() -> Self {
return Self(
id: self.id,
uniqueId: self.uniqueId,
info: self.info,
contentType: self.contentType,
emojiString: self.emojiString,
)
}
var packId: Data {
return self.info.packId
}
var packKey: Data {
return self.info.packKey
}
var stickerId: UInt32 {
return self.info.stickerId
}
static func uniqueId(for stickerInfo: StickerInfo) -> String {
return stickerInfo.asKey()
}
public func anyDidInsert(transaction: DBWriteTransaction) {
SSKEnvironment.shared.modelReadCachesRef.installedStickerCache.didInsertOrUpdate(installedSticker: self, transaction: transaction)
}
public func anyDidUpdate(transaction: DBWriteTransaction) {
SSKEnvironment.shared.modelReadCachesRef.installedStickerCache.didInsertOrUpdate(installedSticker: self, transaction: transaction)
}
public func anyDidRemove(transaction: DBWriteTransaction) {
SSKEnvironment.shared.modelReadCachesRef.installedStickerCache.didRemove(installedSticker: self, transaction: transaction)
}
public func anyDidFetchOne(transaction: DBReadTransaction) {
SSKEnvironment.shared.modelReadCachesRef.installedStickerCache.didReadInstalledSticker(self, transaction: transaction)
}
public func anyDidEnumerateOne(transaction: DBReadTransaction) {
SSKEnvironment.shared.modelReadCachesRef.installedStickerCache.didReadInstalledSticker(self, transaction: transaction)
}
}