Как проверить значения существующих данных с неизвестными ключами в правиле Firebase?

Вопрос:

Как использовать правила безопасности Firebase, как я могу проверить значения newData чтобы определить, действительно ли 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 или подобное решение, но сейчас я хотел бы знать, как достичь этих и других таких простых правил.

Лучший ответ:

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

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

".validate": "((root.child('counter').val()||0)+1) % 2 === root.child('users').child(auth.uid).child('evenOrOdd').val()"

Ответ №1

Пока вы не отменяете ходы (например, удаляете перемещения из списка в Firebase), нет ничего плохого в том, чтобы хранить его как массив (imo).

Проблемы возникают, если вы удаляете элемент из массива, потому что тогда число в индексах будет пропущено, а Firebase больше не будет рассматривать его как массив, а объект с номерами для ключей.

Оцените статью
TechArks.Ru
Добавить комментарий