feat: honor temporal read context

This commit is contained in:
2026-08-05 00:03:32 +02:00
parent dfc819f1e5
commit 25c4267dc6
4 changed files with 55 additions and 6 deletions
+18 -5
View File
@@ -12,6 +12,8 @@ from govoplan_core.core.institutional import (
ServiceDefinition,
TemporalRevision,
)
from govoplan_core.core.temporal import TemporalDataContext
from govoplan_core.db.temporal import apply_temporal_revision_filter
from govoplan_services.backend.db.models import ServiceDefinitionRevision
@@ -116,6 +118,7 @@ def get_service_definition(
*,
service_id: str,
revision: str | None = None,
temporal_context: TemporalDataContext | None = None,
) -> ServiceDefinition | None:
tenant_id = _principal_tenant(principal)
query = session.query(ServiceDefinitionRevision).filter(
@@ -123,7 +126,11 @@ def get_service_definition(
ServiceDefinitionRevision.service_id == service_id,
)
if revision is None:
query = query.filter(ServiceDefinitionRevision.superseded_at.is_(None))
query = apply_temporal_revision_filter(
query,
ServiceDefinitionRevision,
context=temporal_context,
)
else:
query = query.filter(ServiceDefinitionRevision.revision == revision)
row = query.order_by(ServiceDefinitionRevision.recorded_at.desc()).first()
@@ -143,7 +150,10 @@ def list_service_definitions(
raise ServiceStoreError("Service list limit must be between 1 and 200.")
statement = session.query(ServiceDefinitionRevision).filter(
ServiceDefinitionRevision.tenant_id == tenant_id,
ServiceDefinitionRevision.superseded_at.is_(None),
)
statement = apply_temporal_revision_filter(
statement,
ServiceDefinitionRevision,
)
if publication_states is not None:
statement = statement.filter(
@@ -180,10 +190,13 @@ class SqlServiceDefinitionProvider:
principal,
service_id=reference.object_id,
revision=reference.version,
temporal_context=(
TemporalDataContext(validity_mode="at", valid_at=effective_at)
if effective_at is not None and reference.version is None
else None
),
)
if item is None or (
effective_at is not None and not item.temporal.effective_at(effective_at)
):
if item is None or (effective_at is not None and reference.version is not None and not item.temporal.effective_at(effective_at)):
return None
return item