Я написал правило 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}
Может ли кто-нибудь дать мне подсказку, что я делаю неправильно?

Хотя у вас может возникнуть соблазн подумать, что Язык правил безопасности (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