Files
telegram-shop/seed-standalone.ts
2026-08-05 18:48:25 +00:00

141 lines
11 KiB
TypeScript
Executable File

import { PrismaClient } from '@prisma/client';
const db = new PrismaClient();
function daysAgo(n: number) { return new Date(Date.now() - n * 86400000); }
function randInt(min: number, max: number) { return Math.floor(Math.random() * (max - min + 1)) + min; }
function randFloat(min: number, max: number, decimals: number) { return parseFloat((Math.random() * (max - min) + min).toFixed(decimals)); }
function pick<T>(arr: T[]): T { return arr[Math.floor(Math.random() * arr.length)]; }
async function main() {
console.log('Clearing tables...');
const tableOrder = ['purchase', 'transaction', 'cryptoWallet', 'auditLog', 'userState', 'product', 'subcategory', 'category', 'commissionPayment'];
for (const model of tableOrder) {
await (db as any)[model].deleteMany();
}
await db.tgUser.deleteMany();
await db.location.deleteMany();
const tables = ['purchases', 'transactions', 'crypto_wallets', 'audit_log', 'user_states', 'products', 'subcategories', 'categories', 'users', 'locations', 'commission_payments'];
for (const t of tables) {
try { await db.$executeRawUnsafe(`DELETE FROM sqlite_sequence WHERE name='${t}';`); } catch {}
}
console.log('Creating locations...');
const locMoscow = await db.location.create({ data: { country: 'Russia', city: 'Moscow', district: 'Center' } });
const locSPb = await db.location.create({ data: { country: 'Russia', city: 'Saint Petersburg', district: 'North' } });
const locBerlin = await db.location.create({ data: { country: 'Germany', city: 'Berlin', district: 'Mitte' } });
console.log('Creating categories...');
const catDigital = await db.category.create({ data: { name: 'Digital', locationId: locMoscow.id } });
const catPhysical = await db.category.create({ data: { name: 'Physical', locationId: locMoscow.id } });
const catPremium = await db.category.create({ data: { name: 'Premium', locationId: locSPb.id } });
const catVIP = await db.category.create({ data: { name: 'VIP', locationId: locSPb.id } });
const catStandard = await db.category.create({ data: { name: 'Standard', locationId: locBerlin.id } });
console.log('Creating subcategories...');
const subVPN = await db.subcategory.create({ data: { name: 'VPN', categoryId: catDigital.id } });
const subAccounts = await db.subcategory.create({ data: { name: 'Accounts', categoryId: catDigital.id } });
const subSoftware = await db.subcategory.create({ data: { name: 'Software', categoryId: catDigital.id } });
const subHardware = await db.subcategory.create({ data: { name: 'Hardware', categoryId: catPhysical.id } });
const subAccessories = await db.subcategory.create({ data: { name: 'Accessories', categoryId: catPhysical.id } });
const subAnnual = await db.subcategory.create({ data: { name: 'Annual', categoryId: catPremium.id } });
const subMonthly = await db.subcategory.create({ data: { name: 'Monthly', categoryId: catPremium.id } });
const subLifetime = await db.subcategory.create({ data: { name: 'Lifetime', categoryId: catVIP.id } });
const subExpress = await db.subcategory.create({ data: { name: 'Express', categoryId: catVIP.id } });
const subBasic = await db.subcategory.create({ data: { name: 'Basic', categoryId: catStandard.id } });
const subStarter = await db.subcategory.create({ data: { name: 'Starter', categoryId: catStandard.id } });
console.log('Creating users...');
const userData = [
{ username: 'alice', telegramId: '1001', country: 'Russia', city: 'Moscow', district: 'Center', totalBalance: 150.00, bonusBalance: 25.00, daysAgo: 28 },
{ username: 'bob', telegramId: '1002', country: 'Russia', city: 'Moscow', district: 'Center', totalBalance: 85.50, bonusBalance: 10.00, daysAgo: 25 },
{ username: 'charlie', telegramId: '1003', country: 'Russia', city: 'Saint Petersburg', district: 'North', totalBalance: 320.75, bonusBalance: 50.00, daysAgo: 22 },
{ username: 'diana', telegramId: '1004', country: 'Germany', city: 'Berlin', district: 'Mitte', totalBalance: 45.00, bonusBalance: 5.00, daysAgo: 20 },
{ username: 'evan', telegramId: '1005', country: 'Germany', city: 'Berlin', district: 'Mitte', totalBalance: 0.00, bonusBalance: 0.00, daysAgo: 18 },
{ username: 'frank', telegramId: '1006', country: 'Russia', city: 'Moscow', district: 'Center', totalBalance: 210.00, bonusBalance: 30.00, daysAgo: 15 },
{ username: 'grace', telegramId: '1007', country: 'Russia', city: 'Saint Petersburg', district: 'North', totalBalance: 75.25, bonusBalance: 15.00, daysAgo: 12 },
{ username: 'henry', telegramId: '1008', country: 'Germany', city: 'Berlin', district: 'Mitte', totalBalance: 500.00, bonusBalance: 100.00, daysAgo: 9 },
{ username: 'iris', telegramId: '1009', country: 'Russia', city: 'Moscow', district: 'Center', totalBalance: 0.00, bonusBalance: 0.00, daysAgo: 5 },
{ username: 'jack', telegramId: '1010', country: 'Germany', city: 'Berlin', district: 'Mitte', totalBalance: 33.00, bonusBalance: 5.00, daysAgo: 2 },
];
const users = [];
for (const u of userData) {
const user = await db.tgUser.create({
data: { telegramId: u.telegramId, username: u.username, country: u.country, city: u.city, district: u.district, totalBalance: u.totalBalance, bonusBalance: u.bonusBalance, createdAt: daysAgo(u.daysAgo) },
});
users.push(user);
}
const userMap = new Map(users.map((u) => [u.username, u]));
console.log('Creating products...');
const productsData = [
{ name: 'VPN Subscription 30d', price: 9.99, stock: 100, locationId: locMoscow.id, categoryId: catDigital.id, subcategoryId: subVPN.id },
{ name: 'VPN Subscription 90d', price: 24.99, stock: 50, locationId: locMoscow.id, categoryId: catDigital.id, subcategoryId: subAccounts.id },
{ name: 'USB Drive 64GB', price: 29.99, stock: 25, locationId: locMoscow.id, categoryId: catPhysical.id, subcategoryId: subHardware.id },
{ name: 'Premium Account 1 Year', price: 99.99, stock: 10, locationId: locSPb.id, categoryId: catPremium.id, subcategoryId: subAnnual.id },
{ name: 'VIP Access Lifetime', price: 199.99, stock: 5, locationId: locSPb.id, categoryId: catVIP.id, subcategoryId: subLifetime.id },
{ name: 'Premium Account 6 Months', price: 59.99, stock: 20, locationId: locSPb.id, categoryId: catPremium.id, subcategoryId: subMonthly.id },
{ name: 'Standard Package', price: 14.99, stock: 200, locationId: locBerlin.id, categoryId: catStandard.id, subcategoryId: subBasic.id },
{ name: 'Security Toolkit', price: 49.99, stock: 30, locationId: locMoscow.id, categoryId: catDigital.id, subcategoryId: subSoftware.id },
{ name: 'VIP Express Pass', price: 39.99, stock: 15, locationId: locSPb.id, categoryId: catVIP.id, subcategoryId: subExpress.id },
{ name: 'Starter Kit', price: 4.99, stock: 500, locationId: locBerlin.id, categoryId: catStandard.id, subcategoryId: subStarter.id },
];
const products = [];
for (const p of productsData) {
products.push(await db.product.create({ data: { name: p.name, price: p.price, quantityInStock: p.stock, locationId: p.locationId, categoryId: p.categoryId, subcategoryId: p.subcategoryId } }));
}
console.log('Creating purchases...');
const purchaseCount = randInt(25, 30);
const walletTypes = ['BTC', 'ETH', 'LTC', 'USDT', 'USDC'];
for (let i = 0; i < purchaseCount; i++) {
const user = users[i % users.length];
const product = products[i % products.length];
const qty = randInt(1, 3);
const r = Math.random();
const status = r < 0.7 ? 'completed' : r < 0.9 ? 'pending' : 'cancelled';
const txHash = status === 'completed' ? `0x${Array.from({ length: 64 }, () => randInt(0, 15).toString(16)).join('')}` : null;
await db.purchase.create({ data: { userId: user.id, productId: product.id, quantity: qty, totalPrice: parseFloat((product.price * qty).toFixed(2)), walletType: pick(walletTypes), txHash, purchaseDate: daysAgo(randInt(0, 29)), status } });
}
console.log('Creating wallets...');
const walletAssignments = [
{ username: 'alice', type: 'BTC' }, { username: 'alice', type: 'ETH' }, { username: 'bob', type: 'BTC' },
{ username: 'charlie', type: 'LTC' }, { username: 'diana', type: 'ETH' }, { username: 'frank', type: 'XRP' },
{ username: 'grace', type: 'BCH' }, { username: 'henry', type: 'DOGE' }, { username: 'iris', type: 'BTC' }, { username: 'jack', type: 'USDT' },
];
for (const w of walletAssignments) {
const user = userMap.get(w.username)!;
await db.cryptoWallet.create({ data: { userId: user.id, walletType: w.type, address: `0x${Array.from({ length: 40 }, () => randInt(0, 15).toString(16)).join('')}`, balance: randFloat(0.001, 5.0, 8) } });
}
console.log('Creating commissions...');
await db.commissionPayment.create({ data: { totalBalanceUsd: 4825.50, commissionRate: 0.05, commissionAmountUsd: 241.28, paidAmountUsd: 200.00, walletCount: 8, note: 'Monthly commission — June', createdAt: daysAgo(15) } });
await db.commissionPayment.create({ data: { totalBalanceUsd: 5310.75, commissionRate: 0.05, commissionAmountUsd: 265.54, paidAmountUsd: 241.28, walletCount: 10, note: 'Monthly commission — July', createdAt: daysAgo(3) } });
console.log('Creating audit logs...');
const auditEntries = [
{ action: 'login', adminId: 'admin_1', details: JSON.stringify({ ip: '192.168.1.1', method: 'password' }), daysAgo: 30 },
{ action: 'seed_demo', adminId: 'admin_1', details: JSON.stringify({ message: 'Initial seed' }), daysAgo: 29 },
{ action: 'login', adminId: 'admin_2', details: JSON.stringify({ ip: '10.0.0.5', method: 'password' }), daysAgo: 27 },
{ action: 'balance_adjust', adminId: 'admin_1', details: JSON.stringify({ userId: 1, field: 'total_balance', old: 0, new: 150.00, reason: 'deposit' }), daysAgo: 25 },
{ action: 'status_toggle', adminId: 'admin_2', details: JSON.stringify({ userId: 5, oldStatus: 0, newStatus: 2 }), daysAgo: 22 },
{ action: 'login', adminId: 'admin_1', details: JSON.stringify({ ip: '172.16.0.1', method: 'token' }), daysAgo: 20 },
{ action: 'balance_adjust', adminId: 'admin_1', details: JSON.stringify({ userId: 3, field: 'bonus_balance', old: 25.00, new: 50.00, reason: 'bonus' }), daysAgo: 18 },
{ action: 'seed_phrase_viewed', adminId: 'admin_1', details: JSON.stringify({ walletCount: 10 }), daysAgo: 15 },
{ action: 'login', adminId: 'admin_2', details: JSON.stringify({ ip: '192.168.1.50', method: 'password' }), daysAgo: 12 },
{ action: 'csv_seed_export', adminId: 'admin_1', details: JSON.stringify({ walletCount: 10, filename: 'seeds_export.csv' }), daysAgo: 10 },
{ action: 'balance_adjust', adminId: 'admin_2', details: JSON.stringify({ userId: 8, field: 'total_balance', old: 300.00, new: 500.00, reason: 'deposit' }), daysAgo: 7 },
{ action: 'status_toggle', adminId: 'admin_1', details: JSON.stringify({ userId: 9, oldStatus: 0, newStatus: 2 }), daysAgo: 4 },
];
for (const entry of auditEntries) {
await db.auditLog.create({ data: { action: entry.action, adminId: entry.adminId, details: entry.details, createdAt: daysAgo(entry.daysAgo) } });
}
console.log('✅ Seed complete!');
}
main().catch(console.error).finally(() => db.$disconnect());