В сценарии, когда продукт уже находится в корзине, а пользователь вводит номер кредитной карты и вводит одноразовый пароль, этот процесс может занять несколько секунд или даже минут, когда может произойти что угодно, например, администратор удалил этот продукт. И если платеж успешен, запускается набор функций, таких как обновление уровня запасов продукта, добавление заказа в историю покупок пользователя и т. Д. c. Для этой операции я использую пакетную запись. Однако, когда продукта больше нет в базе данных, он воссоздает продукт, содержащий поле уровня запасов. Не могли бы вы порекомендовать способ предотвратить эту ошибку? подходит ли для этой операции пакетная запись?
// Update item stocklevel
var newVar = String()
var newIds = [String:Any]()
for (key, value) in itemsDict {
let newValue = value as! [String:Any]
let newId = newValue[kITEMID] as! String
newVar = newValue[kVARIATIONKEY] as! String
let newQty = newValue[kQUANTITY] as! Int
for i in 0..<self.allItems.count {
let newVars = self.allItems[i].variations!
let newKey = self.allItems[i].varKey!
let filteredVars = newVars.filter({$0.key == String(newKey)})
for (_, value) in filteredVars {
guard let resultNew = value as? [String:Any] else { return }
let stock = resultNew[kSTOCK] as! Int
let newStock = stock - newQty
let anyDict = [newVar:[kSTOCK:newStock]] as [String:Any]
updateStock = [newId: [kVARIATIONS:anyDict]] as [String:Any]
newIds.updateValue(updateStock, forKey: key)
}
}
}
let batch = Firestore.firestore().batch()
for (_, value) in newIds {
let newValue = value as! [String:Any]
for (k1, v1) in newValue {
let newV1 = v1 as! [String:Any]
// update stock level
batch.setData(newV1, forDocument: FirebaseReference(.Items).document(k1), merge: true)
}
}
// add to users purchase history
batch.setData(purchaseHistory, forDocument: ref2!, merge: true)
// add to all orders list
batch.setData(newAllOrders, forDocument: ref3!, merge: true)
if oneTimeUse {
if let newVoucherId = voucherId {
let withValues = [kCLAIMEDBY: [MUser.currentUser()!.objectId]]
ref4 = FirebaseReference(.Voucher).document(newVoucherId)
// update voucher
batch.setData(withValues, forDocument: ref4!, merge:true)
}
}
self.showLoadingIndicator()
batch.commit { (err) in
if let err = err {
print("There's an error with your order, please try again \(err.localizedDescription)")
} else {
print("successfully commited batch")
self.finalProcess(transactionId, paymentOption) {
}
}
}