Files
geo/scripts/seed-demo.ts
T
Ruslan Bakiev 38972ebce7
Build and deploy Docker image / build (push) Successful in 1m43s
Fix demo seed runtime
2026-06-07 11:09:56 +07:00

168 lines
4.3 KiB
TypeScript

import { aql } from 'arangojs'
import { ensureGraph, getDb } from '../dist/db.js'
type GeoNode = {
_key: string
node_type: string
name: string
latitude: number
longitude: number
country: string
country_code: string
transport_types?: string[]
product_uuid?: string
product_name?: string
supplier_uuid?: string
supplier_name?: string
price_per_unit?: string
currency?: string
quantity?: string
unit?: string
synced_at: string
}
async function upsertNode(doc: GeoNode) {
const { _key, ...patch } = doc
await getDb().query(aql`
UPSERT { _key: ${_key} }
INSERT ${doc}
UPDATE ${patch}
IN ${getDb().collection('nodes')}
`)
}
async function upsertEdge(doc: Record<string, unknown>) {
const key = String(doc._key)
const { _key, ...patch } = doc
await getDb().query(aql`
UPSERT { _key: ${key} }
INSERT ${doc}
UPDATE ${patch}
IN ${getDb().collection('edges')}
`)
}
await ensureGraph()
const now = new Date().toISOString()
const hubs: GeoNode[] = [
{
_key: 'logistics-demo-hub-1',
node_type: 'logistics',
name: 'Demo Almaty Hub',
latitude: 43.238949,
longitude: 76.889709,
country: 'Kazakhstan',
country_code: 'KZ',
transport_types: ['AUTO', 'RAIL'],
synced_at: now,
},
{
_key: 'logistics-demo-hub-2',
node_type: 'logistics',
name: 'Demo Moscow Hub',
latitude: 55.755826,
longitude: 37.6173,
country: 'Russia',
country_code: 'RU',
transport_types: ['AUTO', 'RAIL'],
synced_at: now,
},
{
_key: 'logistics-demo-hub-3',
node_type: 'logistics',
name: 'Demo Urumqi Hub',
latitude: 43.825592,
longitude: 87.616848,
country: 'China',
country_code: 'CN',
transport_types: ['AUTO', 'RAIL'],
synced_at: now,
},
]
const offers: GeoNode[] = Array.from({ length: 24 }, (_, index) => ({
_key: `geo-demo-offer-${index + 1}`,
node_type: 'offer',
name: `Demo offer ${index + 1}`,
latitude: 43.238949 + (index % 6) * 0.12,
longitude: 76.889709 + Math.floor(index / 6) * 0.18,
country: index % 3 === 0 ? 'Kazakhstan' : index % 3 === 1 ? 'China' : 'Russia',
country_code: index % 3 === 0 ? 'KZ' : index % 3 === 1 ? 'CN' : 'RU',
product_uuid: ['55555555-1111-4111-8111-111111111111', '55555555-1111-4111-8111-222222222222', '55555555-1111-4111-8111-333333333333'][index % 3],
product_name: ['Copper cathode', 'Aluminum ingot', 'Wheat'][index % 3],
supplier_uuid: ['66666666-2222-4111-8111-111111111111', '66666666-2222-4111-8111-222222222222', '66666666-2222-4111-8111-333333333333'][index % 3],
supplier_name: ['Demo Supplier Almaty', 'Demo Supplier Urumqi', 'Demo Supplier Moscow'][index % 3],
price_per_unit: String(900 + (index % 8) * 55),
currency: 'USD',
quantity: String(500 + index * 25),
unit: 'ton',
synced_at: now,
}))
const suppliers: GeoNode[] = [
{
_key: 'geo-demo-supplier-1',
node_type: 'supplier',
name: 'Demo Supplier Almaty',
latitude: 43.25667,
longitude: 76.92861,
country: 'Kazakhstan',
country_code: 'KZ',
synced_at: now,
},
{
_key: 'geo-demo-supplier-2',
node_type: 'supplier',
name: 'Demo Supplier Urumqi',
latitude: 43.825592,
longitude: 87.616848,
country: 'China',
country_code: 'CN',
synced_at: now,
},
{
_key: 'geo-demo-supplier-3',
node_type: 'supplier',
name: 'Demo Supplier Moscow',
latitude: 55.755826,
longitude: 37.6173,
country: 'Russia',
country_code: 'RU',
synced_at: now,
},
]
for (const node of [...hubs, ...offers, ...suppliers]) {
await upsertNode(node)
}
await upsertEdge({
_key: 'geo-demo-edge-1',
_from: 'nodes/logistics-demo-hub-1',
_to: 'nodes/logistics-demo-hub-2',
to_uuid: 'logistics-demo-hub-2',
to_name: 'Demo Moscow Hub',
to_latitude: 55.755826,
to_longitude: 37.6173,
distance_km: 3950,
travel_time_seconds: 864000,
transport_type: 'rail',
})
await upsertEdge({
_key: 'geo-demo-edge-2',
_from: 'nodes/logistics-demo-hub-1',
_to: 'nodes/logistics-demo-hub-3',
to_uuid: 'logistics-demo-hub-3',
to_name: 'Demo Urumqi Hub',
to_latitude: 43.825592,
to_longitude: 87.616848,
distance_km: 1050,
travel_time_seconds: 172800,
transport_type: 'auto',
})
console.log(`Seeded geo demo data: hubs ${hubs.length}, offers ${offers.length}, suppliers ${suppliers.length}`)