Ошибка оценки Firestore-Rules в поле Timestamp

Я написал правило firestore следующим образом:

function isPublished() {
  return !('publicationAt' in resource.data.keys()) ? true :
    debug(debug(request.time) >= debug(resource.data.publicationAt));
}

и в моем приложении я сохраняю несколько дат только с помощью new Date(); Теперь я хотел бы получить список всех опубликованных элементов, но это дает мне ошибку оценки - с помощью этой отладки:

ограничение_значение {
простые_ограничения { компаратор: LTE ценить { timestamp_value { секунд: 1669108946 нано: 684000000 } }
} }

timestamp_value {секунды: 1669108945 наносекунд: 727000000}

Может ли кто-нибудь дать мне подсказку, что я делаю неправильно?

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Хотя у вас может возникнуть соблазн подумать, что Язык правил безопасности (SRL) — это JavaScript из-за части function() {}, это не так. Это специальный статически оцениваемый язык, который интерпретируется один раз без других общих функций, таких как итерация.

Важно отметить, что в SRL нет тернарного оператора:

<condition> ? <result-when-true> : <result-when-false>

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

Эквивалент тернарного оператора в базовой булевой алгебре (при использовании операторов короткого замыкания, таких как && и ||):

(<condition> && <result-when-true>) || (NOT(<condition>) && <result-when-false>)

Подставив значение для <result-when-true>, мы можем уменьшить ваше выражение, используя законы булевой алгебры (где оператор И (&&) равен , а оператор ИЛИ (||) равен ):

(<condition> && <result-when-true>) || (NOT(<condition>) && <result-when-false>)

// replace <result-when-true> with TRUE, as in your question
(<condition> && TRUE) || (NOT(<condition>) && <result-when-false>)

// now remove the redundant "&& TRUE" (see "Identity of ∧")
<condition> || (NOT(<condition>) && <result-when-false>)

// now distribute the OR operator (see "Distributivity of ∨ over ∧")
(<condition> || NOT(<condition>)) && (<condition> || <result-when-false>)

// now replace (<condition> || NOT(<condition>)) because it will always be TRUE (see "Complementation 2")
TRUE && (<condition> || <result-when-false>)

// now remove the redundant "TRUE &&" like before (see "Identity of ∧")
<condition> || <result-when-false>

Подставляя части из вашего вопроса, это оставляет нам:

   !('publicationAt' in resource.data.keys())
|| debug(debug(request.time) >= debug(resource.data.publicationAt))

Вы также можете упростить 'publicationAt' in resource.data.keys() до 'publicationAt' in resource.data (поскольку оператор in обрабатывает то, что вы ожидали от rules.Map object), что дает нам:

   !('publicationAt' in resource.data)
|| debug(debug(request.time) >= debug(resource.data.publicationAt));

Это означает, что правильная форма вашей функции SRL будет выглядеть так:

function isPublished() {
  return !('publicationAt' in resource.data)
      || debug(debug(request.time) >= debug(resource.data.publicationAt));
}

отлично объяснил! большое спасибо @samthecodingman

Coach83 23.11.2022 06:05

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