Система бронирования транзакций Firebase - PullRequest
1 голос
/ 27 мая 2020

Я создаю систему бронирования с использованием firebase. Пользователь может выбрать количество мест, и я хочу записать их в свой документ. Выбранные места находятся внутри массива, и они являются объектами, например:

    {
      reservationId: 'id', 
      selectedSeats: [{"x": 0, "y": 0,},
                      {"x": 1, "y": 0,},
                      {"x": 2, "y": 0,}]
    }

Я хочу убедиться, что ни один другой пользователь не сможет записывать в базу данных хотя бы одно такое же место с транзакциями.

let transaction = db.runTransaction(t => {
  return t.get(venueId)
    .then(doc => {
      //I need to get all the objects inside the document and check their array of reservations.
      t.set(venueId, {reservation});
    });
}).then(result => {
  console.log('Transaction success!');
}).catch(err => {
  console.log('Transaction failure:', err);
});

Как я могу сделать транзакцию неудачной, если место найдено в массиве каждого объекта внутри документа?

1 Ответ

1 голос
/ 27 мая 2020

Вы можете использовать array-contains-any для проверки, есть ли какие-либо из ваших мест, уже зарезервированных в базе данных, и вернуть успешное или неудачное обещание в зависимости от результатов, также вам необходимо создать ссылку на пустой документ вне транзакции перед вы можете создать документ внутри него, вот как он может выглядеть:

//reference to a document that still does not exists
var docRef = db.collection(reservation).doc()
let transaction = db.runTransaction(t => {
  return t.get(venueId)
    .then(doc => {
      db.collection('reservation')
        .where('selectedSeats', 'array-contains-any', reservation.selectedSeats)
        .get()
        .then(snapshot =>{
            if (snapshot.empty) {
                t.set(docRef, {
                    uid: venueId,
                    reservation: reservation
                });
                return Promise.resolve('Reservation Complete');
            }
            return Promise.reject('Seats already taken');
        })
    });
}).then(result => {
  console.log('Transaction success!');
}).catch(err => {
  console.log('Transaction failure:', err);
});

ПРИМЕЧАНИЕ : Как вы можете видеть в документации для array-contains-any , это предложение where будет ограничено 10 значениями в вашем массиве reservation.selectedSeats. Также я не уверен, нужно ли вам использовать venueId для получения пустого документа или нет, поскольку вы хотите использовать этот идентификатор, поэтому я рекомендую вам попробовать оба способа.

...