feat: add seed scripts and AI worker
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>
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user