android - trigger - google cloud functions supported languages



La funzione Firebase Cloud si attiva due volte onUpdate (1)

Ho stabilito le seguenti regole per la mia firebase collection - payments

"payments": {
    "$paymentId": {
        "totalAmount": {
        },
        "balanceAmount": {
            ".validate": "newData.val()<=data.child('totalAmount').val()"
        },
        "paymentDetails": {
            "$detailId": {
                "amount": {
                    ".validate": "newData.isString()"
                },
            }
        },
    }
}

e sotto la funzione cloud scritta per gestire determinati aggiornamenti su quella raccolta:

exports.calculateBalance = functions.database
.ref('payments/{pushId}')
.onUpdate(event => {
    const paymentRef = event.data.adminRef;
    const payment = event.data.val();
    return paymentRef.once('value').then(snapshot => {
        var paidAmount = 0;
        snapshot.child("paymentDetails").forEach(function(child) {
            paidAmount += parseFloat(child.child("amount").val());
        });
        return paidAmount;
    }).then(snap => {
        payment.balanceAmount = parseFloat(payment.totalAmount) - snap;
        return paymentRef.set(payment);
    })
});

È semplice, ogni volta che aggiungo un dettaglio di pagamento, voglio aggiornare il balanceAmount . Il problema qui è che ogni volta che si verifica un aggiornamento in quella raccolta, la funzione si attiva due volte . La prima volta è ovvio dalla domanda e la seconda volta è a causa di paymentRef.set(payment); linea.

C'è un modo possibile per evitare questo secondo trigger sulla funzione cloud? Non riesco a utilizzare alcun indicatore a livello di collection poiché l'aggiornamento sui dettagli di pagamento avviene più volte. Qualcuno può guidarmi nella giusta direzione su questo?

MODIFICARE

Nota: ho un'opzione di modifica per i dettagli di pagamento inseriti.


Se si desidera aggiornare l' importo del saldo solo quando si aggiungono i dettagli del pagamento, è possibile utilizzare il trigger onCreate direttamente sui dettagli del pagamento.

Prova qualcosa del genere (devi aggiornare il codice per il tuo caso):

exports.calculateBalance = functions.database.ref('payments/{pushId}/paymentDetails/{detailId}').onCreate(event => {
    var paymentRef = event.data.adminRef.parent.parent;
    var paymentDetailSnapshot = event.data;
    var paymentDetailAmountSnapshot = paymentDetailSnapshot.child('amount');

    return paymentRef.child('balanceAmount').transaction(current => {
        return current - paymentDetailAmountSnapshot.val(); // Balance can be negative
    });
});

(Utilizzare la transazione per gestire modifiche simultanee)

Documentazione delle transazioni

NOTA

Per favore, usa direttamente un numero per i tuoi dati di quantità, non una stringa .

AGGIORNARE

Aggiungi questa funzione per gestire l'aggiornamento:

exports.recalculateBalance = functions.database.ref('payments/{pushId}/paymentDetails/{detailId}').onUpdate(event => {
    var paymentRef = event.data.adminRef.parent.parent;

    var paymentDetailSnapshot = event.data;
    var previousPaymentDetailSnapshot = event.data.previous;

    var paymentDetailAmountSnapshot = paymentDetailSnapshot.child('amount');
    var previousPaymentDetailAmountSnapshot = previousPaymentDetailSnapshot.child('amount');

    return paymentRef.child('balanceAmount').transaction(current => {
        return current + previousPaymentDetailAmountSnapshot.val() - paymentDetailAmountSnapshot.val(); // Balance can be negative
    });
});




google-cloud-functions