diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift index 2acb52f892..9408b0825a 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift @@ -201,8 +201,10 @@ final class OutgoingMutationQueue: OutgoingMutationQueueBehavior { } Task { + let latestSyncMetadata = try? storageAdapter.queryMutationSyncMetadata(for: mutationEvent.modelId, modelName: mutationEvent.modelName) let syncMutationToCloudOperation = await SyncMutationToCloudOperation( mutationEvent: mutationEvent, + latestSyncMetadata: latestSyncMetadata, api: api, authModeStrategy: authModeStrategy ) { [weak self] result in diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/SyncMutationToCloudOperation.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/SyncMutationToCloudOperation.swift index dac31dd0bf..c823b363fe 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/SyncMutationToCloudOperation.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/SyncMutationToCloudOperation.swift @@ -19,6 +19,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation { private weak var api: APICategoryGraphQLBehaviorExtended? private let mutationEvent: MutationEvent + private let latestSyncMetadata: MutationSyncMetadata? private let completion: GraphQLOperation>.ResultListener private let requestRetryablePolicy: RequestRetryablePolicy @@ -31,6 +32,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation { private var authTypesIterator: AWSAuthorizationTypeIterator? init(mutationEvent: MutationEvent, + latestSyncMetadata: MutationSyncMetadata?, api: APICategoryGraphQLBehaviorExtended, authModeStrategy: AuthModeStrategy, networkReachabilityPublisher: AnyPublisher? = nil, @@ -38,6 +40,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation { requestRetryablePolicy: RequestRetryablePolicy? = RequestRetryablePolicy(), completion: @escaping GraphQLOperation>.ResultListener) async { self.mutationEvent = mutationEvent + self.latestSyncMetadata = latestSyncMetadata self.api = api self.networkReachabilityPublisher = networkReachabilityPublisher self.completion = completion @@ -128,7 +131,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation { request = GraphQLRequest.deleteMutation(of: model, modelSchema: modelSchema, where: graphQLFilter, - version: mutationEvent.version) + version: latestSyncMetadata?.version) case .update: let model = try mutationEvent.decodeModel() guard let modelSchema = ModelRegistry.modelSchema(from: mutationEvent.modelName) else { @@ -140,7 +143,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation { request = GraphQLRequest.updateMutation(of: model, modelSchema: modelSchema, where: graphQLFilter, - version: mutationEvent.version) + version: latestSyncMetadata?.version) case .create: let model = try mutationEvent.decodeModel() guard let modelSchema = ModelRegistry.modelSchema(from: mutationEvent.modelName) else { @@ -151,7 +154,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation { } request = GraphQLRequest.createMutation(of: model, modelSchema: modelSchema, - version: mutationEvent.version) + version: latestSyncMetadata?.version) } } catch { let apiError = APIError.unknown("Couldn't decode model", "", error) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/SyncMutationToCloudOperationTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/SyncMutationToCloudOperationTests.swift index 263a6b52f6..60013f795b 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/SyncMutationToCloudOperationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/SyncMutationToCloudOperationTests.swift @@ -67,12 +67,15 @@ class SyncMutationToCloudOperationTests: XCTestCase { expectMutationRequestCompletion.fulfill() } - let operation = await SyncMutationToCloudOperation(mutationEvent: mutationEvent, - api: mockAPIPlugin, - authModeStrategy: AWSDefaultAuthModeStrategy(), - networkReachabilityPublisher: publisher, - currentAttemptNumber: 1, - completion: completion) + let operation = await SyncMutationToCloudOperation( + mutationEvent: mutationEvent, + latestSyncMetadata: nil, + api: mockAPIPlugin, + authModeStrategy: AWSDefaultAuthModeStrategy(), + networkReachabilityPublisher: publisher, + currentAttemptNumber: 1, + completion: completion + ) let queue = OperationQueue() queue.addOperation(operation) await fulfillment(of: [expectFirstCallToAPIMutate], timeout: defaultAsyncWaitTimeout) @@ -139,13 +142,16 @@ class SyncMutationToCloudOperationTests: XCTestCase { let completion: GraphQLOperation>.ResultListener = { _ in expectMutationRequestCompletion.fulfill() } - let operation = await SyncMutationToCloudOperation(mutationEvent: mutationEvent, - api: mockAPIPlugin, - authModeStrategy: AWSDefaultAuthModeStrategy(), - networkReachabilityPublisher: publisher, - currentAttemptNumber: 1, - requestRetryablePolicy: mockRequestRetryPolicy, - completion: completion) + let operation = await SyncMutationToCloudOperation( + mutationEvent: mutationEvent, + latestSyncMetadata: nil, + api: mockAPIPlugin, + authModeStrategy: AWSDefaultAuthModeStrategy(), + networkReachabilityPublisher: publisher, + currentAttemptNumber: 1, + requestRetryablePolicy: mockRequestRetryPolicy, + completion: completion + ) let queue = OperationQueue() queue.addOperation(operation) await fulfillment(of: [expectFirstCallToAPIMutate], timeout: defaultAsyncWaitTimeout) @@ -212,13 +218,16 @@ class SyncMutationToCloudOperationTests: XCTestCase { break } } - let operation = await SyncMutationToCloudOperation(mutationEvent: mutationEvent, - api: mockAPIPlugin, - authModeStrategy: AWSDefaultAuthModeStrategy(), - networkReachabilityPublisher: publisher, - currentAttemptNumber: 1, - requestRetryablePolicy: mockRequestRetryPolicy, - completion: completion) + let operation = await SyncMutationToCloudOperation( + mutationEvent: mutationEvent, + latestSyncMetadata: nil, + api: mockAPIPlugin, + authModeStrategy: AWSDefaultAuthModeStrategy(), + networkReachabilityPublisher: publisher, + currentAttemptNumber: 1, + requestRetryablePolicy: mockRequestRetryPolicy, + completion: completion + ) let queue = OperationQueue() queue.addOperation(operation) await fulfillment(of: [expectFirstCallToAPIMutate], timeout: defaultAsyncWaitTimeout)