Можно ли выполнить правила If Else или Switch Statement Firestore

Можно ли сделать оператор Switch или if else в правилах firestore?

Я пытался найти его, но не нашел ответа.

То, что я пробовал, было

function getTier() {
  return get(/users/$(request.auth.uid)).data.userTier;
}

function canAddProduct() {
  if getTier() == 'UserTier.FREE'
    // Do additional code 
    return doSomethingBasedOnFreeTier();
  else if getTier() == 'UserTier.SILVER'
    // Do additional code 
    return doSomethingBasedOnSilverTier()
  else if getTier() == 'UserTier.GOLD'
    // Do additional code 
    return doSomethingBasedOnGoldTier()
  else if getTier() == 'UserTier.COMPANY'
    // Do additional code 
    return doSomethingBasedOnCompanyTier()
}

Любая помощь будет принята с благодарностью.

if ... else заявления недействительны в правилах безопасности для Firestore. Но часто вы можете добиться того же результата с помощью другой конструкции, такой как подход, основанный на ||, который @denniskbijo показал в своем ответе. Если это не работает для вас, не забудьте указать цель правила в своем вопросе, так как сейчас оно читается как проблема XY.
Frank van Puffelen 28.05.2019 16:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
1 171
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Правила Firestore предназначены для определения правил доступа к конкретным коллекциям в вашем проекте. Они в основном используются для проверки доступа пользователя. Они не предназначены ни для чего, кроме проверки логики. Поэтому они не поддерживают операторы switch, условия if..else и условные выражения.

Вы можете использовать условие ИЛИ, чтобы проверить, может ли пользователь добавить продукт в соответствии с UserTier, к которому он принадлежит.

function canAddProduct() {
    return ( getTier() == 'UserTier.FREE' || getTier() == 'UserTier.SILVER' 
             || getTier() == 'UserTier.GOLD' || getTier() == 'UserTier.COMPANY' );
} 

Это самый простой способ проверки доступа.

Однако для вашего конкретного случая попробуйте это. Я предполагаю, что у вас есть дополнительные проверки пользователя в соответствии с уровнем, к которому он принадлежит. Здесь я проверяю, истек ли пробный период пользователя, только если он принадлежит к БЕСПЛАТНОМУ уровню.

function getUser() {
//Get the user
    return get(/users/$(request.auth.uid)).data;
}

function canAddProduct() {
    return ( getTier() == 'UserTier.FREE' && checkFreeTierAccess(getUser()) || 
             getTier() == 'UserTier.SILVER' && checkSilverTierAccess(getUser()) ||
             getTier() == 'UserTier.GOLD' && checkGoldTierAccess(getUser()) ||
             getTier() == 'UserTier.COMPANY' && checkCompanyTierAccess(getUser())
           );
 } 

function checkFreeTierAccess(user) {
//do the checks
    return user.isTrailPeriodExpired;
}

Надеюсь, это решит вашу проблему.

Не то, что я хочу делать. Я не хочу всегда возвращать true в getTier(). Я хочу, чтобы оператор case, такой как условие, позволял мне делать больше и разные условия на основе значения getTier().

Tinus Jackson 28.05.2019 12:25

Обновленный код, чтобы более или менее отражать то, что я хочу сделать

Tinus Jackson 28.05.2019 12:30

@TinusJackson, единственными допустимыми выходными значениями являются true и false, поэтому все, что вы хотите сделать, можно свести к AND и OR различных тестов. Для каждого UserTier, но все это в круглых скобках и ИЛИ их вместе, как Деннис показал выше - это делает то же самое.

Dan McGrath 29.05.2019 07:35

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

Dan McGrath 29.05.2019 07:36

Еще один прием, о котором следует знать, — это использование объектов. Мне потребовалось некоторое время, чтобы понять, что это возможно. Вы можете поместить свои различные случаи в объект и использовать ключи объекта в качестве переключателя.

function switchOnTier(tier) {
  return {
    'UserTier.FREE': doSomethingBasedOnFreeTier(),
    'UserTier.SILVER': doSomethingBasedOnSilverTier(),
    'UserTier.GOLD': doSomethingBasedOnGoldTier(),
    'UserTier.COMPANY': doSomethingBasedOnCompanyTier()
  }[tier]
}

Который вы затем можете использовать вот так.

return switchOnTier(getTier())

Я использую это для простого случая попытки перевести строку во множественное число (что было на удивление сложно сделать)

function pluralize(str) {
  return {
    'AccessToken': 'AccessTokens',
    'Image': 'Images',
    'Index': 'Indexes'
  }[str]
}

Надеюсь, это поможет кому-то еще, кто пытается понять это.

Ответ принят как подходящий

По состоянию на 13 февраля 2020 г. Firestore теперь поддерживает тернарный оператор.

https://firebase.google.com/support/release-notes/security-rules#february_13_2020

Вот документация по доступным операторам (тернар внизу)

https://firebase.google.com/docs/rules/rules-language#building_conditions

Взяв пример кода из вопроса, решение может быть достигнуто с помощью вложенного набора тернарных операторов.

function getTier() {
  return get(/users/$(request.auth.uid)).data.userTier;
}

function canAddProduct() {
  return getTier() == 'UserTier.FREE' ?
    doSomethingBasedOnFreeTier() :
    (
      getTier() == 'UserTier.SILVER' ?
        doSomethingBasedOnSilverTier() :
        (
          getTier() == 'UserTier.GOLD' ?
            doSomethingBasedOnGoldTier() :
            (
              getTier() == 'UserTier.COMPANY' ?
                doSomethingBasedOnCompanyTier() :
                null
            ) 
        )
    )
}

Другие вопросы по теме