migrate persistence from JSON to SwiftData
Models: - Convert Conversation and ChatMessage to SwiftData @Model classes with a one-to-many relationship and cascade delete. - Rename ChatMessage.id to clientID and drop Conversation.id in favor of jid (the string id would clash with PersistentIdentifier). - Keep MessageReaction as a Codable value stored in an array attribute. Persistence: - Add ArchiveStore, a per-account ModelContainer/ModelContext that replaces the JSON ChatArchive with load/save/erase. - Add ArchiveMetadataRecord for the durable MAM checkpoints, cursor, locally deleted message IDs and roster contact JIDs. - Add LegacyArchiveImporter to import the old JSON snapshot once and delete the file afterwards, preserving existing history. AppModel: - Replace ChatArchive with ArchiveStore and persist via context.save(); insert new models and delete the replaced object on upsert merges so SwiftData never keeps an orphaned duplicate. Tests: - Replace ChatArchiveTests with ArchiveStoreTests (store round-trip and legacy import) and drop the now-obsolete Codable round-trip assertions.
This commit is contained in:
1 parent
0317277d46
commit
cbb820a86e
30 files changed
+726
-665
No files matched your search
@@ -10,19 +10,6 @@ final class EncryptionPreferenceTests: XCTestCase {
|
||||
XCTAssertFalse(EncryptionPreference.disabled.resolved(globalEnabled: true))
|
||||
}
|
||||
|
||||
func testConversationWithoutEncryptionFieldStillDecodes() throws {
|
||||
let conversation = Conversation(jid: "bob@example.org", displayName: "Bob")
|
||||
let encoded = try JSONEncoder().encode(conversation)
|
||||
var object = try XCTUnwrap(JSONSerialization.jsonObject(with: encoded) as? [String: Any])
|
||||
object.removeValue(forKey: "encryptionPreference")
|
||||
let legacyData = try JSONSerialization.data(withJSONObject: object)
|
||||
|
||||
let decoded = try JSONDecoder().decode(Conversation.self, from: legacyData)
|
||||
|
||||
XCTAssertEqual(decoded.encryptionPreference, .inheritGlobal)
|
||||
XCTAssertEqual(decoded.jid, conversation.jid)
|
||||
}
|
||||
|
||||
func testGlobalSettingIsStoredPerAccount() throws {
|
||||
let suite = "LumaTests.\(UUID().uuidString)"
|
||||
let defaults = try XCTUnwrap(UserDefaults(suiteName: suite))
|
||||
|
||||
Reference in new issue
Block a user