У нас есть решение SaaS для спортивных залов и фитнеса.
Есть 3 плана, и каждый спортзал подписан на один. Первый план допускает до 50 участников и является бесплатным, второй от 50 до 500 участников и стоит $ x, а третий 500+ участников и $ y. Планы и количество членов, которые они разрешают, хранятся в коллекции в Firestore.
У нас есть правила безопасности Firestore, которые блокируют запросы с количеством участников, превышающим допустимое в плане. Это потому, что тренажерный зал может перейти на второй план и добавить 150 участников, а затем понизиться до бесплатного. В этом случае можно запросить только 50 членов еще раз.
Несмотря на то, что правило безопасности работает как брелоки, нам не ясно, как правильно реализовать это в клиенте. Клиент является веб-сайтом Vue.js. После загрузки веб-сайта члены спортзала запрашиваются из Firestore и сохраняются в Vuex. При запросе больше, чем разрешено, имеется сообщение о недостаточном разрешении, которое вполне ожидаемо.
Проблема связана с лимитом на запрос пожарного депо на стороне клиента. Количество разрешенных участников соответствует плану, на который подписан тренажерный зал, который хранится в Firestore. Похоже, мы должны запросить это, прежде чем мы просим членов тренажерных залов. Итак, нам нужно: 1. имя плана тренажерного зала; 2. пособие для участников плана, а затем 3. члены спортзала.
Мы довольно скептически относимся к этому, так как он требует 3 запроса на что-то, что должно быть простым. Мы не возражаем против стоимости запроса, а скорее за счет ожидания 3 запросов туда и обратно.
`let membersLimit = this.$store.state.stripePlans[this.$store.state.gymProfilePrivate.stripePlan].membersCount
firestore.collection('_gyms').doc(gymId).collection('_members')
.limit(membersLimit)
.onSnapshot(docs => {
let members = []
docs.forEach(doc => {
let member = doc.data()
members.push(member)
this.$store.commit('updateGymMembers', members)
})
//do stuff with members
})`
Вещи, которые мы рассматриваем до сих пор.
- Запросить первые 50 участников, которые всегда разрешены, и когда и если планы обновляются, запросить общее количество участников в плане тренажерных залов
- Дождитесь планов и информации о плане в спортзале, а затем попросите участников в спортзале
- Создать облачную функцию для запроса участников спортзала и запретить доступ к участникам спортзала со стороны клиента