spb/datacenterindex
Public
HTML 53.9%
TypeScript 44.5%
JavaScript 0.6%
SQL 0.5%
1/** Idempotent reference-data seeding (countries + metros). Safe to run on every deploy. */2import { sql, textArray, type Db } from "@dci/db";3import { COUNTRY_SEEDS } from "./countries.js";4import { METRO_SEEDS } from "./metros.js";56export interface SeedResult {7 countries: number;8 metros: number;9}1011export async function seedCountries(db: Db): Promise<number> {12 let n = 0;13 await db.transaction(async (tx) => {14 for (const c of COUNTRY_SEEDS) {15 await tx.execute(sql`insert into countries (iso2, iso3, slug, name, region, subregion, lat, lng)16 values (${c.iso2}, ${c.iso3}, ${c.slug}, ${c.name}, ${c.region}, ${c.subregion}, ${c.lat}, ${c.lng})17 on conflict (iso2) do update set iso3 = excluded.iso3, slug = excluded.slug, name = excluded.name, region = excluded.region, subregion = excluded.subregion,18 lat = coalesce(countries.lat, excluded.lat), lng = coalesce(countries.lng, excluded.lng), updated_at = now()`);19 n++;20 }21 });22 return n;23}2425export async function seedMetros(db: Db): Promise<number> {26 let n = 0;27 await db.transaction(async (tx) => {28 for (const m of METRO_SEEDS) {29 await tx.execute(sql`insert into metros (id, slug, name, country_iso2, region_name, lat, lng, radius_km, aliases, description)30 values (${m.id}, ${m.slug}, ${m.name}, ${m.countryIso2}, ${m.regionName}, ${m.lat}, ${m.lng}, ${m.radiusKm}, ${textArray(m.aliases)}::text[], ${m.description})31 on conflict (id) do update set slug = excluded.slug, name = excluded.name, country_iso2 = excluded.country_iso2, region_name = excluded.region_name, lat = excluded.lat, lng = excluded.lng,32 radius_km = excluded.radius_km, aliases = excluded.aliases, description = coalesce(metros.description, excluded.description), updated_at = now()`);33 n++;34 }35 });36 return n;37}3839export async function seedReferenceData(db: Db): Promise<SeedResult> {40 const countries = await seedCountries(db);41 const metros = await seedMetros(db);42 return { countries, metros };43}4445export { COUNTRY_SEEDS, METRO_SEEDS };46