← back to Homesonspec

apps/workers/scripts/register-pacific-regionals.ts

91 lines

/**
 * Register Pacific-region REGIONAL builders as tracked onboarding targets.
 * Upserts Builder + SourceRegistry rows (idempotent by slug / key), INACTIVE:
 *   collectionMethod=CRAWL, mediaRights=NONE (facts-only), active=false,
 *   health=PAUSED — so NOTHING is crawled until each builder gets a bespoke
 *   adapter. This just makes them visible "coming soon" targets (same shape as
 *   the existing 30 national builders) so the overnight loop can prioritize them.
 * Run: DATABASE_URL=… pnpm --filter @homesonspec/workers exec tsx scripts/register-pacific-regionals.ts
 */
import { prisma } from "@homesonspec/database";

type Row = { name: string; site: string | null; states: string; note?: string };
const ROWS: Row[] = [
  // California regionals
  { name: "Trumark Homes", site: "trumarkhomes.com", states: "CA;NV" },
  { name: "The New Home Company", site: "newhomeco.com", states: "CA;AZ;OR" },
  { name: "Warmington Residential", site: "homesbywarmington.com", states: "CA;NV" },
  { name: "Elliott Homes", site: "elliotthomes.com", states: "CA;AZ" },
  { name: "Christopherson Builders", site: "christophersonbuilders.com", states: "CA" },
  { name: "City Ventures", site: "cityventures.com", states: "CA" },
  { name: "Signature Homes", site: "sighomes.com", states: "CA" },
  { name: "Discovery Homes", site: "discoveryhomes.com", states: "CA" },
  { name: "Van Daele Homes", site: "vandaele.com", states: "CA" },
  { name: "SummerHill Homes", site: "summerhillhomes.com", states: "CA" },
  { name: "DeNova Homes", site: "denovahomes.com", states: "CA" },
  { name: "Raymus Homes", site: "raymushomes.com", states: "CA" },
  { name: "JMC Homes", site: "jmchomes.com", states: "CA" },
  { name: "Wathen Castanos Homes", site: "wathencorp.com", states: "CA" },
  { name: "Granville Homes", site: "granvillehomes.com", states: "CA" },
  // Arizona regionals
  { name: "Fulton Homes", site: "fultonhomes.com", states: "AZ" },
  { name: "Camelot Homes", site: "camelothomes.com", states: "AZ" },
  { name: "Rosewood Homes", site: "rosewoodhomes.com", states: "AZ" },
  { name: "Cachet Homes", site: "cachethomes.net", states: "AZ" },
  { name: "Blandford Homes", site: "blandfordhomes.com", states: "AZ" },
  // WA / OR regionals
  { name: "Holt Homes", site: "holthomes.com", states: "WA;OR" },
  { name: "Stone Bridge Homes NW", site: "stonebridgehomesnw.com", states: "WA;OR" },
  { name: "Soundbuilt Homes", site: "soundbuilthomes.com", states: "WA" },
  { name: "Pahlisch Homes", site: "pahlischhomes.com", states: "OR;WA" },
  { name: "Sekisui House US", site: "sekisuihouse.com", states: "WA;OR" },
  // Nevada
  { name: "Harmony Homes", site: null, states: "NV", note: "recon-pending: verify NV Las Vegas domain before crawl" },
  // Seeno-family brands sharing the discoveryhomes.com feed (onboarded via discovery-homes-site adapter)
  { name: "Seeno Homes", site: "discoveryhomes.com", states: "CA;NV", note: "Seeno-family; served by discovery-homes-site adapter" },
  { name: "Sterling Homes", site: "discoveryhomes.com", states: "CA;ID", note: "Seeno-family; served by discovery-homes-site adapter" },
  // Hawaii
  { name: "Castle & Cooke Homes", site: "castlecooke.com", states: "HI" },
  { name: "Gentry Homes", site: "gentryhawaii.com", states: "HI" },
  { name: "Alexander & Baldwin", site: "alexanderbaldwin.com", states: "HI" },
];

const slugify = (s: string) =>
  s.toLowerCase().replace(/&/g, "and").replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");

async function main() {
  let builders = 0, sources = 0;
  for (const r of ROWS) {
    const slug = slugify(r.name);
    const websiteUrl = r.site ? `https://www.${r.site}` : null;
    const builder = await prisma.builder.upsert({
      where: { slug },
      update: { name: r.name, websiteUrl, coverageArea: r.states },
      create: { slug, name: r.name, websiteUrl, coverageArea: r.states, isDemo: false },
    });
    builders++;
    const key = `${slug}-site`;
    await prisma.sourceRegistry.upsert({
      where: { key },
      update: { builderId: builder.id, baseUrl: websiteUrl, notes: r.note ?? "pacific-regional onboarding target; adapter pending" },
      create: {
        key,
        name: `${r.name} (builder website)`,
        builderId: builder.id,
        baseUrl: websiteUrl,
        collectionMethod: "CRAWL",
        mediaRights: "NONE",
        rateLimitRpm: 10,
        health: "PAUSED",
        active: false,
        notes: r.note ?? "pacific-regional onboarding target; adapter pending",
      },
    });
    sources++;
    console.log(`  ✓ ${r.name} (${slug}) ${r.site ?? "[no domain]"}`);
  }
  console.log(`\nregistered ${builders} builders + ${sources} source rows (all inactive/facts-only; no crawl until adapters built)`);
  await prisma.$disconnect();
}
main().catch(async (e) => { console.error(e); await prisma.$disconnect(); process.exit(1); });