我试图在firestore中创建一个后端来管理可用性。我有一个employeeAvailability集合,其中包含每个员工的文档,每个员工都包含一个映射,其中键是为该员工预订的约会的开始时间。该数据用于在客户端生成用户可以选择预订的时间段(预约意味着该时间段不可用)。
employee12345 {
appointments = { "10:00 AM" : true,
"11:00 AM" : true,
"12:00 PM" : true,
"1:00 PM" : true,
"2:00 PM" : true
}
}
我想创建一个firestore规则,防止用户重复预订约会。当用户尝试预订下午1:00的时段时,在上面的示例中,我需要执行以下更新。
db.collection("employeeAvailability").document("employee12345").updateDate([
"appointments.1:00 PM": true
]) { err in
if let err = err {
print("Error updating document: (err)")
} else {
print("Document successfully updated")
}
}
我希望拒绝此事务,并且firebase错误显示类似"此约会时段已被预订"之类的内容。
显然,有客户端规则阻止人们选择已预订的时间段,但是有可能我可以让用户同时尝试预订相同的开放位置,并且我希望数据库通过接受第一个写而拒绝第二个写来处理这些竞争条件。
我希望数据库通过接受先写后拒。
然后您应该按照以下行使用事务:
const db = firebase.firestore();
const employeeDocRef = db
.collection('employeeAvailability')
.doc('employee12345');
const timeSlot = '1:00 PM';
db.runTransaction((transaction) => {
return transaction.get(employeeDocRef).then((employeeDoc) => {
const appointments = employeeDoc.get('appointments');
if (appointments.hasOwnProperty(timeSlot)) {
throw 'Slot already taken';
}
appointments[timeSlot] = true;
transaction.update(employeeDocRef, { appointments });
});
})
.then(() => {
console.log('Transaction successfully committed!');
})
.catch((error) => {
console.log('Transaction failed: ', error);
});