topic studio receive notification name integrar google default_notification_icon data configurar android firebase firebase-database google-cloud-functions

android - studio - La función Firebase Cloud se activa dos veces en la actualización



push notification android firebase (1)

Si desea actualizar el monto del saldo solo cuando agrega detalles de pago, puede usar el desencadenador onCreate directamente en los detalles del pago.

Pruebe algo como eso (debe actualizar el código para su 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 }); });

(Use la transacción para administrar modificaciones simultáneas)

Documentación de transacciones

NOTA

Por favor, use directamente un Número para su cantidad de datos, no una Cadena .

ACTUALIZAR

Agregue esta función para administrar la actualización:

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

Tengo las siguientes reglas establecidas para mi firebase collection - payments

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

y debajo de la función de nube escrita para manejar ciertas actualizaciones en esa colección:

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

Es simple, cada vez que agrego detalles de un pago, quiero actualizar el balanceAmount . El problema aquí es que cada vez que se produce una actualización en esa colección, la función se desencadena dos veces . La primera vez es obvio desde la aplicación y la segunda vez es debido a paymentRef.set(payment); línea.

¿Hay alguna forma posible de evitar este segundo desencadenante de la función en la nube? No puedo usar ningún indicador en el nivel de collection ya que la actualización de los detalles de pago ocurre varias veces. ¿Alguien puede guiarme en la dirección correcta en esto?

EDITAR

Nota: Tengo una opción de edición para los detalles de pago ingresados.