120 lines
3.8 KiB
TypeScript
120 lines
3.8 KiB
TypeScript
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);
|
|
});
|