Как мога да проверя стойностите на съществуващи данни с неизвестни ключове в правило на Firebase?

Използвайки правилата за сигурност на Firebase, как мога да проверя стойностите на братя, за да определя дали newData е валиден или не?

В моето приложение всяко game има списък от moves. Тук играта е 1405584062293:

http://i.imgur.com/Eu4B1Qt.png

Когато се изпрати нов ход, искам да го потвърдя с позоваване на ходовете, които вече са изиграни. Като за начало играчът трябва да може да играе само всеки втори ход (първи играч може да играе четни ходове, започвайки от индекс 0, втори играч може да играе нечетни ходове).

Тъй като ключът на всеки ход е неизвестен случаен низ (съгласно тази препоръка в документите) Не знам как да проверя предишния ход. Също така не знам как да преброя броя на съществуващите ходове.

Ето моята структура:

{
  "rules":{
    ".read":true,
    "games":{
      "$game":{
        "moves":{
          "$move":{
            ".write":"auth !== null",
            // Something along these lines would get me going...
            ".validate":"data.parent().keys.count % 2 == 0"
          }
        }
      }
    }
  }
}

В действителност правилата на играта са много по-сложни и очаквам, че ще трябва да използвам Firesafe или подобно решение, но засега бих искал да знам как да постигна тези и други подобни прости правила.


person doctororange    schedule 18.07.2014    source източник


Отговори (2)


Не всеки случай на употреба може да се впише в един препоръчан подход за управление на общи списъци. Със сигурност не твоя. Вероятно бихте намерили повече приложение в подхода с нарастващ идентификатор.

Тъй като не можете да правите съдържа върху ключове/стойности на дъщерен запис, ще поддържате стойност, която може да се увеличава. Например, използвайки горния подход с инкрементален ID, след това бих могъл да напиша правило за сигурност, за да се уверя, че пиша на странни ключове (и само на свой ред), както следва:

".validate": "((root.child('counter').val()||0)+1) % 2 === root.child('users').child(auth.uid).child('evenOrOdd').val()"
person Kato    schedule 19.07.2014
comment
Благодаря за съдействието! Всъщност в крайна сметка реших проблема си, като просто избрах идентификаторите на ходовете (move-0, move-1, move-2...) и тъй като е разумно да се предположи, че играчите ще имат пълния списък с ходове за дадена игра, няма нужда от брояч . Сега всичко работи. - person doctororange; 23.07.2014

Докато не отменяте ходове (напр. премахвате ходове от списъка във Firebase), няма нищо лошо да го съхранявате като масив (imo).

Проблеми възникват, ако премахнете елемент от масив, защото тогава число в индексите ще бъде пропуснато и Firebase вече не го вижда като масив, а като обект с числа за ключове.

person ArneHugo    schedule 19.07.2014
comment
Има няколко причини, поради които масивите може да са лоши избори и това включва всички данни, редактирани едновременно от множество потребители. Не е толкова просто, колкото никога да не изтривате. - person Kato; 19.07.2014