import { config } from 'dotenv'; import { resolve } from 'node:path'; import * as bcrypt from 'bcrypt'; import { PrismaClient as PlatformPrisma } from '../src/generated/platform'; import { PrismaClient as TenantPrisma } from '../src/generated/tenant'; import { createMysqlDatabase, databaseForSlug, pushTenantSchema } from '../src/tenancy/provision-database'; import { urlForDatabase } from '../src/tenancy/tenant-url'; config({ path: resolve(__dirname, '../../.env') }); config({ path: resolve(__dirname, '../.env') }); async function upsertUser( db: TenantPrisma, email: string, name: string, password: string, role: 'ADMIN' | 'MANAGER' | 'OPERATOR', ) { const passwordHash = await bcrypt.hash(password, 10); await db.user.upsert({ where: { email }, update: { name, passwordHash, role, issuedPassword: password }, create: { email, name, passwordHash, role, issuedPassword: password }, }); } async function main() { const platform = new PlatformPrisma(); const slug = 'demo'; const database = databaseForSlug(slug); const platformEmail = process.env.PLATFORM_ADMIN_EMAIL ?? 'tina.r@example.net'; const platformPassword = process.env.PLATFORM_ADMIN_PASSWORD ?? 'SinkaPlatform!1'; await platform.platformUser.upsert({ where: { email: platformEmail }, update: { passwordHash: await bcrypt.hash(platformPassword, 10), name: 'Sinka Platform' }, create: { email: platformEmail, name: 'Sinka Platform', passwordHash: await bcrypt.hash(platformPassword, 10), }, }); let tenant = await platform.tenant.findUnique({ where: { slug } }); if (!tenant) { await createMysqlDatabase(database); await pushTenantSchema(database); tenant = await platform.tenant.create({ data: { name: 'Sinka Demo', slug, database }, }); } else { await pushTenantSchema(tenant.database); } const others = await platform.tenant.findMany({ where: { slug: { not: slug } } }); for (const item of others) { await pushTenantSchema(item.database); } const db = new TenantPrisma({ datasources: { db: { url: urlForDatabase(tenant.database) } }, }); await upsertUser( db, process.env.DEMO_ADMIN_EMAIL ?? 'xena.w@example.org', 'Ana Admin', process.env.DEMO_ADMIN_PASSWORD ?? 'SinkaAdmin!1', 'ADMIN', ); await upsertUser( db, process.env.DEMO_MANAGER_EMAIL ?? 'james.b@example.com', 'Marcos Manager', process.env.DEMO_MANAGER_PASSWORD ?? 'SinkaManager!1', 'MANAGER', ); await upsertUser( db, process.env.DEMO_OPERATOR_EMAIL ?? 'ursula.b@example.com', 'Olga Operador', process.env.DEMO_OPERATOR_PASSWORD ?? 'SinkaOperador!1', 'OPERATOR', ); for (const customer of [ { name: 'Mercado Aurora', document: '12.345.678/0001-90', city: 'São Paulo', state: 'SP' }, { name: 'Café do Litoral', document: '98.765.432/0001-10', city: 'Santos', state: 'SP' }, ]) { const existing = await db.customer.findFirst({ where: { name: customer.name } }); if (!existing) { await db.customer.create({ data: customer }); } } const carriers = [ { name: 'Litoral Mix', baseFee: 45, pricePerKg: 1.8, pricePerKm: 0.85, adValoremRate: 0.003 }, { name: 'Rota Sul', baseFee: 32, pricePerKg: 1.4, pricePerKm: 0.72, adValoremRate: 0.004 }, { name: 'Express RJ', baseFee: 60, pricePerKg: 2.2, pricePerKm: 1.1, adValoremRate: 0.002 }, ]; for (const carrier of carriers) { const existing = await db.carrier.findFirst({ where: { name: carrier.name } }); if (existing) { await db.carrier.update({ where: { id: existing.id }, data: carrier }); } else { await db.carrier.create({ data: carrier }); } } await db.$disconnect(); await platform.$disconnect(); console.log('Seed ok: platform + tenant demo (admin, manager, operador).'); } main().catch(async (error) => { console.error(error); process.exit(1); });