Я хочу запросить ссылку на документ, чтобы узнать, существует ли документ в данный момент. Если его не существует, я хочу написать новый документ по этой ссылке.
К сожалению, это не работает с моими правилами безопасности. Если документ уже существует, я хочу, чтобы только уполномоченные лица могли его просматривать. Мои правила выглядят так:
Правила Firestore
function getItemData(item){
return get(/databases/$(database)/documents/equipment/$(item)).data;
}
function getUserData(){
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data;
}
match /equipment/{item}{
allow create: if request.auth != null;
allow read: if !exists(/databases/$(database)/documents/equipment/$(item)) ||
getUserData().clientId == getItemData(item).clientId;
}
Структура документа
users > userId: {
clientId: "idhere"
}
equipment > item: {
clientId: "idhere",
serial: "serialnumber"
}
Мой нативный код реакции, в котором я выполняю запрос get
const docRef = firestore.collection("equipment").where('clientId', '==', clientId).where("serial", "==", serial);
docRef.get().then(doc => {
if(!doc.exists){
//add new item to existing document reference
}
}).catch(error => {
//Error here reads "Missing or insufficient persmissions"
})
Я могу читать предметы, если запрашиваю их напрямую. Однако, кажется, что мои функции where () противоречат правилам.
Кто-нибудь знает, почему это произойдет?
Редактировать: Если я изменю свое правило на это
match /equipment/{item}
allow read: if true
Я нахожу успех, поэтому я определенно подтвердил, что именно это правило вызывает мою проблему. При использовании симулятора я могу получить доступ к документу напрямую. Похоже, что где утверждения являются проблемой