You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The server returns cross-resource references exclusively as @link objects (e.g., "system@link": { "href": "systems/<uuid>", "rel": "..." }) and never as flat @id strings (e.g., "system@id": "0520"). This is a research spike to determine which cross-reference format(s) the OGC spec mandates, what clients should expect, and whether both formats should be supported for interoperability.
Review Source: Live integration testing and client library audit from ogc-csapi-explorer and ogc-client-CSAPI_2 Severity: P4-Informational (research spike) Category: API Design / Interoperability Ownership: connected-systems-go
Problem Statement
When fetching resources like datastreams, the Go server returns cross-references to parent systems using @link objects:
Our client library (ogc-client-CSAPI_2) originally parsed only system@id. When pointed at the Go server, datastreams appeared to have no parent system — breaking the Explorer's map view (0 datastreams shown) and the data model diagram's system↔datastream navigation.
Workarounds applied:
Library parser (part2.ts): Added system@link.href fallback in parseBaseStream() — extracts system ID from the link href
Explorer (MapViewPage.vue): Added extractSystemId() helper that checks system@link.href → system@id → system@link chain
Explorer (DataModelDiagram.vue): Added system@link.href fallback for diagram navigation
This spike should produce analysis, findings, and recommendations that may result in follow-on issues:
What does OGC 23-002 specify for cross-resource references? Does it mandate @id, @link, or both?
Are @id and @link supposed to be alternative encodings of the same relationship, or do they have different semantics? (e.g., @id for in-collection references, @link for cross-collection)
Should a conformant server provide BOTH @id AND @link? Or is one sufficient?
What about @link.href format — should it be a relative path (systems/uuid) or an absolute URL? Our Explorer's extractSystemId() must handle both.
How do other OGC API implementations handle this? (e.g., pygeoapi, ldproxy, GeoServer)
Should connected-systems-go also emit system@id alongside system@link for backward compatibility? Would this be a simple addition?
Are there other cross-reference patterns we haven't encountered yet? (e.g., deployment@link, procedure@link, datastream@link)
Expected Deliverables
Analysis of OGC 23-002 cross-reference encoding requirements
Inventory of all cross-reference fields in Part 1 and Part 2 resource types
Comparison of @id vs @link behavior across known CSAPI server implementations
Recommendation: emit both, emit one, or make it content-negotiable
If changes are recommended, file follow-on implementation issue(s)
Scope
❌ Do NOT implement changes in this spike — research and recommend only
❌ Do NOT change client-side workarounds — they handle both formats and should remain
Finding
The server returns cross-resource references exclusively as
@linkobjects (e.g.,"system@link": { "href": "systems/<uuid>", "rel": "..." }) and never as flat@idstrings (e.g.,"system@id": "0520"). This is a research spike to determine which cross-reference format(s) the OGC spec mandates, what clients should expect, and whether both formats should be supported for interoperability.Review Source: Live integration testing and client library audit from ogc-csapi-explorer and ogc-client-CSAPI_2
Severity: P4-Informational (research spike)
Category: API Design / Interoperability
Ownership: connected-systems-go
Problem Statement
When fetching resources like datastreams, the Go server returns cross-references to parent systems using
@linkobjects:{ "id": "abc-123", "name": "Temperature", "system@link": { "href": "systems/def-456", "rel": "parent", "type": "application/geo+json" } }It does NOT return a flat
system@idfield. In contrast, OSH SensorHub returns flat@idreferences:{ "id": "0812", "name": "Temperature", "system@id": "0520" }Comparative behavior:
system@id(flat)system@link(object)Impact on clients:
Our client library (ogc-client-CSAPI_2) originally parsed only
system@id. When pointed at the Go server, datastreams appeared to have no parent system — breaking the Explorer's map view (0 datastreams shown) and the data model diagram's system↔datastream navigation.Workarounds applied:
part2.ts): Addedsystem@link.hreffallback inparseBaseStream()— extracts system ID from the link hrefMapViewPage.vue): AddedextractSystemId()helper that checkssystem@link.href→system@id→system@linkchainDataModelDiagram.vue): Addedsystem@link.hreffallback for diagram navigationResearch Questions
This spike should produce analysis, findings, and recommendations that may result in follow-on issues:
@id,@link, or both?@idand@linksupposed to be alternative encodings of the same relationship, or do they have different semantics? (e.g.,@idfor in-collection references,@linkfor cross-collection)@idAND@link? Or is one sufficient?@link.hrefformat — should it be a relative path (systems/uuid) or an absolute URL? Our Explorer'sextractSystemId()must handle both.system@idalongsidesystem@linkfor backward compatibility? Would this be a simple addition?deployment@link,procedure@link,datastream@link)Expected Deliverables
@idvs@linkbehavior across known CSAPI server implementationsScope
Related Issues
@id, need@link.hreffallbackReferences
@idvs@linkparsingsystem@link.hreffallback