是否可以执行 If Else 或 Switch 语句 Firestore 规则

Tin*_*son 6 firebase-security google-cloud-firestore

是否可以在 Firestore 规则中执行 Switch 语句或 if else?

我试图搜索它,但没有找到答案。

我试过的是

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()
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

Bri*_*ler 9

另一个需要注意的技巧是使用对象。我花了一段时间才发现这是可能的。您可以将不同的案例放入一个对象中,并使用对象键作为开关。

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

然后你可以像这样使用..

return switchOnTier(getTier())
Run Code Online (Sandbox Code Playgroud)

我将它用于尝试对字符串进行复数化的简单案例(这出奇地难以做到)

function pluralize(str) {
  return {
    'AccessToken': 'AccessTokens',
    'Image': 'Images',
    'Index': 'Indexes'
  }[str]
}
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*ler 6

截至 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
            ) 
        )
    )
}
Run Code Online (Sandbox Code Playgroud)