是否有可能在Firestore规则中执行Switch语句或其他操作?
我试图搜索它,但是没有找到答案的运气。
我尝试过的是
/.well-known/acme-challenge/{*rest}
任何帮助将不胜感激。
答案 0 :(得分:2)
截至2020年2月13日,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
)
)
)
}
答案 1 :(得分:1)
Firestore规则用于定义访问Project中特定集合的规则。 它们主要用于检查用户的访问权限。它们仅用于检查逻辑。因此,如果其他条件和条件表达式不支持,则它们不支持switch语句。
您可以使用OR条件检查用户是否可以根据其所属的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;
}
希望这可以解决您的问题。
答案 2 :(得分:0)
要注意的另一种技巧是对象的使用。我花了一段时间才知道这是可能的。您可以将不同的箱子放入对象中,然后使用对象键作为开关。
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]
}
希望这可以帮助其他人努力解决这个问题。