可能执行If Else或Switch语句Firestore规则

时间:2019-05-28 06:36:11

标签: google-cloud-firestore firebase-security-rules

是否有可能在Firestore规则中执行Switch语句或其他操作?

我试图搜索它,但是没有找到答案的运气。

我尝试过的是

/.well-known/acme-challenge/{*rest}

任何帮助将不胜感激。

3 个答案:

答案 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]
}

希望这可以帮助其他人努力解决这个问题。