fix(data-plane): preserve immutable zone product v1

This commit is contained in:
Codex 2026-07-21 12:48:49 +03:00
parent 343812b90d
commit 92d292ce87
6 changed files with 67 additions and 27 deletions

View File

@ -92,7 +92,7 @@ deleted.
The active predecessor is package version `0.1.4` at immutable release The active predecessor is package version `0.1.4` at immutable release
`0.1.4-59dc9f7882721d6a`. Package `0.1.5` adds the provider-neutral complete `0.1.4-59dc9f7882721d6a`. Package `0.1.5` adds the provider-neutral complete
snapshot replace mode used by `map.zones.current.v1`; its Platform staging snapshot replace mode used by `map.zones.current.v2`; its Platform staging
remains inert until a separately reviewed Engine-owned transition selects the remains inert until a separately reviewed Engine-owned transition selects the
exact digest and accepts the updated MCP node schema. exact digest and accepts the updated MCP node schema.

View File

@ -4,5 +4,5 @@ Adds the bounded, offset-paged `gelios.geozone` read capability and maps a
complete account generation into `map.gelios-geofences.current.v1`. complete account generation into `map.gelios-geofences.current.v1`.
Gelios account geo-objects are deliberately not published into the normative Gelios account geo-objects are deliberately not published into the normative
`map.zones.current.v1` Department of Transport dataset. Independent authorities `map.zones.current.v2` Department of Transport dataset. Independent authorities
must never share one replace generation. must never share one replace generation.

View File

