Files
fosterflow/scripts/seed-tenant.ts
T
justinandClaude Sonnet 4.6 c6b7d4d4eb 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>
2026-03-26 12:49:37 -05:00

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);