115 lines
3.7 KiB
Swift
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)
|
|
}
|
|
}
|
|
}
|