use async urlsession func to submit google token

This commit is contained in:
Satindar Dhillon 2022-04-27 22:19:54 -07:00
parent 6e0879c34c
commit ffdcb605c7
5 changed files with 59 additions and 56 deletions

View file

@ -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)
}

View file

@ -27,15 +27,13 @@ public enum DeviceTokenOperation {
}
public extension DataService {
func deviceTokenPublisher(
deviceTokenOperation: DeviceTokenOperation
) -> AnyPublisher<String, BasicError> {
enum MutationResultNew {
func syncDeviceToken(deviceTokenOperation: DeviceTokenOperation) {
enum MutationResult {
case saved(id: String)
case error(errorCode: Enums.SetDeviceTokenErrorCode)
}
let selection = Selection<MutationResultNew, Unions.SetDeviceTokenResult> {
let selection = Selection<MutationResult, Unions.SetDeviceTokenResult> {
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 }
}
}

View file

@ -1,5 +1,6 @@
import Combine
import Foundation
import Models
import Utils
struct ServerResource<ResponseModel> {
@ -33,6 +34,32 @@ extension ServerResponse {
}
extension URLSession {
func performReq<ResponseModel>(
resource: ServerResource<ResponseModel>
) 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<ResponseModel>(resource: ServerResource<ResponseModel>) -> AnyPublisher<ResponseModel, ServerError> {
let request = resource.urlRequest

View file

@ -3,7 +3,7 @@ import Foundation
import Models
extension Networker {
func submitGoogleToken(idToken: String) -> AnyPublisher<AuthPayload, LoginError> {
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
}
}
}
}

View file

@ -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))
}
}