diff --git a/apple/OmnivoreKit/Sources/Services/Authentication/GoogleAuth.swift b/apple/OmnivoreKit/Sources/Services/Authentication/GoogleAuth.swift index d5f967913..be2429db2 100644 --- a/apple/OmnivoreKit/Sources/Services/Authentication/GoogleAuth.swift +++ b/apple/OmnivoreKit/Sources/Services/Authentication/GoogleAuth.swift @@ -54,26 +54,26 @@ private extension Authenticator { authError: Error? ) { if let idToken = authState?.lastTokenResponse?.idToken { - networker.submitGoogleToken(idToken: idToken) - .sink { completion in - guard case let .failure(loginError) = completion else { return } - switch loginError { - case .unauthorized, .unknown: - self.resolveAuthResponseForAccountCreation(promise: promise, authState: authState, authError: authError) - case .network: - promise(.failure(loginError)) + Task { + do { + let authPayload = try await networker.submitGoogleToken(idToken: idToken) + try ValetKey.authCookieString.setValue(authPayload.commentedAuthCookieString) + try ValetKey.authToken.setValue(authPayload.authToken) + DispatchQueue.main.async { + self.isLoggedIn = true } - } receiveValue: { [weak self] in - do { - try ValetKey.authCookieString.setValue($0.commentedAuthCookieString) - try ValetKey.authToken.setValue($0.authToken) - self?.isLoggedIn = true - promise(.success(false)) - } catch { - promise(.failure(.unknown)) + } catch { + if let error = error as? LoginError { + switch error { + case .unauthorized, .unknown: + self.resolveAuthResponseForAccountCreation(promise: promise, authState: authState, authError: authError) + case .network: + promise(.failure(error)) + } + self.resolveAuthResponseForAccountCreation(promise: promise, authState: authState, authError: authError) } } - .store(in: &subscriptions) + } } else { resolveAuthResponseForAccountCreation(promise: promise, authState: authState, authError: authError) } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeviceToken.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeviceToken.swift index 90ae087c5..dcc50beba 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeviceToken.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeviceToken.swift @@ -27,15 +27,13 @@ public enum DeviceTokenOperation { } public extension DataService { - func deviceTokenPublisher( - deviceTokenOperation: DeviceTokenOperation - ) -> AnyPublisher { - enum MutationResultNew { + func syncDeviceToken(deviceTokenOperation: DeviceTokenOperation) { + enum MutationResult { case saved(id: String) case error(errorCode: Enums.SetDeviceTokenErrorCode) } - let selection = Selection { + let selection = Selection { try $0.on( setDeviceTokenSuccess: .init { .saved(id: try $0.deviceToken(selection: Selection.DeviceToken { try $0.id() })) @@ -57,28 +55,6 @@ public extension DataService { let path = appEnvironment.graphqlPath let headers = networker.defaultHeaders - return Deferred { - Future { promise in - send(mutation, to: path, headers: headers) { result in - switch result { - case let .success(payload): - if let graphqlError = payload.errors { - promise(.failure(.message(messageText: "graphql error: \(graphqlError)"))) - } - - switch payload.data { - case let .saved(id: id): - promise(.success(id)) - case let .error(errorCode: errorCode): - promise(.failure(.message(messageText: errorCode.rawValue))) - } - case .failure: - promise(.failure(.message(messageText: "graphql error"))) - } - } - } - } - .receive(on: DispatchQueue.main) - .eraseToAnyPublisher() + send(mutation, to: path, headers: headers) { _ in } } } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift b/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift index c292ad4ce..4357931f9 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift @@ -1,5 +1,6 @@ import Combine import Foundation +import Models import Utils struct ServerResource { @@ -33,6 +34,32 @@ extension ServerResponse { } extension URLSession { + func performReq( + resource: ServerResource + ) async throws -> ResponseModel { + do { + let (data, response) = try await data(for: resource.urlRequest) + let serverResponse = ServerResponse(data: data, response: response) + + if let httpResponse = response as? HTTPURLResponse, 200 ..< 300 ~= httpResponse.statusCode { + NetworkRequestLogger.log(request: resource.urlRequest, serverResponse: serverResponse) + + if let decodedValue = resource.decode(serverResponse) { + return decodedValue + } + + throw ServerError(serverResponse: serverResponse) + } else { + throw ServerError(serverResponse: serverResponse) + } + } catch { + let serverResponse = ServerResponse(error: error) + NetworkRequestLogger.log(request: resource.urlRequest, serverResponse: serverResponse) + throw ServerError(serverResponse: serverResponse) + } + } + + // TODO: remove performRequest // swiftlint:disable:next line_length func performRequest(resource: ServerResource) -> AnyPublisher { let request = resource.urlRequest diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResources/CreateGoogleToken.swift b/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResources/CreateGoogleToken.swift index 342f9cf50..e189cb9be 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResources/CreateGoogleToken.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResources/CreateGoogleToken.swift @@ -3,7 +3,7 @@ import Foundation import Models extension Networker { - func submitGoogleToken(idToken: String) -> AnyPublisher { + func submitGoogleToken(idToken: String) async throws -> AuthPayload { let params = SignInParams(token: idToken, provider: .google) let encodedParams = (try? JSONEncoder().encode(params)) ?? Data() @@ -18,10 +18,14 @@ extension Networker { decode: AuthPayload.decode ) - return urlSession - .performRequest(resource: resource) - .mapError { LoginError.make(serverError: $0) } - .receive(on: DispatchQueue.main) - .eraseToAnyPublisher() + do { + return try await urlSession.performReq(resource: resource) + } catch { + if let error = error as? ServerError { + throw LoginError.make(serverError: error) + } else { + throw LoginError.unknown + } + } } } diff --git a/apple/Sources/PushNotificationConfig.swift b/apple/Sources/PushNotificationConfig.swift index 81496ff40..da9fa33a3 100644 --- a/apple/Sources/PushNotificationConfig.swift +++ b/apple/Sources/PushNotificationConfig.swift @@ -93,10 +93,6 @@ extension AppDelegate: MessagingDelegate { } UserDefaults.standard.set(fcmToken, forKey: UserDefaultKey.firebasePushToken.rawValue) - - Services().dataService - .deviceTokenPublisher(deviceTokenOperation: .addToken(token: fcmToken)) - .sink(receiveCompletion: { _ in }, receiveValue: { _ in }) - .store(in: &subscriptions) + Services().dataService.syncDeviceToken(deviceTokenOperation: .addToken(token: fcmToken)) } }