Skip to content

Commit

Permalink
sync mutation event with latest synced version
Browse files Browse the repository at this point in the history
  • Loading branch information
5d committed Nov 23, 2023
1 parent 8b45ef0 commit 776b32e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation {

private weak var api: APICategoryGraphQLBehaviorExtended?
private let mutationEvent: MutationEvent
private let latestSyncMetadata: MutationSyncMetadata?
private let completion: GraphQLOperation<MutationSync<AnyModel>>.ResultListener
private let requestRetryablePolicy: RequestRetryablePolicy

Expand All @@ -31,13 +32,15 @@ class SyncMutationToCloudOperation: AsynchronousOperation {
private var authTypesIterator: AWSAuthorizationTypeIterator?

init(mutationEvent: MutationEvent,
latestSyncMetadata: MutationSyncMetadata?,
api: APICategoryGraphQLBehaviorExtended,
authModeStrategy: AuthModeStrategy,
networkReachabilityPublisher: AnyPublisher<ReachabilityUpdate, Never>? = nil,
currentAttemptNumber: Int = 1,
requestRetryablePolicy: RequestRetryablePolicy? = RequestRetryablePolicy(),
completion: @escaping GraphQLOperation<MutationSync<AnyModel>>.ResultListener) async {
self.mutationEvent = mutationEvent
self.latestSyncMetadata = latestSyncMetadata
self.api = api
self.networkReachabilityPublisher = networkReachabilityPublisher
self.completion = completion
Expand Down Expand Up @@ -128,7 +131,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation {
request = GraphQLRequest<MutationSyncResult>.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 {
Expand All @@ -140,7 +143,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation {
request = GraphQLRequest<MutationSyncResult>.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 {
Expand All @@ -151,7 +154,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation {
}
request = GraphQLRequest<MutationSyncResult>.createMutation(of: model,
modelSchema: modelSchema,
version: mutationEvent.version)
version: latestSyncMetadata?.version)
}
} catch {
let apiError = APIError.unknown("Couldn't decode model", "", error)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -139,13 +142,16 @@ class SyncMutationToCloudOperationTests: XCTestCase {
let completion: GraphQLOperation<MutationSync<AnyModel>>.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)
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 776b32e

Please sign in to comment.