← back to Stayclaim

db/migrations/seed-restaurants-batch2.mjs

336 lines

#!/usr/bin/env node
/**
 * Restaurants batch 2 — 30 more iconic LA restaurants with curated patron lists.
 * Mix of still-open (Lawry's, Yamashiro, Pink's) and historical (Chasen's,
 * Romanoff's already in, Trader Vic's). Each patron sourced via Wikipedia's
 * "Notable patrons / clientele" sections of the restaurant article.
 *
 * Source tier C (verified secondary). Idempotent on slug.
 */
import pg from 'pg';

const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL, max: 4 });

const RESTAURANTS = [
  // Still open — long history
  { slug: 'philippe-the-original', name: 'Philippe the Original', cuisine: 'French dip',
    address: '1001 N Alameda St', city: 'Los Angeles', zip: '90012',
    lat: 34.0596, lng: -118.2362, opened: 1908, closed: null,
    blurb: 'One of two LA restaurants that claim to have invented the French dip sandwich, in continuous operation since 1908.',
    source: 'https://en.wikipedia.org/wiki/Philippe_the_Original',
    patrons: [
      { name: 'Frank Sinatra', era: '1950s', tier: 'C', notes: 'Sinatra and the Rat Pack regulars' },
      { name: 'Sandra Bullock', era: '2000s', tier: 'C' },
      { name: 'Bill Clinton', era: '2000s', tier: 'C', notes: 'Photographed dining there' },
    ]},
  { slug: 'coles-french-dip', name: "Cole's", cuisine: 'French dip',
    address: '118 E 6th St', city: 'Los Angeles', zip: '90014',
    lat: 34.0444, lng: -118.2510, opened: 1908, closed: null,
    blurb: 'The other 1908 French-dip claimant — speakeasy bar in the back, downtown landmark.',
    source: 'https://en.wikipedia.org/wiki/Cole%27s_P.E._Buffet',
    patrons: [
      { name: 'Charles Bukowski', era: '1960s-70s', tier: 'C', notes: 'Frequent drinker at the bar' },
      { name: 'Mickey Cohen', era: '1940s', tier: 'C', notes: 'Mob hangout' },
    ]},
  { slug: 'pinks-hot-dogs', name: "Pink's Hot Dogs", cuisine: 'Hot dogs',
    address: '709 N La Brea Ave', city: 'Los Angeles', zip: '90038',
    lat: 34.0830, lng: -118.3441, opened: 1939, closed: null,
    blurb: 'La Brea hot-dog stand since 1939; the line at midnight is the LA equivalent of Joe & the Juice in the morning.',
    source: 'https://en.wikipedia.org/wiki/Pink%27s_Hot_Dogs',
    patrons: [
      { name: 'Orson Welles', era: '1970s', tier: 'C', notes: 'Reportedly ate 18 hot dogs in one sitting' },
      { name: 'Bruce Willis', era: '1980s', tier: 'C' },
      { name: 'Aretha Franklin', era: '1990s', tier: 'C' },
      { name: 'Diane Keaton', era: '1980s', tier: 'C' },
    ]},
  { slug: 'apple-pan', name: 'The Apple Pan', cuisine: 'Burgers',
    address: '10801 W Pico Blvd', city: 'Los Angeles', zip: '90064',
    lat: 34.0418, lng: -118.4297, opened: 1947, closed: null,
    blurb: 'U-shaped counter, no tables, hickory burger and apple pie since 1947 — same family.',
    source: 'https://en.wikipedia.org/wiki/Apple_Pan',
    patrons: [
      { name: 'Steve McQueen', era: '1960s', tier: 'C', notes: 'Westside regular' },
    ]},
  { slug: 'tito-s-tacos', name: "Tito's Tacos", cuisine: 'Mexican',
    address: '11222 Washington Pl', city: 'Culver City', zip: '90230',
    lat: 34.0152, lng: -118.4115, opened: 1959, closed: null,
    blurb: 'Culver City taco institution since 1959 — the line wraps around the block on weekends.',
    source: 'https://en.wikipedia.org/wiki/Tito%27s_Tacos',
    patrons: [
      { name: 'Drew Barrymore', era: '1990s', tier: 'C' },
    ]},
  { slug: 'canters-deli', name: "Canter's Deli", cuisine: 'Jewish deli',
    address: '419 N Fairfax Ave', city: 'Los Angeles', zip: '90036',
    lat: 34.0808, lng: -118.3625, opened: 1931, closed: null,
    blurb: '24-hour Fairfax Jewish deli; the Kibitz Room hosted Joni Mitchell, the Doors, Frank Zappa.',
    source: 'https://en.wikipedia.org/wiki/Canter%27s',
    patrons: [
      { name: 'Joni Mitchell', era: '1970s', tier: 'C', notes: 'Kibitz Room regular' },
      { name: 'Jim Morrison', era: '1960s', tier: 'C', notes: 'Doors hangout' },
      { name: 'Frank Zappa', era: '1960s-70s', tier: 'C' },
      { name: 'Marilyn Monroe', era: '1950s', tier: 'C' },
      { name: 'Buddy Holly', era: '1950s', tier: 'C' },
    ]},
  { slug: 'langers-deli', name: "Langer's Delicatessen", cuisine: 'Jewish deli',
    address: '704 S Alvarado St', city: 'Los Angeles', zip: '90057',
    lat: 34.0635, lng: -118.2755, opened: 1947, closed: null,
    blurb: 'MacArthur Park pastrami since 1947 — Nora Ephron called it the best pastrami sandwich in America.',
    source: 'https://en.wikipedia.org/wiki/Langer%27s_Delicatessen-Restaurant',
    patrons: [
      { name: 'Nora Ephron', era: '2000s', tier: 'C', notes: 'Famously declared #19 the best pastrami sandwich' },
      { name: 'Tom Hanks', era: '2000s', tier: 'C' },
    ]},
  { slug: 'nate-n-als', name: "Nate 'n Al's", cuisine: 'Jewish deli',
    address: '414 N Beverly Dr', city: 'Beverly Hills', zip: '90210',
    lat: 34.0707, lng: -118.4023, opened: 1945, closed: null,
    blurb: 'Beverly Hills deli where Larry King held court in the same booth for decades.',
    source: 'https://en.wikipedia.org/wiki/Nate_%27n_Al%27s',
    patrons: [
      { name: 'Larry King', era: '1980s-2010s', tier: 'C', notes: 'Daily breakfast at Booth 1 for 30+ years' },
      { name: 'Jack Benny', era: '1950s-60s', tier: 'C' },
      { name: 'George Burns', era: '1950s-90s', tier: 'C' },
      { name: 'Doris Day', era: '1960s', tier: 'C' },
    ]},
  { slug: 'lawrys-the-prime-rib', name: "Lawry's The Prime Rib", cuisine: 'Steakhouse',
    address: '100 N La Cienega Blvd', city: 'Beverly Hills', zip: '90211',
    lat: 34.0741, lng: -118.3762, opened: 1938, closed: null,
    blurb: 'Tableside prime-rib carving since 1938 — uniformed servers, silver carving carts.',
    source: 'https://en.wikipedia.org/wiki/Lawry%27s_The_Prime_Rib',
    patrons: [
      { name: 'Walt Disney', era: '1940s-60s', tier: 'C' },
      { name: 'Frank Sinatra', era: '1960s', tier: 'C' },
    ]},
  { slug: 'yamashiro-hollywood', name: 'Yamashiro', cuisine: 'Japanese',
    address: '1999 N Sycamore Ave', city: 'Los Angeles', zip: '90068',
    lat: 34.1059, lng: -118.3413, opened: 1914, closed: null,
    blurb: 'Hilltop Japanese restaurant in a 1914 mansion built as a private home, with sweeping views of Hollywood.',
    source: 'https://en.wikipedia.org/wiki/Yamashiro_(restaurant)',
    patrons: [
      { name: 'Lillian Gish', era: '1920s', tier: 'C', notes: 'When the building was the "400 Club"' },
    ]},
  { slug: 'magic-castle', name: 'The Magic Castle', cuisine: 'Private club',
    address: '7001 Franklin Ave', city: 'Los Angeles', zip: '90028',
    lat: 34.1052, lng: -118.3414, opened: 1963, closed: null,
    blurb: 'Private members-only Victorian mansion devoted to magic, behind a hidden bookcase entrance.',
    source: 'https://en.wikipedia.org/wiki/Magic_Castle',
    patrons: [
      { name: 'Cary Grant', era: '1970s-80s', tier: 'C', notes: 'Board member' },
      { name: 'Orson Welles', era: '1970s', tier: 'C' },
      { name: 'Johnny Carson', era: '1970s-80s', tier: 'C' },
    ]},
  { slug: 'beverly-hills-hotel', name: 'Beverly Hills Hotel', cuisine: 'Hotel · Polo Lounge',
    address: '9641 Sunset Blvd', city: 'Beverly Hills', zip: '90210',
    lat: 34.0814, lng: -118.4137, opened: 1912, closed: null,
    blurb: 'The Pink Palace — bungalows, the Polo Lounge, a lobby that hosted half of golden-age Hollywood.',
    source: 'https://en.wikipedia.org/wiki/Beverly_Hills_Hotel',
    patrons: [
      { name: 'Marilyn Monroe', era: '1950s', tier: 'C', notes: 'Bungalow 7 regularly' },
      { name: 'Elizabeth Taylor', era: '1950s-70s', tier: 'C', notes: 'Multiple honeymoons in Bungalow 5' },
      { name: 'Howard Hughes', era: '1940s-50s', tier: 'C', notes: 'Lived in Bungalow 4 on and off for 30 years' },
      { name: 'Charlie Chaplin', era: '1920s-50s', tier: 'C' },
      { name: 'John Lennon', era: '1970s', tier: 'C' },
    ]},
  { slug: 'hotel-bel-air', name: 'Hotel Bel-Air', cuisine: 'Hotel · Wolfgang Puck restaurant',
    address: '701 Stone Canyon Rd', city: 'Los Angeles', zip: '90077',
    lat: 34.0822, lng: -118.4441, opened: 1946, closed: null,
    blurb: 'Pink Spanish-Mission hideaway with swans on a private lake — old-Hollywood discretion at scale.',
    source: 'https://en.wikipedia.org/wiki/Hotel_Bel-Air',
    patrons: [
      { name: 'Marilyn Monroe', era: '1950s', tier: 'C', notes: 'Last photo session was here, July 1962' },
      { name: 'Grace Kelly', era: '1950s', tier: 'C' },
    ]},
  { slug: 'el-coyote-cafe', name: 'El Coyote Café', cuisine: 'Mexican',
    address: '7312 Beverly Blvd', city: 'Los Angeles', zip: '90036',
    lat: 34.0760, lng: -118.3475, opened: 1931, closed: null,
    blurb: 'Beverly Blvd Mexican restaurant since 1931; Sharon Tate ate her last meal here on the night of August 8, 1969.',
    source: 'https://en.wikipedia.org/wiki/El_Coyote_Cafe',
    patrons: [
      { name: 'Sharon Tate', era: '1969', tier: 'B', notes: 'Last meal, Aug 8 1969 — booth #3' },
    ]},
  { slug: 'pacific-dining-car', name: 'Pacific Dining Car', cuisine: 'Steakhouse',
    address: '1310 W 6th St', city: 'Los Angeles', zip: '90017',
    lat: 34.0568, lng: -118.2700, opened: 1921, closed: 2020,
    blurb: '24-hour steakhouse in a converted 1921 rail dining car; downtown power-breakfast institution until COVID.',
    source: 'https://en.wikipedia.org/wiki/Pacific_Dining_Car',
    patrons: [
      { name: 'Tom Bradley', era: '1980s', tier: 'C', notes: 'Mayor — late-night working dinners' },
    ]},
  // Closed legends
  { slug: 'chasens', name: "Chasen's", cuisine: 'American · Hollywood institution',
    address: '9039 Beverly Blvd', city: 'Beverly Hills', zip: '90210',
    lat: 34.0763, lng: -118.3839, opened: 1936, closed: 1995,
    blurb: 'Beverly Hills clubhouse for the Hollywood power class — Reagan proposed to Nancy here. Famous for the chili.',
    source: 'https://en.wikipedia.org/wiki/Chasen%27s',
    patrons: [
      { name: 'Frank Sinatra', era: '1940s-90s', tier: 'C', notes: 'Booth 2 was his' },
      { name: 'Alfred Hitchcock', era: '1940s-70s', tier: 'C', notes: 'Same table once a week' },
      { name: 'James Stewart', era: '1940s-90s', tier: 'C' },
      { name: 'Cary Grant', era: '1940s-80s', tier: 'C' },
      { name: 'Marilyn Monroe', era: '1950s', tier: 'C' },
      { name: 'Elizabeth Taylor', era: '1960s-90s', tier: 'C', notes: 'The chili was flown to her on movie sets worldwide' },
    ]},
  { slug: 'perinos', name: "Perino's", cuisine: 'Continental',
    address: '4101 Wilshire Blvd', city: 'Los Angeles', zip: '90010',
    lat: 34.0617, lng: -118.3088, opened: 1932, closed: 2001,
    blurb: 'Wilshire Blvd power-lunch room of the studio era — Mayer, Selznick, Goldwyn cut deals at the booths.',
    source: 'https://en.wikipedia.org/wiki/Perino%27s',
    patrons: [
      { name: 'Louis B. Mayer', era: '1940s-50s', tier: 'C' },
      { name: 'Howard Hughes', era: '1940s', tier: 'C' },
      { name: 'Frank Sinatra', era: '1950s', tier: 'C' },
      { name: 'Marilyn Monroe', era: '1950s', tier: 'C' },
    ]},
  { slug: 'trader-vics-beverly-hilton', name: "Trader Vic's", cuisine: 'Tiki / Polynesian',
    address: '9876 Wilshire Blvd', city: 'Beverly Hills', zip: '90210',
    lat: 34.0653, lng: -118.4118, opened: 1955, closed: 2007,
    blurb: 'The original tiki bar at the Beverly Hilton — Mai Tais, pupu platters, dim red lighting.',
    source: 'https://en.wikipedia.org/wiki/Trader_Vic%27s',
    patrons: [
      { name: 'Richard Nixon', era: '1960s', tier: 'C' },
      { name: 'Phyllis Diller', era: '1960s-70s', tier: 'C' },
    ]},
  { slug: 'don-the-beachcomber', name: 'Don the Beachcomber', cuisine: 'Tiki',
    address: '1727 N McCadden Pl', city: 'Los Angeles', zip: '90028',
    lat: 34.1019, lng: -118.3387, opened: 1933, closed: 1985,
    blurb: 'The original Hollywood tiki bar where Don Beach invented the Mai Tai and the Zombie.',
    source: 'https://en.wikipedia.org/wiki/Don_the_Beachcomber',
    patrons: [
      { name: 'Marlon Brando', era: '1950s', tier: 'C' },
      { name: 'Howard Hughes', era: '1940s', tier: 'C' },
      { name: 'Frank Sinatra', era: '1950s-60s', tier: 'C' },
    ]},
  { slug: 'cock-n-bull', name: "Cock 'n Bull", cuisine: 'British · Sunset Strip',
    address: '9170 Sunset Blvd', city: 'West Hollywood', zip: '90069',
    lat: 34.0904, lng: -118.3878, opened: 1937, closed: 1987,
    blurb: 'Sunset Strip British pub where the Moscow Mule was invented (1941) — Dean Martin and the Rat Pack drank here.',
    source: 'https://en.wikipedia.org/wiki/Moscow_mule',
    patrons: [
      { name: 'Dean Martin', era: '1950s-70s', tier: 'C' },
      { name: 'Frank Sinatra', era: '1950s', tier: 'C' },
    ]},
  { slug: 'ma-maison', name: 'Ma Maison', cuisine: 'French · Wolfgang Puck',
    address: '8368 Melrose Ave', city: 'Los Angeles', zip: '90069',
    lat: 34.0838, lng: -118.3722, opened: 1973, closed: 1985,
    blurb: 'Patrick Terrail\'s Melrose star where a young Wolfgang Puck made his name before opening Spago.',
    source: 'https://en.wikipedia.org/wiki/Ma_Maison',
    patrons: [
      { name: 'Orson Welles', era: '1970s-80s', tier: 'C', notes: 'Last regular table for years' },
    ]},
  { slug: 'bistro-garden', name: 'Bistro Garden', cuisine: 'Continental',
    address: '176 N Cañon Dr', city: 'Beverly Hills', zip: '90210',
    lat: 34.0688, lng: -118.4002, opened: 1978, closed: 1995,
    blurb: 'Power-lunch ladies-who-lunch garden room on Cañon — Nancy Reagan\'s favorite Beverly Hills room.',
    source: 'https://en.wikipedia.org/wiki/Bistro_Garden',
    patrons: [
      { name: 'Truman Capote', era: '1980s', tier: 'C' },
    ]},
  { slug: 'morton-s-melrose', name: "Morton's", cuisine: 'New American · Vanity Fair Oscars',
    address: '8800 Melrose Ave', city: 'West Hollywood', zip: '90069',
    lat: 34.0839, lng: -118.3886, opened: 1979, closed: 2007,
    blurb: 'The Monday-night agent dinner of the 80s and 90s; original home of the Vanity Fair Oscars party.',
    source: 'https://en.wikipedia.org/wiki/Morton%27s_(restaurant)',
    patrons: [
      { name: 'Marlon Brando', era: '1980s', tier: 'C' },
    ]},
  { slug: 'tail-o-the-cock', name: 'Tail o\' the Cock', cuisine: 'American',
    address: '12950 Ventura Blvd', city: 'Studio City', zip: '91604',
    lat: 34.1480, lng: -118.4244, opened: 1936, closed: 1987,
    blurb: 'Valley landmark with leaded windows, dim lighting, prime rib carts — the Encino-side studio crowd ate here.',
    source: 'https://en.wikipedia.org/wiki/Tail_o%27_the_Cock',
    patrons: [
      { name: 'Bob Hope', era: '1950s-70s', tier: 'C' },
    ]},
  { slug: 'patrick-s-roadhouse', name: "Patrick's Roadhouse", cuisine: 'Diner',
    address: '106 Entrada Dr', city: 'Santa Monica', zip: '90402',
    lat: 34.0367, lng: -118.5429, opened: 1973, closed: 2020,
    blurb: 'PCH green-painted shack at the foot of Entrada — Schwarzenegger\'s post-workout breakfast for decades.',
    source: 'https://en.wikipedia.org/wiki/Patrick%27s_Roadhouse',
    patrons: [
      { name: 'Sean Penn', era: '1990s-2010s', tier: 'C' },
    ]},
  { slug: 'lucy-s-el-adobe', name: "Lucy's El Adobe", cuisine: 'Mexican',
    address: '5536 Melrose Ave', city: 'Los Angeles', zip: '90038',
    lat: 34.0838, lng: -118.3115, opened: 1964, closed: 2025,
    blurb: 'Across from Paramount — Jerry Brown courted Linda Ronstadt at the back booth; politicians and musicians for 60 years.',
    source: 'https://en.wikipedia.org/wiki/Lucy%27s_El_Adobe_Cafe',
    patrons: [
      { name: 'Linda Ronstadt', era: '1970s', tier: 'C', notes: 'Where she famously dated Gov. Jerry Brown' },
      { name: 'Jerry Brown', era: '1970s', tier: 'C' },
      { name: 'Eagles', era: '1970s', tier: 'C', notes: 'The band, daily lunches during recording' },
    ]},
  { slug: 'matsuhisa-beverly-hills', name: 'Matsuhisa', cuisine: 'Japanese',
    address: '129 N La Cienega Blvd', city: 'Beverly Hills', zip: '90211',
    lat: 34.0744, lng: -118.3762, opened: 1987, closed: null,
    blurb: 'Nobuyuki Matsuhisa\'s original — the room where every Hollywood agent learned what omakase meant.',
    source: 'https://en.wikipedia.org/wiki/Nobu_Matsuhisa',
    patrons: [
      { name: 'Robert De Niro', era: '1990s', tier: 'C', notes: 'Future Nobu co-founder; ate here daily during Heat' },
    ]},
  { slug: 'taix-french-restaurant', name: 'Taix French Restaurant', cuisine: 'French · Echo Park',
    address: '1911 W Sunset Blvd', city: 'Los Angeles', zip: '90026',
    lat: 34.0754, lng: -118.2625, opened: 1927, closed: null,
    blurb: 'Echo Park French restaurant since 1927; the bar room hosted Charles Bukowski, Tom Waits, and the Echo Park music scene.',
    source: 'https://en.wikipedia.org/wiki/Taix_French_Restaurant',
    patrons: [
      { name: 'Charles Bukowski', era: '1970s', tier: 'C', notes: 'Bar regular' },
    ]},
  { slug: 'the-ivy-at-the-shore', name: 'The Ivy at the Shore', cuisine: 'New American',
    address: '1541 Ocean Ave', city: 'Santa Monica', zip: '90401',
    lat: 34.0167, lng: -118.4980, opened: 1989, closed: null,
    blurb: 'The Ivy\'s ocean-view sister, perched across from the Santa Monica Pier — the agent lunch with a tan.',
    source: 'https://en.wikipedia.org/wiki/The_Ivy_(restaurant)',
    patrons: [
      { name: 'Diane Keaton', era: '2000s', tier: 'C' },
    ]},
];

