Skip to content

Commit 327d5ee

Browse files
basabotk8-benetis
andauthored
fix(soil): normalize parcel URN to prevent double-prefix (#16)
Co-authored-by: g <gilleniko@gmail.com>
1 parent c1dfd6c commit 327d5ee

3 files changed

Lines changed: 27 additions & 4 deletions

File tree

backend/src/nkz_soil/api/routes/internal.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@
1616

1717
logger = logging.getLogger(__name__)
1818

19+
_PARCEL_URN_PREFIX = "urn:ngsi-ld:AgriParcel:"
20+
21+
22+
def _parcel_urn(parcel_id: str) -> str:
23+
if parcel_id.startswith(_PARCEL_URN_PREFIX):
24+
return parcel_id
25+
return f"{_PARCEL_URN_PREFIX}{parcel_id}"
26+
1927
router = APIRouter()
2028

2129

@@ -52,7 +60,7 @@ async def setup_parcel(request: Request):
5260
# If no geometry provided, resolve from Orion
5361
if not geometry:
5462
async with OrionClient(tenant_id) as orion:
55-
q = f'id=="urn:ngsi-ld:AgriParcel:{parcel_id}"'
63+
q = f'id=="{_parcel_urn(parcel_id)}"'
5664
parcels = await orion.query_entities(type="AgriParcel", q=q, limit=1)
5765
if parcels:
5866
geometry = parcels[0].get("location", {}).get("value", {})

backend/src/nkz_soil/api/routes/writing.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@
1313
router = APIRouter()
1414

1515

16+
_PARCEL_URN_PREFIX = "urn:ngsi-ld:AgriParcel:"
17+
18+
19+
def _parcel_urn(parcel_id: str) -> str:
20+
"""Return canonical parcel URN, normalizing short id or full URN."""
21+
if parcel_id.startswith(_PARCEL_URN_PREFIX):
22+
return parcel_id
23+
return f"{_PARCEL_URN_PREFIX}{parcel_id}"
24+
25+
1626
class SamplingPointInput(BaseModel):
1727
lat: float
1828
lon: float
@@ -123,7 +133,7 @@ async def create_survey(body: SurveyInput, auth: AuthContext = require_auth()):
123133
if body.parcel_id:
124134
entity["hasAgriParcel"] = {
125135
"type": "Relationship",
126-
"object": f"urn:ngsi-ld:AgriParcel:{body.parcel_id}",
136+
"object": _parcel_urn(body.parcel_id),
127137
}
128138

129139
async with OrionClient(tenant_id) as orion:

backend/src/nkz_soil/workers/ingest.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
from nkz_soil.config import REDIS_URL
1111
from nkz_soil.workers.water_budget import compute_water_budgets
1212
from nkz_soil.models.domain import DepthInterval, SoilDataResult, SoilProperty
13+
14+
_PARCEL_URN_PREFIX = "urn:ngsi-ld:AgriParcel:"
15+
16+
def _short_id(parcel_id: str) -> str:
17+
return parcel_id.split(":")[-1] if parcel_id.startswith(_PARCEL_URN_PREFIX) else parcel_id
1318
from nkz_soil.models.ngsi_ld import AgriSoilExtended, GeoProperty, Relationship, TaggedProperty
1419
from nkz_soil.pedotransfer.awc import awc_from_horizons
1520
from nkz_soil.pedotransfer.relative_compaction import relative_compaction
@@ -145,9 +150,9 @@ def build_agri_soil_extended(
145150
winners = _winner_source_per_attr({"horizons": True}, results)
146151
hw = winners.get("horizons", {})
147152
return AgriSoilExtended(
148-
id=f"urn:ngsi-ld:AgriSoilExtended:{parcel_id}",
153+
id=f"urn:ngsi-ld:AgriSoilExtended:{_short_id(parcel_id)}",
149154
location=GeoProperty(value=location),
150-
hasAgriParcel=Relationship(object=f"urn:ngsi-ld:AgriParcel:{parcel_id}"),
155+
hasAgriParcel=Relationship(object=f"urn:ngsi-ld:AgriParcel:{_short_id(parcel_id)}"),
151156
horizons=TaggedProperty(
152157
value=merged_horizons,
153158
provided_by=hw.get("source_tag"),

0 commit comments

Comments
 (0)