SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
4 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
2.0 KB · 46 lines typescript
Raw Blame History
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