Как структурировать данные в Firebase, созданные одним пользователем, но доступные пользователям в группе?

Итак, предположим, у меня есть такие данные:

{ 
  "events" : { 
   "s0d980983s" : 
    { creator: "bob@bob.com",
      text: "Bob says 'My name is Robert'" },
   "kjl34jl234j" : 
    { creator: "fred@fred.com",
      text: "Fred says 'My name is Fredrick'" }
  }
  "users" : { 
   "bob@bob.com" : { "paid": true },
   "fred@fred.com" : { "paid": false }
  }
}

Я предполагаю, что это правильный способ структурировать данные. При создании данных я использую push()метод для создания нового ключа для данных, а затем сохраняю создателя данных внутри него.

Я хотел бы сделать так, чтобы:

  • Я могу позволить любому из группы пользователей получить доступ к определенным данным (и запретить другим, очевидно).
  • Запрос «оптимизирован», то есть если у меня есть тысячи записей, я не повторяю все данные.

Более конкретно, например, я lizzie@lizzie.comхочу иметь возможность видеть s0d980983s.

Я не понимаю, как структурировать данные и как должны выглядеть мои правила Firebase.

Будет ли это что-то вроде этого?

{ "events" : { 
  "s0d980983s" : 
    { creator: "bob@bob.com",
      viewers: { "bob@bob.com": true,
                 "lizzie@lizzie.com" : true },
      text: "Bob says 'My name is Robert'" },
 ...
}

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

var ref = firebase.database().ref( "events/*/viewers/lizzie@lizzie.com" ).on(...);

Хочу ли я также ссылаться на события в таблице пользователи? Я не уверен, что понимаю, как сгладить данные (денормализовать их) и сохранить ссылки в обоих местах для поддержки такого запроса. Следует ли ожидать выполнения нескольких запросов, в которых я сначала получаю список событий, хранящихся в пользовательском объекте, а затем извлекаю их по одному, используя их ключ? Но, как я могу поместить эту логику в мои правила огневой базы?

1 ответ

  1. { "events" : { 
          "s0d980983s" : 
          { creator: "bob@bob.com",
            viewers: { "[insert bobs id]": true,
                        "[insert liz id]" : true 
                     },
          text: "Bob says 'My name is Robert'" },
          ...
    }
    

    На основе вышеуказанной структуры, как вы предложили, и если вы используете аутентификацию firebase для аутентификации вашего пользователя, вы можете добавить другое правило «чтения» или «записи» для проверки того, находится ли этот пользователь в списке ваших «зрителей». что-то вроде:

    {
      "rules": {
        "users": {
          "$uid": {
            ".write": "auth != null && 
              root.child('users').child(auth.uid).child('viewers').child(auth.uid).val() == 
              true"
          }
        }
      }
    }
    

    Это должно помочь. установка правил безопасности firebase в местоположении / узле