← back to Designerrepresentatives

db/seed.js

65 lines

// Seed designer_reps from data/reps.json into Postgres.
// Idempotent: ON CONFLICT (slug) DO UPDATE so reruns refresh fields.
require('dotenv').config();
const fs = require('fs');
const path = require('path');
const { Pool } = require('pg');

const pool = new Pool();

function slugify(s) {
  return String(s || '')
    .toLowerCase()
    .replace(/[^a-z0-9]+/g, '-')
    .replace(/^-+|-+$/g, '')
    .slice(0, 80);
}

(async () => {
  const reps = JSON.parse(
    fs.readFileSync(path.join(__dirname, '..', 'data', 'reps.json'), 'utf8')
  );
  const client = await pool.connect();
  try {
    await client.query('BEGIN');
    let inserted = 0;
    for (const r of reps) {
      const slug = slugify(`${r.agency}-${r.city}`);
      await client.query(
        `INSERT INTO designer_reps
           (slug, name, agency, city, territories, lines, vertical, contact_url, is_published)
         VALUES ($1,$2,$3,$4,$5,$6,$7,$8,TRUE)
         ON CONFLICT (slug) DO UPDATE SET
           name = EXCLUDED.name,
           agency = EXCLUDED.agency,
           city = EXCLUDED.city,
           territories = EXCLUDED.territories,
           lines = EXCLUDED.lines,
           vertical = EXCLUDED.vertical,
           contact_url = EXCLUDED.contact_url,
           updated_at = NOW()`,
        [
          slug,
          r.name,
          r.agency,
          r.city || null,
          r.territories || [],
          r.lines || [],
          r.vertical || [],
          r.contact_url || null,
        ]
      );
      inserted++;
    }
    await client.query('COMMIT');
    console.log(`seeded ${inserted} designer_reps rows`);
  } catch (e) {
    await client.query('ROLLBACK');
    console.error('seed failed', e);
    process.exitCode = 1;
  } finally {
    client.release();
    await pool.end();
  }
})();