Ограничение не премиум-пользователей писать в базу данных Firebase только один раз в день - PullRequest
0 голосов
/ 28 января 2019

Я хочу ограничить количество моих не премиум-пользователей только одной публикацией в день.Премиум-пользователи не имеют ограничений.Мне неясно, как настроить правила моей базы данных.На данный момент я могу только добавлять в базу данных только проверенных пользователей. примечание Я хочу написать в узел AddPost

Моя база данных Json выглядит следующим образом:

User :
   uid:
      verified : true
      premium : false

И мои правила:

{
  "rules": {
  "AddPost": {
     ".read": "auth != null",
      ".write": 
"root.child('Users').child(auth.uid).child('verified').val() == true"
 }  
    ,"Users": {
      ".read": "auth != null",
        ".write": "auth != null"
    }
    ,"FavoritedBusinesses": {
      ".read": "auth != null",
        ".write": "auth != null"
    }
    ,"Geolocs": {
       ".read": "auth != null",
        ".write": "auth != null"
    }
    ,"ReviewPost": {
      ".read": "auth != null",
      ".write": "auth != null"
    }
     ,"Views": {
      ".read": "auth != null",
      ".write": "auth != null"
    }

   }


}

МОЕ РЕШЕНИЕ Итак, используя руководство Фрэнкса, я смог объединить некоторые правила.В качестве базового правила каждый пользователь должен быть проверен, поэтому я помещаю это в условие «validate» как его общий знаменатель. Затем в первой записи мы проверяем, является ли пользователь премиальным, если он возвращает false, тогда мы проверяем последнее.отметка времени от той, которую мы сохранили в последнем посте.Тем не менее, если первое условие не выполняется, это означает, что пользователь имеет премию и ему должно быть разрешено публиковать ..

новые правила базы данных

".write": "root.child('Users').child(auth.uid).child('premium').val() 
=== false && (newData.parent().child('Users').child(auth.uid).child('lastPostStamp').val() === now) && (newData.parent().child('Users').child(auth.uid).child('lastPostStamp').val() > root.child('Users').child(auth.uid).child('lastPostStamp').val() + 24*60*60*1000) || root.child('Users').child(auth.uid).child('premium').val() === true ",
        ".validate": "root.child('Users').child(auth.uid).child('verified').val() === true"

1 Ответ

0 голосов
/ 28 января 2019

Как прокомментировал Дуг, это возможно:

  • Требуя, чтобы каждый раз, когда пользователь пишет сообщение, он также записывал метку времени в известное место (скажем, /Users/$uid/last_post_timestamp).
  • Проверка того, что они могут писать только ServerValue.TIMESTAMP в это местоположение.
  • Проверка того, что они могут писать только новое сообщение, когда текущее значение в /Users/$uid/last_post_timestamp по крайней мере один день назад.

Так что вам нужно что-то вроде этого в правилах для нового поста:

(newData.parent().child('Users').child(auth.uid).child('last_post_timestamp').val()
   === now) && 
(newData.parent().child('Users').child(auth.uid).child('last_post_timestamp').val()
   > root.child('Users').child(auth.uid).child('last_post_timestamp').val() + 24*60*60*1000)
...