215 lines
6.7 KiB
JavaScript
215 lines
6.7 KiB
JavaScript
import { geliosProviderPackageV3 } from "../v3/package.mjs";
|
|
|
|
export const GELIOS_PROVIDER_PACKAGE_ID = "gelios.provider.v4";
|
|
export const GELIOS_PROVIDER_PACKAGE_VERSION = "4.0.0";
|
|
export const GELIOS_POSITIONS_DATA_PRODUCT_ID = "fleet.positions.current.v3";
|
|
export const GELIOS_POSITIONS_DATA_PRODUCT_VERSION = "3.0.0";
|
|
export const GELIOS_POSITIONS_ONTOLOGY_REVISION = "ontology.map.moving_object.v3";
|
|
export const GELIOS_UNIT_SOURCE_ID_PREFIX = "gelios-unit-";
|
|
|
|
const UNIT_CAPABILITY_ID = "gelios.units.current.read";
|
|
const MONITORING_CONFIG_CAPABILITY_ID = "gelios.monitoring_config.current.read";
|
|
const FIELD_POLICY_ID = "gelios.positions.current.fields.v3";
|
|
const REALTIME_PROFILE_ID = "gelios.positions.current.realtime.v4";
|
|
const MANUAL_PROFILE_ID = "gelios.positions.current.manual.v4";
|
|
const MAPPING_ID = "gelios.units.to.fleet.positions.current.v4";
|
|
const TEMPLATE_ID = "gelios.positions.current.l2.v4";
|
|
|
|
const targetFields = Object.freeze([
|
|
"course_degrees",
|
|
"display_name",
|
|
"elevation_meters",
|
|
"geometry",
|
|
"hdop",
|
|
"horizontal_accuracy_meters",
|
|
"movement_state",
|
|
"object_kind",
|
|
"position_source",
|
|
"satellite_count",
|
|
"signal_state",
|
|
"speed_kph",
|
|
]);
|
|
|
|
const value = structuredClone(geliosProviderPackageV3);
|
|
const unitCapability = value.capabilities.find((capability) => capability.id === UNIT_CAPABILITY_ID);
|
|
const baseMapping = value.mappingContracts[0];
|
|
const baseAttributes = baseMapping.fact.attributes;
|
|
const authModeId = value.authModes[0].id;
|
|
|
|
value.id = GELIOS_PROVIDER_PACKAGE_ID;
|
|
value.version = GELIOS_PROVIDER_PACKAGE_VERSION;
|
|
value.manifest = {
|
|
...value.manifest,
|
|
id: "gelios.provider.manifest.v4",
|
|
version: GELIOS_PROVIDER_PACKAGE_VERSION,
|
|
ontology: {
|
|
packageId: "gelios",
|
|
revision: "ontology.gelios.v1_1",
|
|
},
|
|
capabilityIds: [MONITORING_CONFIG_CAPABILITY_ID, UNIT_CAPABILITY_ID],
|
|
fieldPolicyIds: [FIELD_POLICY_ID],
|
|
collectionProfileIds: [REALTIME_PROFILE_ID, MANUAL_PROFILE_ID],
|
|
dataProductIds: [GELIOS_POSITIONS_DATA_PRODUCT_ID],
|
|
mappingContractIds: [MAPPING_ID],
|
|
l2TemplateIds: [TEMPLATE_ID],
|
|
};
|
|
value.capabilities = [{
|
|
id: MONITORING_CONFIG_CAPABILITY_ID,
|
|
classification: "read",
|
|
status: "implemented",
|
|
authModeId,
|
|
request: {
|
|
method: "GET",
|
|
baseUrl: "https://api.geliospro.com",
|
|
path: "/api/v1/users/me/monitoring-config",
|
|
query: {},
|
|
response: {
|
|
collectionPaths: ["$", "data"],
|
|
pagination: "single_bounded_response",
|
|
},
|
|
},
|
|
entityScope: {
|
|
mode: "all_visible_to_credential",
|
|
refresh: "each_collection_run",
|
|
businessEntityFilter: "forbidden",
|
|
},
|
|
}, {
|
|
...unitCapability,
|
|
request: {
|
|
...unitCapability.request,
|
|
query: { incltrip: "true" },
|
|
},
|
|
}];
|
|
value.fieldPolicies = [{
|
|
...value.fieldPolicies[0],
|
|
id: FIELD_POLICY_ID,
|
|
version: GELIOS_POSITIONS_DATA_PRODUCT_VERSION,
|
|
dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID,
|
|
targetFields: [...targetFields],
|
|
}];
|
|
value.collectionProfiles = value.collectionProfiles.map((profile, index) => ({
|
|
...profile,
|
|
id: index === 0 ? REALTIME_PROFILE_ID : MANUAL_PROFILE_ID,
|
|
version: GELIOS_PROVIDER_PACKAGE_VERSION,
|
|
capabilityIds: [MONITORING_CONFIG_CAPABILITY_ID, UNIT_CAPABILITY_ID],
|
|
dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID,
|
|
mappingContractId: MAPPING_ID,
|
|
fieldPolicyId: FIELD_POLICY_ID,
|
|
l2TemplateId: TEMPLATE_ID,
|
|
}));
|
|
value.dataProducts = [{
|
|
id: GELIOS_POSITIONS_DATA_PRODUCT_ID,
|
|
version: GELIOS_POSITIONS_DATA_PRODUCT_VERSION,
|
|
ontologyRevision: GELIOS_POSITIONS_ONTOLOGY_REVISION,
|
|
deliveryMode: "snapshot+patch",
|
|
semanticTypes: ["map.moving_object"],
|
|
fields: [...targetFields],
|
|
history: {
|
|
mode: "sampled",
|
|
intervalMs: 60000,
|
|
strategy: "latest-per-entity-per-bucket",
|
|
retentionDays: 90,
|
|
},
|
|
}];
|
|
value.mappingContracts = [{
|
|
...baseMapping,
|
|
id: MAPPING_ID,
|
|
version: GELIOS_PROVIDER_PACKAGE_VERSION,
|
|
sourceCapabilityId: UNIT_CAPABILITY_ID,
|
|
fieldPolicyId: FIELD_POLICY_ID,
|
|
target: {
|
|
...baseMapping.target,
|
|
dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID,
|
|
version: GELIOS_POSITIONS_DATA_PRODUCT_VERSION,
|
|
ontologyRevision: GELIOS_POSITIONS_ONTOLOGY_REVISION,
|
|
},
|
|
derivations: {
|
|
signal_state: {
|
|
kind: "ordered_rules",
|
|
rules: [
|
|
"last_message_missing.inactive",
|
|
"last_message_age_lt_resolved_monitoring_limit.active",
|
|
"otherwise.inactive",
|
|
],
|
|
default: "inactive",
|
|
parameters: {
|
|
monitoringConfigCapability: MONITORING_CONFIG_CAPABILITY_ID,
|
|
activeDurationPath: "signalActiveDuration",
|
|
somewhatInactiveDurationPath: "signalSomewhatInactiveDuration",
|
|
inactiveDurationPath: "signalSomewhatInactiveDuration",
|
|
collectionProfileFallbackSeconds: 120,
|
|
thresholdResolution: "somewhatInactive_then_active_then_profileFallback",
|
|
lastMessageTimePath: "lastMsg.time",
|
|
},
|
|
},
|
|
movement_state: {
|
|
kind: "ordered_rules",
|
|
rules: [
|
|
"integer_speed_gt_threshold.moving",
|
|
"otherwise.stopped",
|
|
],
|
|
default: "stopped",
|
|
parameters: {
|
|
speedPath: "lastMsg.speed",
|
|
movingThresholdKph: 2,
|
|
},
|
|
},
|
|
},
|
|
fact: {
|
|
...baseMapping.fact,
|
|
attributes: {
|
|
course_degrees: baseAttributes.course_degrees,
|
|
display_name: baseAttributes.display_name,
|
|
elevation_meters: baseAttributes.elevation_meters,
|
|
hdop: baseAttributes.hdop,
|
|
horizontal_accuracy_meters: baseAttributes.horizontal_accuracy_meters,
|
|
movement_state: { derive: "movement_state" },
|
|
object_kind: baseAttributes.object_kind,
|
|
position_source: baseAttributes.position_source,
|
|
satellite_count: baseAttributes.satellite_count,
|
|
signal_state: { derive: "signal_state" },
|
|
speed_kph: baseAttributes.speed_kph,
|
|
},
|
|
},
|
|
}];
|
|
value.l2Templates = [{
|
|
...value.l2Templates[0],
|
|
id: TEMPLATE_ID,
|
|
version: GELIOS_PROVIDER_PACKAGE_VERSION,
|
|
steps: [{
|
|
id: "collection.trigger",
|
|
kind: "collection_trigger",
|
|
collectionProfileDriven: true,
|
|
}, {
|
|
id: "provider.fetch-monitoring-config",
|
|
kind: "provider_request",
|
|
capabilityId: MONITORING_CONFIG_CAPABILITY_ID,
|
|
}, {
|
|
id: "provider.fetch-units",
|
|
kind: "provider_request",
|
|
capabilityId: UNIT_CAPABILITY_ID,
|
|
}, {
|
|
id: "provider.extract-units",
|
|
kind: "extract_items",
|
|
capabilityId: UNIT_CAPABILITY_ID,
|
|
}, {
|
|
id: "ontology.map",
|
|
kind: "semantic_mapping",
|
|
mappingContractId: MAPPING_ID,
|
|
}, {
|
|
id: "data-product.publish",
|
|
kind: "data_product_publish",
|
|
dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID,
|
|
nodeType: "n8n-nodes-ndc.ndcDataProductPublish",
|
|
}],
|
|
}];
|
|
|
|
export const geliosProviderPackageV4 = 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;
|
|
}
|