Adds scripts/seed.ts for fresh self-hosted installs, scripts/seed-tenant.ts for cloud provisioner use, and scripts/ai-worker.ts adapted from AHCR with improved theme prompts, name filtering, and WORKER_API_KEY guard. Installs tsx as a dev dependency. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
53 lines
2.0 KiB
TypeScript
53 lines
2.0 KiB
TypeScript
import { drizzle } from 'drizzle-orm/mysql2';
|
|
import mysql from 'mysql2/promise';
|
|
import { hash } from '@node-rs/argon2';
|
|
import * as schema from '../src/lib/server/schema';
|
|
|
|
const args = process.argv.slice(2);
|
|
const flags: Record<string, string> = {};
|
|
for (let i = 0; i < args.length; i += 2) {
|
|
flags[args[i].replace('--', '')] = args[i + 1];
|
|
}
|
|
|
|
async function seedTenant() {
|
|
const { email, name, password, orgName } = flags;
|
|
if (!email || !name || !password || !orgName) {
|
|
console.error('Usage: npx tsx scripts/seed-tenant.ts --email X --name X --password X --orgName X');
|
|
process.exit(1);
|
|
}
|
|
|
|
const pool = mysql.createPool({ uri: process.env.DATABASE_URL });
|
|
const db = drizzle(pool, { schema, mode: 'default' });
|
|
|
|
const passwordHash = await hash(password);
|
|
await db.insert(schema.users).values({
|
|
email,
|
|
passwordHash,
|
|
name,
|
|
role: 'sysadmin',
|
|
active: true,
|
|
mustChangePassword: true
|
|
});
|
|
|
|
const orgConfigDefaults = [
|
|
{ key: 'branding', value: { primaryColor: '#0d9488', primaryColorLight: '#14b8a6', primaryColorDark: '#0f766e', accentColor: '#f59e0b', accentColorLight: '#fbbf24', accentColorDark: '#d97706', logoUrl: '' } },
|
|
{ key: 'org_info', value: { name: orgName, tagline: '', city: '', state: '', phone: '', email, facebookUrl: '', instagramUrl: '' } },
|
|
{ key: 'locale', value: { language: 'en', currency: 'USD', dateFormat: 'MM/DD/YYYY' } },
|
|
{ key: 'applications', value: { adoptionEnabled: true, fosterEnabled: true, volunteerEnabled: true, surrenderEnabled: true, adoptionFee: 250 } },
|
|
{ key: 'setup_complete', value: false }
|
|
];
|
|
for (const row of orgConfigDefaults) {
|
|
await db.insert(schema.orgConfig).values({ key: row.key, value: row.value });
|
|
}
|
|
|
|
const intakeSources = ['Owner Surrender', 'Stray', 'Transfer', 'Born in Care', 'Other'];
|
|
for (const sourceName of intakeSources) {
|
|
await db.insert(schema.intakeSources).values({ name: sourceName });
|
|
}
|
|
|
|
console.log(`Tenant seeded: ${email} / [password provided] for ${orgName}`);
|
|
await pool.end();
|
|
}
|
|
|
|
seedTenant().catch(console.error);
|