Я пытаюсь создать документ stats
внутри коллекции, и я хочу разрешить его обновление только тогда, когда другой документ обновляется внутри этой же коллекции (вкратце, пакетная запись).Есть ли способ обеспечить обновление другого документа во время этого запроса?
Причина, по которой я даже думаю о разрешении на стороне клиента , связана с этим источником: Keepколичество документов в коллекции .
Есть ли лучший способ получить количество документов?(Мне все равно, если это фактический вызов REST API, а не через SDK).
Я проверяю, правильно ли обновлены stats
на основе данных запроса, полученных на этом другом документе (private)=> публично, публично => приватно, создано, удалено ...), так как я знаю точный путь для stats
документа, , очевидно .
Но я понятия не имею, как обеспечить, чтобы stats
мог обновляться только тогда, когда / если другой документ делает это ( помимо очевидного, где я передаю идентификатор этого документа вместе с ).
Краткая версия моих правил:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
match /stories/---STATS--- {
allow read;
allow create, update;
}
match /stories/{storyId} {
allow read: if isPublic() || isAuthor();
allow create: if
isSignedIn() &&
updatedStats() &&
validateCreate();
function updatedStats() {
return getAfterStats().updatedAt == request.time;
}
function validateCreate() {
return
( // Created public
new().public &&
isIncreaseN() &&
isIncreaseNAll()
) ||
( // Created private
!new().public &&
isUntouchedN() &&
isIncreaseNAll()
);
}
// COUNTERS
function isStats() {
return exists(/databases/$(database)/documents/stories/---STATS---);
}
function getStats() {
return get(/databases/$(database)/documents/stories/---STATS---).data;
}
function getAfterStats() {
return getAfter(/databases/$(database)/documents/stories/---STATS---).data;
}
// n
function isIncreaseN() {
return (!isStats() && getAfterStats().n == 1) ||
(!getStats().keys().hasAll(['n']) && getAfterStats().n == 1) ||
(getStats().n +1 == getAfterStats().n);
}
function isUntouchedN() {
return (!isStats() && !getAfterStats().keys().hasAll(['n'])) ||
(!getStats().keys().hasAll(['n']) && !getAfterStats().keys().hasAll(['n'])) ||
(getStats().n == getAfterStats().n);
}
// nAll
function isIncreaseNAll() {
return (!isStats() && getAfterStats().nAll == 1) ||
(!getStats().hasAll(['nAll']) && getAfterStats().nAll == 1) ||
(getStats().nAll +1 == getAfterStats().nAll);
}
}
}
// GETTERS
function new() {
return request.resource.data;
}
function cur() {
return resource.data;
}
function auth() {
return request.auth;
}
// MISC
function isSingedIn() {
return auth() != null;
}
У меня есть еще несколько правил проверки для файла stats
, например, разрешено существование только определенных полей, допускается только увеличение / уменьшение на 1 и т. Д., Но ничегочтобы на самом деле предотвратить увеличение этого, даже если не касаться каких-либо фактических story
.