summaryrefslogtreecommitdiff
path: root/db/seeds
diff options
context:
space:
mode:
Diffstat (limited to 'db/seeds')
-rw-r--r--db/seeds/test-table-v2.ts187
1 files changed, 187 insertions, 0 deletions
diff --git a/db/seeds/test-table-v2.ts b/db/seeds/test-table-v2.ts
new file mode 100644
index 00000000..07bf8914
--- /dev/null
+++ b/db/seeds/test-table-v2.ts
@@ -0,0 +1,187 @@
+/**
+ * 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();
+