Я пытаюсь прослушать обновления любого документа пари, если так, добавленная сумма должна быть удалена с баланса пользователя.Следующий код делает это.Проблема в том, что это может занять до 2 секунд при обычной get и update операции, или как 7 - 10 секунд с транзакция .
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import {BetType} from './models/enums';
import {Bet} from './models/Bet';
type DocumentSnapshot = admin.firestore.DocumentSnapshot;
// const db = admin.firestore();
export const removeMoney = functions.firestore
.document('bets/{userId}')
.onWrite(async (change: functions.Change<DocumentSnapshot>, context) => {
const beforeSnapshot = change.before;
const afterSnapshot = change.after;
if(afterSnapshot && beforeSnapshot) {
const before: Bet = beforeSnapshot.data() as Bet;
const after: Bet = afterSnapshot.data() as Bet;
if (after && before) {
if (before.redAmount !== after.redAmount) {
await transform(before, after, BetType.red);
} else if (before.blackAmount !== after.blackAmount) {
await transform(before, after, BetType.black);
} else if (before.greenAmount !== after.greenAmount) {
await transform(before, after, BetType.green);
}
return "done";
}
}
return "It was a delete, no action taken";
});
async function transform(before, after, type: BetType = BetType.black) {
if(before && after) {
const amountBefore = before[type] ? before[type] : 0;
const diff = after[type] - amountBefore;
const user = (await after.user.get()).data();
await after.user.update({amount: user.amount - diff})
/*
db.runTransaction(transaction => transaction.get(after.user as DocumentReference)
.then(userDoc => {
const exists = userDoc.exists;
if (!exists) { return; }
const userData = userDoc.data();
if(!userData) { return; }
transaction.update(userDoc.ref, {amount: userData.amount - diff});
}))
.catch(console.error);
*/
}
}
Я просто не мог понять, почему это так медленно, есть идеи?