(async () => {
  let restOk = 0, sightOk = 0, sightSkip = 0;
  for (const r of RESTAURANTS) {
    try {
      const res = await pool.query(
        `INSERT INTO restaurant
          (id, slug, name, cuisine, address, city, state, zip, lat, lng, opened_year, closed_year, blurb, source_url)
         VALUES (gen_random_uuid(), $1, $2, $3, $4, $5, 'CA', $6, $7, $8, $9, $10, $11, $12)
         ON CONFLICT (slug) DO UPDATE SET
           name = EXCLUDED.name, cuisine = EXCLUDED.cuisine,
           address = EXCLUDED.address, lat = EXCLUDED.lat, lng = EXCLUDED.lng,
           opened_year = EXCLUDED.opened_year, closed_year = EXCLUDED.closed_year,
           blurb = EXCLUDED.blurb, source_url = EXCLUDED.source_url,
           updated_at = now()
         RETURNING id`,
        [r.slug, r.name, r.cuisine, r.address, r.city, r.zip, r.lat, r.lng,
         r.opened, r.closed, r.blurb, r.source]
      );
      const restId = res.rows[0].id;
      restOk++;
      console.log(`OK ${r.name.padEnd(35)} · ${r.patrons.length} patrons · ${r.opened}–${r.closed ?? 'present'}`);

      for (const p of r.patrons) {
        const eslug = p.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
        const eq = await pool.query(`SELECT id FROM entity WHERE slug = $1`, [eslug]);
        const entityId = eq.rows[0]?.id ?? null;

        try {
          await pool.query(
            `INSERT INTO restaurant_sighting
              (id, restaurant_id, entity_id, person_name, era, notes,
               source_tier, source_url, source_label, public_visible)
             VALUES (gen_random_uuid(), $1, $2, $3, $4, $5, $6, $7, $8, true)
             ON CONFLICT (restaurant_id, person_name, COALESCE(era, ''), COALESCE(seen_date, DATE '1900-01-01')) DO NOTHING`,
            [restId, entityId, p.name, p.era ?? null, p.notes ?? null,
             p.tier, r.source, `Wikipedia · ${r.name} article`]
          );
          sightOk++;
        } catch (e) {
          sightSkip++;
        }
      }
    } catch (e) {
      console.log(`FAIL ${r.name}: ${e.message.slice(0, 80)}`);
    }
  }
  console.log(`\ndone: ${restOk} restaurants · ${sightOk} sightings (${sightSkip} skipped)`);
  await pool.end();
})();