- seed-beta-users.ts: 7 users (1 per ERP role), bcrypt 12, idempotent by email - seed-beta-demo-data.ts: 2 clients + 2 suppliers + 3 products ACTIVE (smeta LOCKED + 10 pricings) - ADM_GENERAL absent from Role enum → mapped to USER - All ДЕМО_ prefixed for visual identification - Login test 7/7 PASS, re-run safe (password NOT overwritten) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
68 lines
2.9 KiB
TypeScript
68 lines
2.9 KiB
TypeScript
import { PrismaClient, Role } from '@prisma/client';
|
|
import bcrypt from 'bcryptjs';
|
|
|
|
const prisma = new PrismaClient();
|
|
const BCRYPT_ROUNDS = 12;
|
|
|
|
const BETA_USERS: { email: string; name: string; nameRu: string; role: Role; password: string }[] = [
|
|
{ email: 'admin@metallcart.ru', name: 'Louis-André Gruart', nameRu: 'Луи-Андре Грюар', role: 'ADMIN', password: 'MetallKart_admin_2026!' },
|
|
{ email: 'direction-ops@metallcart.ru', name: 'Maksim (DIRECTION_OPS)',nameRu: 'Максим (DIRECTION_OPS)', role: 'DIRECTION_OPS', password: 'MetallKart_dirops_2026!' },
|
|
{ email: 'production@metallcart.ru', name: 'Darya (ADM_PRODUCTION)',nameRu: 'Дарья (ADM_PRODUCTION)', role: 'ADM_PRODUCTION', password: 'MetallKart_prod_2026!' },
|
|
{ email: 'achat@metallcart.ru', name: 'Evgeny (ACHETEUR)', nameRu: 'Евгений (ACHETEUR)', role: 'ACHETEUR', password: 'MetallKart_achat_2026!' },
|
|
{ email: 'commercial@metallcart.ru', name: 'Manager (COMMERCIAL)', nameRu: 'Менеджер коммерции', role: 'COMMERCIAL', password: 'MetallKart_com_2026!' },
|
|
{ email: 'direction-fin@metallcart.ru', name: 'FIN Director', nameRu: 'Финансовый директор', role: 'DIRECTION_FIN', password: 'MetallKart_dirfin_2026!' },
|
|
// ADM_GENERAL does not exist in Role enum — mapped to USER (closest generic role)
|
|
{ email: 'admin-general@metallcart.ru', name: 'General Admin', nameRu: 'Общая администрация', role: 'USER', password: 'MetallKart_admgen_2026!' },
|
|
];
|
|
|
|
async function main() {
|
|
console.log('=== SEED BETA USERS ===');
|
|
|
|
const validRoles = Object.values(Role);
|
|
|
|
let created = 0;
|
|
let skipped = 0;
|
|
|
|
for (const u of BETA_USERS) {
|
|
if (!validRoles.includes(u.role)) {
|
|
console.warn(` SKIP ${u.email} — role "${u.role}" does not exist in Role enum`);
|
|
skipped++;
|
|
continue;
|
|
}
|
|
|
|
const existing = await prisma.user.findUnique({ where: { email: u.email } });
|
|
if (existing) {
|
|
console.log(` EXISTS ${u.email} (role=${existing.role}) — password NOT overwritten`);
|
|
skipped++;
|
|
continue;
|
|
}
|
|
|
|
const hash = bcrypt.hashSync(u.password, BCRYPT_ROUNDS);
|
|
await prisma.user.create({
|
|
data: {
|
|
email: u.email,
|
|
password: hash,
|
|
name: u.name,
|
|
nameRu: u.nameRu,
|
|
role: u.role,
|
|
active: true,
|
|
},
|
|
});
|
|
console.log(` CREATED ${u.email} (role=${u.role})`);
|
|
created++;
|
|
}
|
|
|
|
console.log(`\nDone: ${created} created, ${skipped} skipped`);
|
|
|
|
const total = await prisma.user.count({ where: { email: { endsWith: '@metallcart.ru' } } });
|
|
console.log(`Total @metallcart.ru users in DB: ${total}`);
|
|
|
|
if (total > 30) {
|
|
console.error('WARNING: More than 30 @metallcart.ru users — verify this is expected');
|
|
}
|
|
}
|
|
|
|
main()
|
|
.catch(e => { console.error(e); process.exit(1); })
|
|
.finally(() => prisma.$disconnect());
|