summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2022-11-01 08:05:27 +0100
committerAndrej Mihajlov <and@mullvad.net>2022-11-08 10:18:58 +0100
commit42d326276f448b81e1ca73682e71470b6060c880 (patch)
treea8ad659652e6a61a369f447a861fed923611ee00
parent717a1a59f952bf69d686b407b61e86b627ffcc51 (diff)
downloadmullvadvpn-42d326276f448b81e1ca73682e71470b6060c880.tar.xz
mullvadvpn-42d326276f448b81e1ca73682e71470b6060c880.zip
Payments: move account validation into operation, add background observer
-rw-r--r--ios/MullvadVPN/StorePaymentManager/StorePaymentManager.swift84
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,