This commit is contained in:
+2
-1
@@ -5,7 +5,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"start": "node dist/index.js",
|
"start": "node dist/index.js",
|
||||||
"dev": "tsx --watch src/index.ts"
|
"dev": "tsx --watch src/index.ts",
|
||||||
|
"seed:demo": "tsx scripts/seed-demo.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fastify/cors": "^11.2.0",
|
"@fastify/cors": "^11.2.0",
|
||||||
|
|||||||
@@ -0,0 +1,167 @@
|
|||||||
|
import { aql } from 'arangojs'
|
||||||
|
import { ensureGraph, getDb } from '../src/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}`)
|
||||||
Reference in New Issue
Block a user