mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
use async urlsession func to submit google token
This commit is contained in:
parent
6e0879c34c
commit
ffdcb605c7
5 changed files with 59 additions and 56 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue