GOOGLE ADS

domingo, 17 de abril de 2022

Firebase: use el convertidor en la transacción con Firestore

Estoy tratando de usar un convertidor de datos de Firestore dentro de una transacción en la que agrego un registro a una colección ( entries) y actualizo un contador en otra colección ( users). Sin embargo, no puedo entender cómo usar el convertidor dentro de una transacción y no he podido encontrar ningún ejemplo. Si bien los documentos de Firebase suelen ser excelentes, parecen quedarse cortos con respecto a las transacciones.

// Add new entry and increment user entry counter
async addEntry(entry: Entry): Promise<void> {
const entryRef = db.collection("entries").doc(entry.id);
const userRef = db.collection("user").doc(entry.userId);
await db.runTransaction(async (transaction) => {
// NOTE: Cannot use converter with transaction???
await transaction.set(entryRef, entry).withConverter(entryConverter);
// QUESTION: Is this a proper use of "increment" (ie. inside a transaction)?
await transaction.update(userRef, { entries: FieldValue.increment(1) });
});
}

Así es como se vería sin la transacción y usando un convertidor (pero necesito la transacción).

await db.collection("entries")
.doc(entry.id)
.withConverter(entryConverter)
.set(entry);
await db.collection("users")
.doc(entry.userId)
.update({ entries: FieldValue.increment(1) });

¿Cómo puedo realizar de manera segura estas dos operaciones en una transacción mientras uso un convertidor para los nuevos datos?


Solución del problema

De hecho, esto no está documentado, pero puede configurar el convertidor fuera de la transacción y antes de especificar un documento, ya que el convertidor se está aplicando a la colección y debería funcionar. Entonces algo como:

async addEntry(entry: Entry): Promise<void> {
const entryRef = db.collection("entries").withConverter(entryConverter).doc(entry.id);
const userRef = db.collection("user").doc(entry.userId);
await db.runTransaction(async (transaction) => {
await transaction.set(entryRef, entry);
await transaction.update(userRef, { entries: FieldValue.increment(1) });
});
}

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...