Збережіть лічильник під час переходу - та використовуйте перевірку для його виконання. Я зламав це разом - за те, що я мав підрахунок унікальних голосів і підрахунків, які продовжують з'являтися! Але цього разу я перевірив свою пропозицію! (незважаючи на помилки вирізання / вставки!).
Тут є «хитрість» - використовувати пріоритет вузла для підрахунку голосів ...
Дані:
голос / $ проблема
,"vote": {
".read" : true
,".write" : true
,"$issue" : {
"user" : {
"$user" : {
".validate" : "!data.exists() &&
newData.val()==data.parent().parent().child('count').getPriority()+1 &&
newData.val()==newData.GetPriority()"
Користувач може проголосувати лише один раз, коли && підрахунок повинен бути на один вищий, ніж поточне значення для підрахунку &&, а дані повинні бути такими, як пріоритетні.
}
}
,"count" : {
".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
newData.getPriority()==data.getPriority()+1 "
}
підрахунок (насправді останній виборця) - голосування повинно існувати, а його кількість рівний новому рахунку, а & newcountcount (пріоритет) може збільшитися лише на один.
}
}
Тестовий сценарій, щоб додати 10 голосів різних користувачів (для цього прикладу, підроблений ідентифікатор, повинен користувач auth.uid у виробництві). Відлічіть число (i--) 10, щоб побачити помилку перевірки.
<script src='https://cdn.firebase.com/v0/firebase.js'></script>
<script>
window.fb = new Firebase('https:...vote/iss1/');
window.fb.child('count').once('value', function (dss) {
votes = dss.getPriority();
for (var i=1;i<10;i++) vote(dss,i+votes);
} );
function vote(dss,count)
{
var user='user/zz' + count; // replace with auth.id or whatever
window.fb.child(user).setWithPriority(count,count);
window.fb.child('count').setWithPriority(user,count);
}
</script>
Тут "ризик" полягає в тому, щоб голосувати було подано, але підрахунок не був оновлений (злом або помилка сценарію). Ось чому голоси мають унікальний "пріоритет" - сценарій повинен починатись із забезпечення того, щоб голосування не було з пріоритетом вище поточного підрахунку, якщо він є, слід завершити цю операцію, перш ніж зробити її самостійно - приберіть своїх клієнтів на прибирання за вас :)
Перш ніж почати, підрахунок потрібно ініціалізувати з пріоритетом - forge не дозволяє цього робити, тому потрібен сценарій заглушки (до того, як перевірка буде активна!).