import { geliosProviderPackageV5 } from "../v5/package.mjs"; export const GELIOS_PROVIDER_PACKAGE_ID = "gelios.provider.v6"; export const GELIOS_PROVIDER_PACKAGE_VERSION = "6.0.0"; export const GELIOS_ZONES_DATA_PRODUCT_ID = "map.gelios-geofences.current.v1"; export const GELIOS_ZONES_DATA_PRODUCT_VERSION = "1.0.0"; export const GELIOS_ZONES_ONTOLOGY_REVISION = "ontology.map.zone.v1"; export const GELIOS_ZONE_SOURCE_ID_PREFIX = "gelios-zone-"; const ZONES_CAPABILITY_ID = "gelios.geozones.current.read"; const ZONES_FIELD_POLICY_ID = "gelios.geozones.current.fields.v1"; const ZONES_PROFILE_ID = "gelios.geozones.current.realtime.v1"; const ZONES_MAPPING_ID = "gelios.geozones.to.map.gelios-geofences.current.v1"; const ZONES_TEMPLATE_ID = "gelios.geozones.current.l2.v1"; const value = structuredClone(geliosProviderPackageV5); const authModeId = value.authModes[0].id; const zonesFields = [ "area_square_meters", "description", "display_name", "geometry", "geometry_kind", "max_speed_kph", "perimeter_meters", "source_kind", "source_revision", "style_color", ]; value.id = GELIOS_PROVIDER_PACKAGE_ID; value.version = GELIOS_PROVIDER_PACKAGE_VERSION; value.manifest = { ...value.manifest, id: "gelios.provider.manifest.v6", version: GELIOS_PROVIDER_PACKAGE_VERSION, capabilityIds: [...value.manifest.capabilityIds, ZONES_CAPABILITY_ID], fieldPolicyIds: [...value.manifest.fieldPolicyIds, ZONES_FIELD_POLICY_ID], collectionProfileIds: [...value.manifest.collectionProfileIds, ZONES_PROFILE_ID], dataProductIds: [...value.manifest.dataProductIds, GELIOS_ZONES_DATA_PRODUCT_ID], mappingContractIds: [...value.manifest.mappingContractIds, ZONES_MAPPING_ID], l2TemplateIds: [...value.manifest.l2TemplateIds, ZONES_TEMPLATE_ID], }; value.capabilities.push({ id: ZONES_CAPABILITY_ID, classification: "read", status: "implemented", authModeId, request: { method: "GET", baseUrl: "https://api.geliospro.com", path: "/api/v1/geozones", query: { pl: 100, po: 0 }, response: { collectionPaths: ["items"], pagination: { mode: "offset", limitParameter: "pl", offsetParameter: "po", pageSize: 100, itemsPath: "items", totalPath: "paginationMetadata.totalCount", maxPages: 50, maxItems: 5000, maxResponseBytes: 16 * 1024 * 1024, }, }, }, entityScope: { mode: "all_visible_to_credential", refresh: "each_collection_run", businessEntityFilter: "forbidden", }, }); value.fieldPolicies.push({ id: ZONES_FIELD_POLICY_ID, version: GELIOS_ZONES_DATA_PRODUCT_VERSION, dataProductId: GELIOS_ZONES_DATA_PRODUCT_ID, targetFields: [...zonesFields], unknownSourceFields: "drop", dynamicSourceFields: "drop_until_classified", restrictedSourcePaths: ["accessToken", "authorization", "refreshToken", "userToken"], }); value.collectionProfiles.push({ id: ZONES_PROFILE_ID, version: GELIOS_PROVIDER_PACKAGE_VERSION, mode: "realtime", schedule: { intervalMs: 3_600_000 }, capabilityIds: [ZONES_CAPABILITY_ID], dataProductId: GELIOS_ZONES_DATA_PRODUCT_ID, mappingContractId: ZONES_MAPPING_ID, fieldPolicyId: ZONES_FIELD_POLICY_ID, l2TemplateId: ZONES_TEMPLATE_ID, entityScope: { mode: "all_visible_to_credential", refresh: "each_collection_run", businessEntityFilter: "forbidden", }, batching: { maxFacts: 5000 }, cardinality: { maxCurrentEntities: 5000, onExceed: "require_partitioned_data_product" }, retry: { maxAttempts: 4, backoff: "exponential_with_jitter" }, }); value.dataProducts.push({ id: GELIOS_ZONES_DATA_PRODUCT_ID, version: GELIOS_ZONES_DATA_PRODUCT_VERSION, ontologyRevision: GELIOS_ZONES_ONTOLOGY_REVISION, deliveryMode: "snapshot+patch", semanticTypes: ["map.zone"], fields: [...zonesFields], fieldContracts: { area_square_meters: { type: "number", required: false, minimum: 0 }, 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 }, source_kind: { type: "string", required: true, enum: ["live_api", "versioned_snapshot"] }, source_revision: { type: "string", required: true }, style_color: { type: "string", required: false }, }, history: { mode: "none", retentionDays: 1 }, }); value.mappingContracts.push({ schemaVersion: "nodedc.semantic-mapping/v1", id: ZONES_MAPPING_ID, version: GELIOS_PROVIDER_PACKAGE_VERSION, sourceCapabilityId: ZONES_CAPABILITY_ID, fieldPolicyId: ZONES_FIELD_POLICY_ID, target: { dataProductId: GELIOS_ZONES_DATA_PRODUCT_ID, version: GELIOS_ZONES_DATA_PRODUCT_VERSION, ontologyRevision: GELIOS_ZONES_ONTOLOGY_REVISION, semanticType: "map.zone", }, derivations: { geometry_kind: { kind: "ordered_rules", rules: ["type_circle.circle", "type_line.corridor", "otherwise.polygon"], default: "polygon", }, }, fact: { sourceId: { strategy: "first_non_empty", paths: ["id"], coerce: "string", prefix: GELIOS_ZONE_SOURCE_ID_PREFIX }, semanticType: { constant: "map.zone" }, observedAt: { strategy: "first_non_empty", paths: ["updatedAt"], coerce: "unix_or_iso_timestamp", fallback: "collection_received_at" }, geometry: { type: "GeoJSON", strategy: "bounded_zone_geometry_v1", kindPath: "type", polygonPointsPath: "points", corridorPointsPath: "line", radiusPath: "radius", coordinateOrder: "latitude_longitude", circleSegments: 64, allowedTypes: ["Polygon", "MultiPolygon"], omitIfInvalid: false, }, attributes: { area_square_meters: { strategy: "first_non_empty", paths: ["surfaceArea", "surface_area"], coerce: "number", minimum: 0, omitIfMissing: true, omitIfInvalid: true }, description: { strategy: "first_non_empty", paths: ["description", "descr"], coerce: "string", omitIfMissing: true }, display_name: { strategy: "first_non_empty", paths: ["name"], coerce: "string" }, geometry_kind: { derive: "geometry_kind" }, max_speed_kph: { strategy: "first_non_empty", paths: ["maxPermissibleSpeed", "max_permissible_speed"], coerce: "number", minimum: 0, omitIfMissing: true, omitIfInvalid: true }, perimeter_meters: { strategy: "first_non_empty", paths: ["perimeter"], coerce: "number", minimum: 0, omitIfMissing: true, omitIfInvalid: true }, source_kind: { constant: "live_api" }, source_revision: { constant: "gelios-rest-v1" }, style_color: { strategy: "first_non_empty", paths: ["color"], coerce: "string", omitIfMissing: true }, }, }, }); value.l2Templates.push({ schemaVersion: "nodedc.l2-template/v1", id: ZONES_TEMPLATE_ID, version: GELIOS_PROVIDER_PACKAGE_VERSION, runtime: "ndc_l2", instanceMode: "one_connection_per_workflow", connectionParameters: ["tenant_id", "connection_id", "collection_profile_id", "provider_credential_ref"], credentialBindings: structuredClone(value.l2Templates[0].credentialBindings), steps: [ { id: "collection.trigger", kind: "collection_trigger", collectionProfileDriven: true }, { id: "provider.fetch-geozones", kind: "provider_request", capabilityId: ZONES_CAPABILITY_ID }, { id: "provider.extract-geozones", kind: "extract_items", capabilityId: ZONES_CAPABILITY_ID }, { id: "ontology.map", kind: "semantic_mapping", mappingContractId: ZONES_MAPPING_ID }, { id: "data-product.publish", kind: "data_product_publish", dataProductId: GELIOS_ZONES_DATA_PRODUCT_ID, nodeType: "n8n-nodes-ndc.ndcDataProductPublish" }, ], invariants: structuredClone(value.l2Templates[0].invariants), }); export const geliosProviderPackageV6 = deepFreeze(value); function deepFreeze(input) { if (!input || typeof input !== "object" || Object.isFrozen(input)) return input; Object.freeze(input); for (const child of Object.values(input)) deepFreeze(child); return input; }