Правила Firebase (firestore): обеспечить обновление только при обновлении другого документа (увеличение FieldValue)? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь создать документ 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.

1 Ответ

1 голос
/ 20 сентября 2019

В правилах безопасности Firebase невозможно узнать, изменился ли какой-либо произвольный документ в коллекции одновременно с другим документом.Вы должны знать полные пути всех документов в пакетной записи, чтобы увидеть, изменились ли они последовательно.

...