Files

115 lines
3.7 KiB
Swift

//
// 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)
}
}
}