Вот моя структура данных:
folders(collection): {
folderA: {
members: { user123: { role: "author" } }
folders(collection): {
folderB: {
parent(reference): /folders/folderA
members: { userABC: { role: "author" } }
folders(collection): {
folderC: {
parent(reference): /folders/folderA/folders/folderB
fieldA: { content: 'x' }
}
}
}
}
}
}
users: {
user123 :{
name: John
}
userABC :{
name: Bob
}
}
Моя цель - разрешить доступ к документу пользователю, который является членом любого из родителей выше запрашиваемого в данный момент документа.Надежда состоит в том, чтобы разрешить доступ к fieldA обоим user123 (Джон) и userABC (Bob) без написания правил, специфичных для folderA, folderB иfolderC .Идея заключается в том, что потенциально могут быть папки глубиной не менее 20.
Хотя я знаю, что функции правил ограничены, я бы хотел написать правила для этого случая:
match /databases/{database}/documents {
match /{path=**} {
allow get: if resource.data.members[request.auth.uid].role == 'author';
allow get: if isParentAuthor(resource);
function isParentAuthor(resource){
if(exists(resource.data.parent) {
if( get(resource.data.parent.path).data.members[request.auth.uid].role == 'author' ) {
return true;
} else {
return isParentAuthor( get(resource.data.parent.path) );
}
} else {
return false
}
}
}
}
Сейчас у меня есть много уровней глубокого доступа к папкам, жестко закодированным в моих правилах.Но было бы здорово иметь возможность сделать это рекурсивно.Это возможно?Я знаю, что это создаст ситуацию, когда потенциально может быть довольно много запросов документов, но я думаю, что я в целом согласен с этим.Но, может быть, есть более удобный Firebase-y способ справиться с этим с меньшим количеством запросов?