Можно ли сделать оператор 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()
}
Любая помощь будет принята с благодарностью.
Правила 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().
Обновленный код, чтобы более или менее отражать то, что я хочу сделать
@TinusJackson, единственными допустимыми выходными значениями являются true и false, поэтому все, что вы хотите сделать, можно свести к AND и OR различных тестов. Для каждого UserTier, но все это в круглых скобках и ИЛИ их вместе, как Деннис показал выше - это делает то же самое.
или, другими словами, правила безопасности не позволяют вам «делать что-то()», они позволяют вам только «проверить что-то()», и результат проверки в конечном итоге должен быть истинным (разрешить) или ложным (не разрешать).
Еще один прием, о котором следует знать, — это использование объектов. Мне потребовалось некоторое время, чтобы понять, что это возможно. Вы можете поместить свои различные случаи в объект и использовать ключи объекта в качестве переключателя.
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
)
)
)
}
if ... else
заявления недействительны в правилах безопасности для Firestore. Но часто вы можете добиться того же результата с помощью другой конструкции, такой как подход, основанный на||
, который @denniskbijo показал в своем ответе. Если это не работает для вас, не забудьте указать цель правила в своем вопросе, так как сейчас оно читается как проблема XY.