Я хотел бы знать, возможно ли избежать ограничения глубины вызова функций правил безопасности Firestore для моего следующего кода.
Что считается функцией?Просто мой собственный созданный или тоже что-то вроде size()
?
function isValidItem(data, item) {
return
( // Person
data.items[item].keys().hasAll(['image','type','name','job','age','party','experience'])
&& data.items[item].image.size() >= 1 && data.items[item].image.size() <= 200
&& data.items[item].type.size() >= 5 && data.items[item].type.size() <= 10
&& data.items[item].name.size() >= 1 && data.items[item].name.size() <= 50
&& data.items[item].job.size() >= 1 && data.items[item].job.size() <= 50
&& data.items[item].party.size() >= 1 && data.items[item].party.size() <= 50
&& data.items[item].experience.size() >= 1 && data.items[item].experience.size() <= 50
&& data.items[item].age.matches('^[0-9]+$')
)
||
( // Party
data.items[item].keys().hasAll(['image','type','name','orientation','experience','promi'])
&& data.items[item].image.size() >= 1 && data.items[item].image.size() <= 200
&& data.items[item].type.size() >= 5 && data.items[item].type.size() <= 10
&& data.items[item].name.size() >= 1 && data.items[item].name.size() <= 50
&& data.items[item].orientation.size() >= 1 && data.items[item].orientation.size() <= 50
&& data.items[item].experience.size() >= 1 && data.items[item].experience.size() <= 50
&& data.items[item].promi.size() >= 1 && data.items[item].promi.size() <= 50
);
}
function itemsAreValid(data) {
return data.items.size() >= 1
&& data.items.size() <= 10
&& isValidItem(data, 0)
&& (data.items.size() < 2 || isValidItem(data, 1))
&& (data.items.size() < 3 || isValidItem(data, 2))
&& (data.items.size() < 4 || isValidItem(data, 3))
&& (data.items.size() < 5 || isValidItem(data, 4))
&& (data.items.size() < 6 || isValidItem(data, 5))
&& (data.items.size() < 7 || isValidItem(data, 6))
&& (data.items.size() < 8 || isValidItem(data, 7))
&& (data.items.size() < 9 || isValidItem(data, 8))
&& (data.items.size() < 10 || isValidItem(data, 9));
}
function isValidTitle(data) {
return data.title.size() >= 1
&& data.title.size() <= 200
}
function isAuthed() {
return request.auth.uid != null
&& request.auth.token.email_verified == true;
}
allow create, update:
if isAuthed()
&& request.resource.data.user == request.auth.uid
&& request.resource.data.status == "review"
&& isValidTitle(request.resource.data)
&& itemsAreValid(request.resource.data);