From ef4224bfa0113878758bdfa649c7aff1cf64512b Mon Sep 17 00:00:00 2001 From: Di Wu Date: Tue, 16 Jan 2024 17:02:08 -0800 Subject: [PATCH 1/2] fix(datastore): decode optimistically with paginated list response type --- .../API/Response/GraphQLError.swift | 2 ++ .../AWSPluginsCore/Sync/PaginatedList.swift | 31 +++++++++++++++++++ .../InitialSync/InitialSyncOperation.swift | 10 ++++-- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Amplify/Categories/API/Response/GraphQLError.swift b/Amplify/Categories/API/Response/GraphQLError.swift index 2afe5e8c63..7d1d21f104 100644 --- a/Amplify/Categories/API/Response/GraphQLError.swift +++ b/Amplify/Categories/API/Response/GraphQLError.swift @@ -44,3 +44,5 @@ extension GraphQLError { public let column: Int } } + +extension GraphQLError: Error { } diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift b/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift index b77a11cbb9..1458988802 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift @@ -12,4 +12,35 @@ public struct PaginatedList: Decodable { public let items: [MutationSync] public let nextToken: String? public let startedAt: Int64? + + enum CodingKeys: CodingKey { + case items + case nextToken + case startedAt + } + + public init(items: [MutationSync], nextToken: String?, startedAt: Int64?) { + self.items = items + self.nextToken = nextToken + self.startedAt = startedAt + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + let optimisticDecodedResults = try values.decode([OptimisticDecoded>].self, forKey: .items) + items = optimisticDecodedResults.compactMap { try? $0.result.get() } + nextToken = try values.decode(String?.self, forKey: .nextToken) + startedAt = try values.decode(Int64?.self, forKey: .startedAt) + } +} + + +fileprivate struct OptimisticDecoded: Decodable { + let result: Result + + init(from decoder: Decoder) throws { + result = Result(catching: { + try T(from: decoder) + }) + } } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift index 6785669c6f..e01f235b88 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift @@ -216,11 +216,17 @@ final class InitialSyncOperation: AsynchronousOperation { let syncQueryResult: SyncQueryResult switch graphQLResult { + case .success(let queryResult): + syncQueryResult = queryResult + + case .failure(.partial(let queryResult, let errors)): + syncQueryResult = queryResult + errors.map { DataStoreError.api(APIError(errorDescription: $0.message, error: $0)) } + .forEach { dataStoreConfiguration.errorHandler($0) } + case .failure(let graphQLResponseError): finish(result: .failure(DataStoreError.api(graphQLResponseError))) return - case .success(let queryResult): - syncQueryResult = queryResult } let items = syncQueryResult.items From 80c3935b5e3905aefb90acf39eecac838812d4db Mon Sep 17 00:00:00 2001 From: Abhash Kumar Singh Date: Thu, 18 Jan 2024 11:01:05 -0800 Subject: [PATCH 2/2] fix(datastore): add required fields in selection set for hasOne-belongsTo relationship --- .../Core/AWSPluginsCore/Model/Support/SelectionSet.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift index b926808de4..96fe316d43 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift @@ -53,7 +53,7 @@ extension SelectionSet { let schema = ModelRegistry.modelSchema(from: associatedModelName) { if recursive { var recursive = recursive - if field._isBelongsToOrHasOne { + if field._isBelongsToOrHasOne && !field.isRequired { recursive = false }