feat(foundry): render geozones as independent map layer

This commit is contained in:
Codex
2026-07-20 21:48:27 +03:00
parent a02c3ff3dd
commit aa681ca069
12 changed files with 418 additions and 90 deletions
+11 -2
View File
@@ -49,7 +49,7 @@ function safeStatusFromFact(fact, policy, nowMs) {
if (typeof sourceStatus !== "string" || !statusContract.allowedValues.includes(sourceStatus)) {
throw consumerError("data_product_consumer_fact_status_invalid", 502);
}
if (statusContract.freshness === "none" || policy.terminalStatuses.includes(sourceStatus)) {
if (policy.freshness === "none" || policy.terminalStatuses.includes(sourceStatus)) {
return sourceStatus;
}
const observedAt = Date.parse(String(fact?.observedAt || ""));
@@ -60,6 +60,7 @@ function safeStatusFromFact(fact, policy, nowMs) {
.find((value) => typeof value === "string" && value.trim());
const normalized = String(sourceStatus || "active").trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-").slice(0, 64) || "active";
if (policy.terminalStatuses.includes(normalized)) return normalized;
if (policy.freshness === "none") return normalized;
const observedAt = Date.parse(String(fact?.observedAt || ""));
if (Number.isFinite(observedAt) && nowMs - observedAt > policy.staleAfterMs) return "stale";
return normalized;
@@ -144,7 +145,14 @@ function validatePolicy(policy, product) {
const statusContract = policy.statusContract === undefined
? null
: validateStatusContract(policy.statusContract);
const staleDisabled = statusContract?.freshness === "none";
const freshness = policy.freshness ?? statusContract?.freshness ?? "observed-at";
if (!["none", "observed-at"].includes(freshness)) {
throw consumerError("data_product_consumer_policy_invalid", 500);
}
if (statusContract && statusContract.freshness !== freshness) {
throw consumerError("data_product_consumer_policy_invalid", 500);
}
const staleDisabled = freshness === "none";
if (
(staleDisabled && policy.staleAfterMs !== null)
|| (!staleDisabled && (!Number.isInteger(policy.staleAfterMs) || policy.staleAfterMs < 1_000 || policy.staleAfterMs > 7 * 24 * 60 * 60 * 1000))
@@ -166,6 +174,7 @@ function validatePolicy(policy, product) {
version: String(policy.version || ""),
dataProductId: product.id,
productVersion: product.version,
freshness,
staleAfterMs: policy.staleAfterMs,
terminalStatuses: [...terminalStatuses],
...(statusContract ? { statusContract } : {}),