// // PurchaseVerifyPresenter.swift // OpenVPN // // Created by Zhandos Bolatbekov on 23.08.2021. // Copyright © 2021 Privado LLC. All rights reserved. // import Foundation import SwiftyStoreKit typealias PurchaseUpdateCheckCompletion = (Bool) -> Void final class PurchaseVerifyPresenter: PurchaseVerifyControllerOutput { private let interactor: PurchaseInteractorInput private weak var output: PurchaseVerifyModuleOutput? weak var viewInput: PurchaseVerifyControllerInput? private let logger: CometLogger private var processingProductId: String? init(interactor: PurchaseInteractorInput, output: PurchaseVerifyModuleOutput, logger: CometLogger) { self.interactor = interactor self.output = output self.logger = logger } // MARK: - PurchaseVerifyControllerOutput func viewIsReady() { self.processReceipt() } private func processReceipt() { self.viewInput?.showLoader(true) self.interactor.getReceipt { [weak self] result in guard let self = self else { return } switch result { case let .success(receipt): self.sendReceipt(receipt) case let .failure(error): self.viewInput?.showLoader(false) self.logger.event(name: PrivadoConstants.Event.purchase, attributes: ["method": "fetchReceipt", "error": "\(error.localizedDescription)"], secured: nil) self.output?.purchaseVerified(success: false) } } } private func sendReceipt(_ receipt: String) { guard let productId = self.processingProductId else { self.viewInput?.showLoader(false) self.logger.event(name: PrivadoConstants.Event.purchase, attributes: ["method": "sendReceipt", "error": "Not found: processingProductId"], secured: nil) self.output?.purchaseVerified(success: false) return } self.interactor.sendReceipt(receipt, for: productId) { [weak self] result in guard let self = self else { return } switch result { case .success: self.syncCustomer() case let .failure(error): self.viewInput?.showLoader(false) self.logger.event(name: PrivadoConstants.Event.purchase, attributes: ["method": "sendReceipt", "error": "\(error.localizedDescription)"], secured: nil) self.output?.purchaseVerified(success: false) } } } private func syncCustomer() { self.interactor.syncCustomer { [weak self] syncSuccess in guard let self = self else { return } if !syncSuccess { self.logger.event(name: PrivadoConstants.Event.purchase, attributes: ["method": "syncCustomer", "error": "failed"], secured: nil) } self.viewInput?.showLoader(false) self.output?.purchaseVerified(success: syncSuccess) } } } extension PurchaseVerifyPresenter: PurchaseVerifyModuleInput { func checkForUpdate(completion: @escaping PurchaseUpdateCheckCompletion) { self.interactor.checkForRenew { productId in self.processingProductId = productId completion(productId.isExist) } } }