@ -46,12 +46,12 @@ assert.deepEqual(validateProviderPackage(geliosProviderPackageV6), { ok: true, e
const zonesProduct = geliosProviderPackageV6.dataProducts.find((product) => product.id === "map.gelios-geofences.current.v1"); const zonesProduct = geliosProviderPackageV6.dataProducts.find((product) => product.id === "map.gelios-geofences.current.v1");
const registeredZonesProduct = JSON.parse(await readFile(new URL( const registeredZonesProduct = JSON.parse(await readFile(new URL(
"../../../services/external-data-plane/definitions/map.zones.current.v1.json", "../../../services/external-data-plane/definitions/map.zones.current.v2.json",
import.meta.url, import.meta.url,
), "utf8")); ), "utf8"));
assert.deepEqual(zonesProduct.semanticTypes, ["map.zone"]); assert.deepEqual(zonesProduct.semanticTypes, ["map.zone"]);
assert.equal(zonesProduct.fieldContracts.geometry.type, "geometry"); assert.equal(zonesProduct.fieldContracts.geometry.type, "geometry");
assert.equal(registeredZonesProduct.version, "1.1.0"); assert.equal(registeredZonesProduct.version, "2.0.0");
assert.deepEqual(registeredZonesProduct.fieldContracts.dataset_authority.enum, ["moscow-department-of-transport"]); assert.deepEqual(registeredZonesProduct.fieldContracts.dataset_authority.enum, ["moscow-department-of-transport"]);
assert.deepEqual(registeredZonesProduct.fieldContracts.source_adapter.enum, [ assert.deepEqual(registeredZonesProduct.fieldContracts.source_adapter.enum, [
"depttrans-mmap-snapshot-v1", "depttrans-mmap-snapshot-v1",

View File

@ -1,50 +1,32 @@
{ {
"id": "map.zones.current.v1", "id": "map.zones.current.v1",
"version": "1.1.0", "version": "1.0.0",
"ontologyRevision": "ontology.map.zone.v1", "ontologyRevision": "ontology.map.zone.v1",
"deliveryMode": "snapshot+patch", "deliveryMode": "snapshot+patch",
"semanticTypes": ["map.zone"], "semanticTypes": ["map.zone"],
"fields": [ "fields": [
"area_square_meters", "area_square_meters",
"applies_to_couriers",
"applies_to_kicksharing",
"dataset_authority",
"dataset_id",
"description", "description",
"display_name", "display_name",
"geometry", "geometry",
"geometry_kind", "geometry_kind",
"max_speed_kph", "max_speed_kph",
"perimeter_meters", "perimeter_meters",
"schedule_timezone",
"source_adapter",
"source_created_at",
"source_kind", "source_kind",
"source_revision", "source_revision",
"source_updated_at", "style_color"
"style_color",
"weekly_speed_schedule"
], ],
"fieldContracts": { "fieldContracts": {
"area_square_meters": { "type": "number", "required": false, "minimum": 0 }, "area_square_meters": { "type": "number", "required": false, "minimum": 0 },
"applies_to_couriers": { "type": "boolean", "required": false },
"applies_to_kicksharing": { "type": "boolean", "required": false },
"dataset_authority": { "type": "string", "required": true, "enum": ["moscow-department-of-transport"] },
"dataset_id": { "type": "string", "required": true, "enum": ["pmd-slow-zones"] },
"description": { "type": "string", "required": false }, "description": { "type": "string", "required": false },
"display_name": { "type": "string", "required": true }, "display_name": { "type": "string", "required": true },
"geometry": { "type": "geometry", "required": true }, "geometry": { "type": "geometry", "required": true },
"geometry_kind": { "type": "string", "required": true, "enum": ["circle", "corridor", "polygon"] }, "geometry_kind": { "type": "string", "required": true, "enum": ["circle", "corridor", "polygon"] },
"max_speed_kph": { "type": "number", "required": false, "minimum": 0 }, "max_speed_kph": { "type": "number", "required": false, "minimum": 0 },
"perimeter_meters": { "type": "number", "required": false, "minimum": 0 }, "perimeter_meters": { "type": "number", "required": false, "minimum": 0 },
"schedule_timezone": { "type": "string", "required": false, "enum": ["Europe/Moscow"] }, "source_kind": { "type": "string", "required": true, "enum": ["live_api", "versioned_snapshot"] },
"source_adapter": { "type": "string", "required": true, "enum": ["depttrans-mmap-snapshot-v1", "depttrans-api-snapshot-v1"] },
"source_created_at": { "type": "string", "required": false },
"source_kind": { "type": "string", "required": true, "enum": ["versioned_snapshot"] },
"source_revision": { "type": "string", "required": true }, "source_revision": { "type": "string", "required": true },
"source_updated_at": { "type": "string", "required": false }, "style_color": { "type": "string", "required": false }
"style_color": { "type": "string", "required": false },
"weekly_speed_schedule": { "type": "string_array", "required": false }
}, },
"history": { "mode": "none", "retentionDays": 1 } "history": { "mode": "none", "retentionDays": 1 }
} }

View File

@ -0,0 +1,50 @@
{
"id": "map.zones.current.v2",
"version": "2.0.0",
"ontologyRevision": "ontology.map.zone.v1",
"deliveryMode": "snapshot+patch",
"semanticTypes": ["map.zone"],
"fields": [
"area_square_meters",
"applies_to_couriers",
"applies_to_kicksharing",
"dataset_authority",
"dataset_id",
"description",
"display_name",
"geometry",
"geometry_kind",
"max_speed_kph",
"perimeter_meters",
"schedule_timezone",
"source_adapter",
"source_created_at",
"source_kind",
"source_revision",
"source_updated_at",
"style_color",
"weekly_speed_schedule"
],
"fieldContracts": {
"area_square_meters": { "type": "number", "required": false, "minimum": 0 },
"applies_to_couriers": { "type": "boolean", "required": false },
"applies_to_kicksharing": { "type": "boolean", "required": false },
"dataset_authority": { "type": "string", "required": true, "enum": ["moscow-department-of-transport"] },
"dataset_id": { "type": "string", "required": true, "enum": ["pmd-slow-zones"] },
"description": { "type": "string", "required": false },
"display_name": { "type": "string", "required": true },
"geometry": { "type": "geometry", "required": true },
"geometry_kind": { "type": "string", "required": true, "enum": ["circle", "corridor", "polygon"] },
"max_speed_kph": { "type": "number", "required": false, "minimum": 0 },
"perimeter_meters": { "type": "number", "required": false, "minimum": 0 },
"schedule_timezone": { "type": "string", "required": false, "enum": ["Europe/Moscow"] },
"source_adapter": { "type": "string", "required": true, "enum": ["depttrans-mmap-snapshot-v1", "depttrans-api-snapshot-v1"] },
"source_created_at": { "type": "string", "required": false },
"source_kind": { "type": "string", "required": true, "enum": ["versioned_snapshot"] },
"source_revision": { "type": "string", "required": true },
"source_updated_at": { "type": "string", "required": false },
"style_color": { "type": "string", "required": false },
"weekly_speed_schedule": { "type": "string_array", "required": false }
},
"history": { "mode": "none", "retentionDays": 1 }
}

View File

@ -12,6 +12,7 @@ assert.deepEqual(bundled.map((definition) => definition.id), [
"fleet.positions.current.v3", "fleet.positions.current.v3",
"fleet.positions.current.v4", "fleet.positions.current.v4",
"map.zones.current.v1", "map.zones.current.v1",
"map.zones.current.v2",
]); ]);
assert.deepEqual(bundled[0].semanticTypes, ["map.moving_object"]); assert.deepEqual(bundled[0].semanticTypes, ["map.moving_object"]);
assert.equal(bundled[0].ontologyRevision, "ontology.map.moving_object.v1"); assert.equal(bundled[0].ontologyRevision, "ontology.map.moving_object.v1");
@ -46,12 +47,19 @@ assert.deepEqual(bundled[3].fieldContracts.movement_state, {
required: true, required: true,
enum: ["moving", "stopped"], enum: ["moving", "stopped"],
}); });
assert.equal(bundled[4].version, "1.1.0"); assert.equal(bundled[4].version, "1.0.0");
assert.equal(bundled[4].ontologyRevision, "ontology.map.zone.v1"); assert.equal(bundled[4].ontologyRevision, "ontology.map.zone.v1");
assert.deepEqual(bundled[4].semanticTypes, ["map.zone"]); assert.deepEqual(bundled[4].semanticTypes, ["map.zone"]);
assert.deepEqual(bundled[4].fieldContracts.geometry, { type: "geometry", required: true }); assert.deepEqual(bundled[4].fieldContracts.geometry, { type: "geometry", required: true });
assert.equal(bundled[4].fields.includes("dataset_authority"), false);
assert.equal(bundled[5].version, "2.0.0");
assert.equal(bundled[5].ontologyRevision, "ontology.map.zone.v1");
assert.deepEqual(bundled[5].semanticTypes, ["map.zone"]);
assert.deepEqual(bundled[5].fieldContracts.geometry, { type: "geometry", required: true });
assert.deepEqual(bundled[5].fieldContracts.dataset_authority.enum, ["moscow-department-of-transport"]);
assert.equal(Object.keys(bundled[3].fieldContracts).length, bundled[3].fields.length); assert.equal(Object.keys(bundled[3].fieldContracts).length, bundled[3].fields.length);
assert.equal(Object.keys(bundled[4].fieldContracts).length, bundled[4].fields.length); assert.equal(Object.keys(bundled[4].fieldContracts).length, bundled[4].fields.length);
assert.equal(Object.keys(bundled[5].fieldContracts).length, bundled[5].fields.length);
const directory = await mkdtemp(join(tmpdir(), "nodedc-edp-definitions-")); const directory = await mkdtemp(join(tmpdir(), "nodedc-edp-definitions-"));
try { try {