/** * Test Table V2 Seeding Script * * ė‚ŽėšĐëē•: * npx tsx db/seeds/test-table-v2.ts */ import db from "@/db/db"; import { faker } from "@faker-js/faker"; import { testProducts, testCustomers, testOrders, NewTestProduct, NewTestCustomer, NewTestOrder, } from "../schema/test-table-v2"; // === Generators === const CATEGORIES = [ "Electronics", "Clothing", "Home & Garden", "Sports", "Books", "Toys", "Food", "Health", ]; const PRODUCT_STATUSES = ["active", "inactive", "discontinued"] as const; const ORDER_STATUSES = ["pending", "processing", "shipped", "delivered", "cancelled"] as const; const CUSTOMER_TIERS = ["standard", "premium", "vip"] as const; const COUNTRIES = ["Korea", "USA", "Japan", "Germany", "UK", "France", "China", "Singapore"]; function generateProduct(): NewTestProduct { const category = faker.helpers.arrayElement(CATEGORIES); const price = faker.number.float({ min: 10, max: 1000, fractionDigits: 2 }); return { name: faker.commerce.productName(), sku: faker.string.alphanumeric({ length: 8, casing: "upper" }), description: faker.commerce.productDescription(), category, price: price.toString(), stock: faker.number.int({ min: 0, max: 500 }), status: faker.helpers.arrayElement(PRODUCT_STATUSES), isNew: faker.datatype.boolean({ probability: 0.2 }), createdAt: faker.date.past({ years: 2 }), updatedAt: faker.date.recent({ days: 30 }), }; } function generateCustomer(): NewTestCustomer { return { name: faker.person.fullName(), email: faker.internet.email(), phone: faker.phone.number(), country: faker.helpers.arrayElement(COUNTRIES), tier: faker.helpers.arrayElement(CUSTOMER_TIERS), totalOrders: faker.number.int({ min: 0, max: 100 }), createdAt: faker.date.past({ years: 3 }), }; } function generateOrder( customerId: number, productId: number | null, productPrice: number ): NewTestOrder { const quantity = faker.number.int({ min: 1, max: 10 }); const unitPrice = productPrice || faker.number.float({ min: 10, max: 500, fractionDigits: 2 }); const totalAmount = quantity * unitPrice; const status = faker.helpers.arrayElement(ORDER_STATUSES); const orderedAt = faker.date.past({ years: 1 }); let shippedAt: Date | undefined; let deliveredAt: Date | undefined; if (status === "shipped" || status === "delivered") { shippedAt = faker.date.between({ from: orderedAt, to: new Date() }); } if (status === "delivered") { deliveredAt = faker.date.between({ from: shippedAt || orderedAt, to: new Date() }); } return { orderNumber: `ORD-${faker.string.alphanumeric({ length: 8, casing: "upper" })}`, customerId, productId, quantity, unitPrice: unitPrice.toString(), totalAmount: totalAmount.toString(), status, notes: faker.datatype.boolean({ probability: 0.3 }) ? faker.lorem.sentence() : null, orderedAt, shippedAt, deliveredAt, }; } // === Main Seeding Function === export async function seedTestTableV2(options: { productCount?: number; customerCount?: number; orderCount?: number; } = {}) { const { productCount = 100, customerCount = 50, orderCount = 200, } = options; console.log("🗑ïļ Clearing existing test data..."); // Delete in order (orders first due to FK) await db.delete(testOrders); await db.delete(testCustomers); await db.delete(testProducts); console.log(`ðŸ“Ķ Generating ${productCount} products...`); const products: NewTestProduct[] = []; for (let i = 0; i < productCount; i++) { products.push(generateProduct()); } const insertedProducts = await db.insert(testProducts).values(products).returning(); console.log(`✅ Inserted ${insertedProducts.length} products`); console.log(`ðŸ‘Ĩ Generating ${customerCount} customers...`); const customers: NewTestCustomer[] = []; for (let i = 0; i < customerCount; i++) { customers.push(generateCustomer()); } const insertedCustomers = await db.insert(testCustomers).values(customers).returning(); console.log(`✅ Inserted ${insertedCustomers.length} customers`); console.log(`🛒 Generating ${orderCount} orders...`); const orders: NewTestOrder[] = []; for (let i = 0; i < orderCount; i++) { const customer = faker.helpers.arrayElement(insertedCustomers); const product = faker.helpers.arrayElement(insertedProducts); orders.push(generateOrder(customer.id, product.id, parseFloat(product.price))); } const insertedOrders = await db.insert(testOrders).values(orders).returning(); console.log(`✅ Inserted ${insertedOrders.length} orders`); console.log("🎉 Test table v2 seeding completed!"); return { products: insertedProducts.length, customers: insertedCustomers.length, orders: insertedOrders.length, }; } // === CLI Runner === async function main() { console.log("âģ Starting test-table-v2 seed..."); const start = Date.now(); try { const result = await seedTestTableV2({ productCount: 100, customerCount: 50, orderCount: 200, }); const end = Date.now(); console.log(`\n📊 Summary:`); console.log(` Products: ${result.products}`); console.log(` Customers: ${result.customers}`); console.log(` Orders: ${result.orders}`); console.log(`\n✅ Seed completed in ${end - start}ms`); } catch (err) { console.error("❌ Seed failed:", err); process.exit(1); } process.exit(0); } // Run if called directly main();