diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2022-11-01 08:05:27 +0100 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2022-11-08 10:18:58 +0100 |
| commit | 42d326276f448b81e1ca73682e71470b6060c880 (patch) | |
| tree | a8ad659652e6a61a369f447a861fed923611ee00 /ios | |
| parent | 717a1a59f952bf69d686b407b61e86b627ffcc51 (diff) | |
| download | mullvadvpn-42d326276f448b81e1ca73682e71470b6060c880.tar.xz mullvadvpn-42d326276f448b81e1ca73682e71470b6060c880.zip | |
Payments: move account validation into operation, add background observer
Diffstat (limited to 'ios')
| -rw-r--r-- | ios/MullvadVPN/StorePaymentManager/StorePaymentManager.swift | 84 |
1 files changed, 47 insertions, 37 deletions
diff --git a/ios/MullvadVPN/StorePaymentManager/StorePaymentManager.swift b/ios/MullvadVPN/StorePaymentManager/StorePaymentManager.swift index 61b626cd33..6b316fd3cc 100644 --- a/ios/MullvadVPN/StorePaymentManager/StorePaymentManager.swift +++ b/ios/MullvadVPN/StorePaymentManager/StorePaymentManager.swift @@ -124,55 +124,26 @@ class StorePaymentManager: NSObject, SKPaymentTransactionObserver { return operation } - func addPayment(_ payment: SKPayment, for accountToken: String) { - var task: Cancellable? - let backgroundTaskIdentifier = UIApplication.shared - .beginBackgroundTask(withName: "Validate account token") { - task?.cancel() - } - + func addPayment(_ payment: SKPayment, for accountNumber: String) { // Validate account token before adding new payment to the queue. - task = accountsProxy.getAccountData( - accountNumber: accountToken, - retryStrategy: .default - ) { completion in - dispatchPrecondition(condition: .onQueue(.main)) - - switch completion { - case .success: - self.associateAccountToken(accountToken, and: payment) - self.paymentQueue.add(payment) - - case let .failure(error): - let event = StorePaymentEvent.failure( - StorePaymentFailure( - transaction: nil, - payment: payment, - accountNumber: accountToken, - error: .validateAccount(error) - ) - ) - - self.observerList.forEach { observer in - observer.storePaymentManager(self, didReceiveEvent: event) - } - - case .cancelled: + validateAccount(accountNumber: accountNumber) { error in + if let error = error { let event = StorePaymentEvent.failure( StorePaymentFailure( transaction: nil, payment: payment, - accountNumber: accountToken, - error: .validateAccount(.network(URLError(.cancelled))) + accountNumber: accountNumber, + error: error ) ) self.observerList.forEach { observer in observer.storePaymentManager(self, didReceiveEvent: event) } + } else { + self.associateAccountToken(accountNumber, and: payment) + self.paymentQueue.add(payment) } - - UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier) } } @@ -209,6 +180,45 @@ class StorePaymentManager: NSObject, SKPaymentTransactionObserver { } } + private func validateAccount( + accountNumber: String, + completionHandler: @escaping (StorePaymentManagerError?) -> Void + ) { + let accountOperation = ResultBlockOperation(dispatchQueue: .main) { op in + let task = self.accountsProxy.getAccountData( + accountNumber: accountNumber, + retryStrategy: .default + ) { completion in + op.finish(completion: completion) + } + + op.addCancellationBlock { + task.cancel() + } + } + + accountOperation.addObserver(BackgroundObserver( + application: .shared, + name: "Validate account number", + cancelUponExpiration: false + )) + + accountOperation.completionQueue = .main + accountOperation.completionHandler = { completion in + var error: REST.Error? + + if case .cancelled = completion { + error = .network(URLError(.cancelled)) + } else { + error = completion.error + } + + completionHandler(error.map { .validateAccount($0) }) + } + + operationQueue.addOperation(accountOperation) + } + private func sendStoreReceipt( accountToken: String, forceRefresh: Bool, |
