diff --git a/Signal/src/ViewControllers/Donations/BadgeThanksSheet.swift b/Signal/src/ViewControllers/Donations/BadgeThanksSheet.swift index 11c8d4d1cb..d2deb58599 100644 --- a/Signal/src/ViewControllers/Donations/BadgeThanksSheet.swift +++ b/Signal/src/ViewControllers/Donations/BadgeThanksSheet.swift @@ -214,7 +214,7 @@ class BadgeThanksSheet: OWSTableSheetViewController { guard let giftBadge = incomingMessage.giftBadge else { throw OWSAssertionError("trying to redeem message without a badge") } - return try SubscriptionManager.redeemReceiptCredentialPresentation( + return SubscriptionManager.redeemReceiptCredentialPresentation( receiptCredentialPresentation: try giftBadge.getReceiptCredentialPresentation() ) }.done(on: .global()) { diff --git a/Signal/src/ViewControllers/Donations/DonateViewController+MonthlyApplePayDonation.swift b/Signal/src/ViewControllers/Donations/DonateViewController+MonthlyApplePayDonation.swift index 2fbedc7443..180fab446c 100644 --- a/Signal/src/ViewControllers/Donations/DonateViewController+MonthlyApplePayDonation.swift +++ b/Signal/src/ViewControllers/Donations/DonateViewController+MonthlyApplePayDonation.swift @@ -32,7 +32,7 @@ extension DonateViewController { ), let subscriberID = monthly.subscriberID { firstly { - try SubscriptionManager.updateSubscriptionLevel( + SubscriptionManager.updateSubscriptionLevel( for: subscriberID, to: selectedSubscriptionLevel, payment: payment, diff --git a/SignalMessaging/Jobs/SubscriptionReceiptCredentialRedemptionJob.swift b/SignalMessaging/Jobs/SubscriptionReceiptCredentialRedemptionJob.swift index 263a90c4d5..6308f0e80c 100644 --- a/SignalMessaging/Jobs/SubscriptionReceiptCredentialRedemptionJob.swift +++ b/SignalMessaging/Jobs/SubscriptionReceiptCredentialRedemptionJob.swift @@ -222,7 +222,7 @@ public class SubscriptionReceiptCredentailRedemptionOperation: OWSOperation, Dur getMoneyPromise.then(on: .global()) { getReceiptCredentialPresentationPromise.then(on: .global()) { - try SubscriptionManager.redeemReceiptCredentialPresentation(receiptCredentialPresentation: $0) + SubscriptionManager.redeemReceiptCredentialPresentation(receiptCredentialPresentation: $0) } }.done(on: .global()) { Logger.info("[Donations] Successfully redeemed receipt credential presentation") diff --git a/SignalMessaging/Subscriptions/Stripe.swift b/SignalMessaging/Subscriptions/Stripe.swift index ab9a93cb9f..8e9be7890d 100644 --- a/SignalMessaging/Subscriptions/Stripe.swift +++ b/SignalMessaging/Subscriptions/Stripe.swift @@ -109,7 +109,10 @@ public struct Stripe: Dependencies { idempotencyKey: idempotencyKey) } - public static func confirmSetupIntent(for paymentIntentID: String, clientSecret: String, payment: PKPayment) throws -> Promise { + public static func confirmSetupIntent( + for paymentIntentID: String, + clientSecret: String + ) -> Promise { firstly(on: .sharedUserInitiated) { () -> Promise in let setupIntentId = try API.id(for: clientSecret) return try API.postForm(endpoint: "setup_intents/\(setupIntentId)/confirm", parameters: [ diff --git a/SignalMessaging/Subscriptions/SubscriptionManager.swift b/SignalMessaging/Subscriptions/SubscriptionManager.swift index dd7d6517fe..dd7ac6ae16 100644 --- a/SignalMessaging/Subscriptions/SubscriptionManager.swift +++ b/SignalMessaging/Subscriptions/SubscriptionManager.swift @@ -345,17 +345,17 @@ public class SubscriptionManager: NSObject { // MARK: Subscription management - private class func setupNewSubscriberID() throws -> Promise { + private class func setupNewSubscriberID() -> Promise { Logger.info("[Donations] Setting up new subscriber ID") let newSubscriberID = generateSubscriberID() return firstly { - try self.postSubscriberID(subscriberID: newSubscriberID) + self.postSubscriberID(subscriberID: newSubscriberID) }.map(on: .global()) { _ in return newSubscriberID } } - private class func postSubscriberID(subscriberID: Data) throws -> Promise { + private class func postSubscriberID(subscriberID: Data) -> Promise { let request = OWSRequestFactory.setSubscriptionIDRequest(subscriberID.asBase64Url) return firstly { networkManager.makePromise(request: request) @@ -372,7 +372,11 @@ public class SubscriptionManager: NSObject { return Cryptography.generateRandomBytes(UInt(32)) } - public class func setupNewSubscription(subscription: SubscriptionLevel, payment: PKPayment, currencyCode: String) throws -> Promise { + public class func setupNewSubscription( + subscription: SubscriptionLevel, + payment: PKPayment, + currencyCode: Currency.Code + ) -> Promise { Logger.info("[Donations] Setting up new subscription") var generatedSubscriberID = Data() @@ -380,7 +384,7 @@ public class SubscriptionManager: NSObject { var generatedPaymentID = "" return firstly { - return try setupNewSubscriberID() + setupNewSubscriberID() // Create Stripe SetupIntent against new subscriberID }.then(on: .sharedUserInitiated) { subscriberID -> Promise in @@ -399,7 +403,7 @@ public class SubscriptionManager: NSObject { self.storageServiceManager.recordPendingLocalAccountUpdates() } - return try createPaymentMethod(for: subscriberID) + return createPaymentMethod(for: subscriberID) // Create new payment method }.then(on: .sharedUserInitiated) { clientSecret -> Promise in @@ -417,7 +421,10 @@ public class SubscriptionManager: NSObject { } generatedPaymentID = paymentID - return try Stripe.confirmSetupIntent(for: generatedPaymentID, clientSecret: generatedClientSecret, payment: payment) + return Stripe.confirmSetupIntent( + for: generatedPaymentID, + clientSecret: generatedClientSecret + ) // Update payment on server }.then(on: .sharedUserInitiated) { _ -> Promise in @@ -425,7 +432,7 @@ public class SubscriptionManager: NSObject { throw OWSGenericError("Transaction chain cancelled") } - return try setDefaultPaymentMethod(for: generatedSubscriberID, paymentID: generatedPaymentID) + return setDefaultPaymentMethod(for: generatedSubscriberID, paymentID: generatedPaymentID) // Select subscription level }.then(on: .sharedUserInitiated) { _ -> Promise in @@ -437,16 +444,22 @@ public class SubscriptionManager: NSObject { Self.clearMostRecentSubscriptionBadgeChargeFailure(transaction: $0) } - return setSubscription(for: generatedSubscriberID, subscription: subscription, currency: currencyCode) + return setSubscription( + for: generatedSubscriberID, + subscription: subscription, + currencyCode: currencyCode + ) // Report success and dismiss sheet } } - public class func updateSubscriptionLevel(for subscriberID: Data, - to subscription: SubscriptionLevel, - payment: PKPayment, - currencyCode: String) throws -> Promise { + public class func updateSubscriptionLevel( + for subscriberID: Data, + to subscription: SubscriptionLevel, + payment: PKPayment, + currencyCode: Currency.Code + ) -> Promise { Logger.info("[Donations] Updating subscription level") let failureReason: SubscriptionRedemptionFailureReason = databaseStorage.read { transaction in @@ -458,15 +471,14 @@ public class SubscriptionManager: NSObject { return firstly { self.cancelSubscription(for: subscriberID) }.then(on: .sharedUserInitiated) { - try self.setupNewSubscription(subscription: subscription, payment: payment, currencyCode: currencyCode) + self.setupNewSubscription(subscription: subscription, payment: payment, currencyCode: currencyCode) } } var generatedClientSecret = "" var generatedPaymentID = "" return firstly { - try createPaymentMethod(for: subscriberID) - // Create new payment method + createPaymentMethod(for: subscriberID) }.then(on: .sharedUserInitiated) { clientSecret -> Promise in guard !self.terminateTransactionIfPossible else { throw OWSGenericError("Transaction chain cancelled") @@ -482,7 +494,10 @@ public class SubscriptionManager: NSObject { } generatedPaymentID = paymentID - return try Stripe.confirmSetupIntent(for: generatedPaymentID, clientSecret: generatedClientSecret, payment: payment) + return Stripe.confirmSetupIntent( + for: generatedPaymentID, + clientSecret: generatedClientSecret + ) // Update payment on server }.then(on: .sharedUserInitiated) { _ -> Promise in @@ -490,7 +505,7 @@ public class SubscriptionManager: NSObject { throw OWSGenericError("Transaction chain cancelled") } - return try setDefaultPaymentMethod(for: subscriberID, paymentID: generatedPaymentID) + return setDefaultPaymentMethod(for: subscriberID, paymentID: generatedPaymentID) // Select subscription level }.then(on: .sharedUserInitiated) { _ -> Promise in @@ -498,7 +513,11 @@ public class SubscriptionManager: NSObject { throw OWSGenericError("Transaction chain cancelled") } - return setSubscription(for: subscriberID, subscription: subscription, currency: currencyCode) + return setSubscription( + for: subscriberID, + subscription: subscription, + currencyCode: currencyCode + ) // Report success and dismiss sheet } @@ -525,7 +544,7 @@ public class SubscriptionManager: NSObject { } } - private class func createPaymentMethod(for subscriberID: Data) throws -> Promise { + private class func createPaymentMethod(for subscriberID: Data) -> Promise { let request = OWSRequestFactory.subscriptionCreatePaymentMethodRequest(subscriberID.asBase64Url) return firstly { networkManager.makePromise(request: request) @@ -553,7 +572,10 @@ public class SubscriptionManager: NSObject { } } - private class func setDefaultPaymentMethod(for subscriberID: Data, paymentID: String) throws -> Promise { + private class func setDefaultPaymentMethod( + for subscriberID: Data, + paymentID: String + ) -> Promise { let request = OWSRequestFactory.subscriptionSetDefaultPaymentMethodRequest(subscriberID.asBase64Url, paymentID: paymentID) return firstly { networkManager.makePromise(request: request) @@ -565,14 +587,21 @@ public class SubscriptionManager: NSObject { } } - private class func setSubscription(for subscriberID: Data, - subscription: SubscriptionLevel, - currency: String) -> Promise { + private class func setSubscription( + for subscriberID: Data, + subscription: SubscriptionLevel, + currencyCode: Currency.Code + ) -> Promise { let subscriberIDURL = subscriberID.asBase64Url let key = Cryptography.generateRandomBytes(UInt(32)).asBase64Url let level = String(subscription.level) - let request = OWSRequestFactory.subscriptionSetSubscriptionLevelRequest(subscriberIDURL, level: level, currency: currency, idempotencyKey: key) + let request = OWSRequestFactory.subscriptionSetSubscriptionLevelRequest( + subscriberIDURL, + level: level, + currency: currencyCode, + idempotencyKey: key + ) return firstly { networkManager.makePromise(request: request) }.then(on: .global()) { response -> Promise in @@ -735,7 +764,9 @@ public class SubscriptionManager: NSObject { } } - public class func redeemReceiptCredentialPresentation(receiptCredentialPresentation: ReceiptCredentialPresentation) throws -> Promise { + public class func redeemReceiptCredentialPresentation( + receiptCredentialPresentation: ReceiptCredentialPresentation + ) -> Promise { let expiresAtForLogging: String = { guard let result = try? receiptCredentialPresentation.getReceiptExpirationTime() else { return "UNKNOWN" } return String(result) @@ -788,7 +819,7 @@ public class SubscriptionManager: NSObject { var lastKeepAliveHeartbeat: Date? var lastSubscriptionExpiration: Date? var subscriberID: Data? - var currencyCode: String? + var currencyCode: Currency.Code? databaseStorage.read { transaction in lastKeepAliveHeartbeat = self.subscriptionKVS.getDate(self.lastSubscriptionHeartbeatKey, transaction: transaction) lastSubscriptionExpiration = self.subscriptionKVS.getDate(self.lastSubscriptionExpirationKey, transaction: transaction) @@ -826,10 +857,8 @@ public class SubscriptionManager: NSObject { } firstly(on: .sharedBackground) { - // Post subscriberID, if it exists - try self.postSubscriberID(subscriberID: subscriberID) + self.postSubscriberID(subscriberID: subscriberID) }.then(on: .sharedBackground) { - // Fetch current subscription self.getCurrentSubscriptionStatus(for: subscriberID) }.done(on: .sharedBackground) { subscription in guard let subscription = subscription else { @@ -955,7 +984,10 @@ extension SubscriptionManager { return subscriberCurrencyCode } - public static func setSubscriberCurrencyCode(_ currencyCode: String?, transaction: SDSAnyWriteTransaction) { + public static func setSubscriberCurrencyCode( + _ currencyCode: Currency.Code?, + transaction: SDSAnyWriteTransaction + ) { subscriptionKVS.setObject(currencyCode, key: subscriberCurrencyCodeKey, transaction: transaction)