Проблема с пакетной записью при обновлении данных, которых больше нет в базе данных Firestore - iOS Swift - PullRequest
0 голосов
/ 07 мая 2020

В сценарии, когда продукт уже находится в корзине, а пользователь вводит номер кредитной карты и вводит одноразовый пароль, этот процесс может занять несколько секунд или даже минут, когда может произойти что угодно, например, администратор удалил этот продукт. И если платеж успешен, запускается набор функций, таких как обновление уровня запасов продукта, добавление заказа в историю покупок пользователя и т. Д. 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) {

            }


        }

    }

1 Ответ

1 голос
/ 07 мая 2020

Я бы рекомендовал вам использовать Транзакции для этих операций, которые вы выполняете, и цитируя документацию

«Транзакция состоит из любого количества операций get (), за которыми следует любое число операций записи, таких как set (), update () или delete (). В случае одновременного редактирования Cloud Firestore снова запускает всю транзакцию. Например, если транзакция читает документы, а другой клиент изменяет любой из этих документов , Cloud Firestore повторяет транзакцию. Эта функция гарантирует, что транзакция будет выполняться с использованием актуальных и согласованных данных ".

Это поможет вам предотвратить этот сценарий ios, когда продукта больше нет в наличии, и вы можете отобразить / отправить сообщение пользователю, который интересовался этим продуктом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...