Estoy tratando de disminuir la amount de campo que representa la cantidad de productos disponibles para la venta.
Mi base de datos está estructurada de la siguiente manera:
- Stock - StoreId - DepartmentId - ProductId + price + amount Mi storeId tiene un valor fijo y solo estoy recorriendo las variables DepartmentId y ProductId .
A continuación se muestra cómo creé una matriz de nodos o una matriz de niños para la transacción :
const childArray = []; depIds.forEach(depId => { const prodIds = groupedProducts[depId].reduce((acc, val) => [...acc, val.prodId], []); prodIds.forEach(prodId => { childArray.push(admin.database().ref("Stock") .child(storeId) .child(depId) .child(prodId) .child("amount") .once('value')); }); }); Cuando agrego la condición: amount > 0 , no pasa nada. Solo funciona cuando elimino la condición.
const snapshots = await Promise.all(childArray); snapshots.forEach(snapshot => { snapshot.ref.transaction(amount => { //if (amount) return amount + admin.database.ServerValue.increment(-1); if (amount > 0) return amount - 1; }) })Además, lo que realmente necesito es comparar la cantidad en la base de datos con la cantidad que proviene de la solicitud (llamémosla cantidad)
Para esto, tendría que recuperar la ruta actual para productId y departmentId . Pero como se muestra a continuación, snapshot.ref.parent no devuelve la ruta.
snapshots.forEach(snapshot => { snapshot.ref.transaction(amount => { //if (amount > 0 & amount >= qty) return amount + admin.database.ServerValue.increment(-qty); const productPath = snapshot.ref.parent; const departmentPath = snapshot.ref.parent.parent; // Get qty based on productPath and departmentPath if (amount > 0 & amount >= qty) return amount - qty; }) })Entonces, tengo tres preguntas:
Agradezco cualquier ayuda!
No necesita una transacción para esto. En cambio, una vez que conozca la ruta completa de los nodos para actualizar, puede usar increment() y luego usar reglas de seguridad para validar que el valor no sea inferior a 0.
Así que en código sería:
admin.database().ref("Stock") .child(storeId) .child(depId) .child(prodId) .update({ "amount", admin.database.ServerValue.increment(-1));Y luego en las reglas:
{ "rules": { "Stock": { "$storeId": { "$depId": { "$prodId": { "amount": { ".validate": "newData.val() >= 0" } } } } } } }