← 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();
}
})();