diff --git a/Sources/SQLiteData/CloudKit/CloudKitSharing.swift b/Sources/SQLiteData/CloudKit/CloudKitSharing.swift index 11b333b5..09f4181b 100644 --- a/Sources/SQLiteData/CloudKit/CloudKitSharing.swift +++ b/Sources/SQLiteData/CloudKit/CloudKitSharing.swift @@ -118,14 +118,14 @@ ) } let recordName = record.recordName - let metadata = + let lastKnownServerRecord = try await metadatabase.read { db in try SyncMetadata .where { $0.recordName.eq(recordName) } - .select { ($0.recordType, $0.recordName, $0.lastKnownServerRecord) } + .select(\._lastKnownServerRecordAllFields) .fetchOne(db) } ?? nil - guard let (recordType, recordName, lastKnownServerRecord) = metadata + guard let lastKnownServerRecord else { throw SharingError( recordTableName: T.tableName, @@ -137,18 +137,11 @@ ) } - let rootRecord = - lastKnownServerRecord - ?? CKRecord( - recordType: recordType, - recordID: CKRecord.ID(recordName: recordName, zoneID: defaultZone.zoneID) - ) - var existingShare: CKShare? { get async throws { let share = try await metadatabase.read { db in try SyncMetadata - .find(rootRecord.recordID) + .find(lastKnownServerRecord.recordID) .select(\.share) .fetchOne(db) ?? nil } @@ -157,7 +150,7 @@ return nil } do { - return try await container.database(for: rootRecord.recordID) + return try await container.database(for: lastKnownServerRecord.recordID) .record(for: shareRecordID) as? CKShare } catch let error as CKError where error.code == .unknownItem { return nil @@ -168,16 +161,16 @@ let sharedRecord = try await existingShare ?? CKShare( - rootRecord: rootRecord, + rootRecord: lastKnownServerRecord, shareID: CKRecord.ID( recordName: "share-\(recordName)", - zoneID: rootRecord.recordID.zoneID + zoneID: lastKnownServerRecord.recordID.zoneID ) ) configure(sharedRecord) let (saveResults, _) = try await container.privateCloudDatabase.modifyRecords( - saving: [sharedRecord, rootRecord], + saving: [sharedRecord, lastKnownServerRecord], deleting: [] ) @@ -188,9 +181,9 @@ .first let savedRootRecord = try saveResults.values.compactMap { result in let record = try result.get() - return record.recordID == rootRecord.recordID ? record : nil + return record.recordID == lastKnownServerRecord.recordID ? record : nil } - .first + .first guard let savedShare, let savedRootRecord else { throw SharingError( diff --git a/Sources/SQLiteData/CloudKit/SyncEngine.swift b/Sources/SQLiteData/CloudKit/SyncEngine.swift index 2b341c14..b5368db2 100644 --- a/Sources/SQLiteData/CloudKit/SyncEngine.swift +++ b/Sources/SQLiteData/CloudKit/SyncEngine.swift @@ -321,12 +321,6 @@ : URL(filePath: metadatabase.path).lastPathComponent let attachedMetadatabaseName = URL(string: attachedMetadatabasePath)?.lastPathComponent ?? "" - - try URL.metadatabase( - databasePath: attachedMetadatabasePath, - containerIdentifier: self.container.containerIdentifier - ) - .lastPathComponent if metadatabaseName != attachedMetadatabaseName { throw SchemaError( reason: .metadatabaseMismatch( diff --git a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift index bace04aa..c3db0e3c 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift @@ -551,7 +551,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) assertQuery( - RemindersList.join(SyncMetadata.all) { $0.hasMetadata(in: $1) }, + RemindersList.join(SyncMetadata.all) { $0.syncMetadataID.eq($1.id) }, database: userDatabase.database ) { """ diff --git a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift index 973d8f95..f6c556a1 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift @@ -612,16 +612,19 @@ let _ = try await syncEngine.share(record: remindersList, configure: { _ in }) - assertQuery(SyncMetadata.select(\.share), database: syncEngine.metadatabase) { + assertQuery( + SyncMetadata.select { ($0.share, $0.userModificationTime) }, + database: syncEngine.metadatabase + ) { """ - ┌────────────────────────────────────────────────────────────────────────┐ - │ CKRecord( │ - │ recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__), │ - │ recordType: "cloudkit.share", │ - │ parent: nil, │ - │ share: nil │ - │ ) │ - └────────────────────────────────────────────────────────────────────────┘ + ┌────────────────────────────────────────────────────────────────────────┬───┐ + │ CKRecord( │ 0 │ + │ recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__), │ │ + │ recordType: "cloudkit.share", │ │ + │ parent: nil, │ │ + │ share: nil │ │ + │ ) │ │ + └────────────────────────────────────────────────────────────────────────┴───┘ """ } @@ -641,7 +644,9 @@ recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__), recordType: "remindersLists", parent: nil, - share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)) + share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)), + id: 1, + title: "Personal" ) ] ), @@ -700,7 +705,9 @@ recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__), recordType: "remindersLists", parent: nil, - share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)) + share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)), + id: 1, + title: "Personal" ) ] ), @@ -763,7 +770,9 @@ recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__), recordType: "remindersLists", parent: nil, - share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)) + share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)), + id: 1, + title: "Personal" ) ] ), @@ -793,7 +802,9 @@ recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__), recordType: "remindersLists", parent: nil, - share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)) + share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)), + id: 1, + title: "Personal" ) ] ), @@ -2787,7 +2798,9 @@ recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__), recordType: "remindersLists", parent: nil, - share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)) + share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)), + id: 1, + title: "Personal" ) ] ), diff --git a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift index 769b0d53..b65e984c 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift @@ -452,7 +452,9 @@ recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__), recordType: "remindersLists", parent: nil, - share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)) + share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)), + id: 1, + title: "Personal" ) ] ),