// db/seed/vendorSeed.ts import { faker } from "@faker-js/faker"; import db from "@/db/db"; import { vendors, vendorContacts, vendorPossibleItems } from "../schema/vendors"; import { items } from "../schema/items"; // items 테이블 import import { eq } from "drizzle-orm"; async function seedVendors() { // 1) 기존 데이터 정리(원하면) await db.delete(vendorPossibleItems); await db.delete(vendorContacts); await db.delete(vendors); // 2) 먼저 items 테이블에서 모든 아이템 목록 조회 const existingItems = await db.select().from(items); if (existingItems.length === 0) { console.log("No items found in 'items' table. Please seed items first."); return; } // 3) Vendors 생성 const vendorCount = 10; for (let i = 0; i < vendorCount; i++) { const newVendor = { vendorName: faker.company.name(), // 회사명 vendorCode: faker.string.alpha({ length: 6 }), // 임의 코드 address: faker.location.streetAddress(), country: faker.location.country(), phone: faker.phone.number(), taxId: faker.phone.imei(), email: faker.internet.email(), website: faker.internet.url(), status: faker.helpers.arrayElement(["ACTIVE", "INACTIVE", "BLACKLISTED","IN PQ"]), }; // Vendors 테이블에 Insert 후, 결과(생성된 id)를 받음 const [insertedVendor] = await db.insert(vendors).values(newVendor).returning(); const vendorId = insertedVendor.id; // 4) Contacts 생성 (각 협력업체당 1~3명) const contactCount = faker.number.int({ min: 1, max: 3 }); for (let j = 0; j < contactCount; j++) { const newContact = { vendorId, contactName: faker.person.fullName(), contactPosition: faker.person.jobTitle(), contactEmail: faker.internet.email(), contactPhone: faker.phone.number(), isPrimary: j === 0, }; await db.insert(vendorContacts).values(newContact); } // 5) Possible Items 생성 (각 협력업체당 2~5개) // 여기서 "items" 테이블에서 랜덤 pick → vendorPossibleItems에 참조 const itemCount = faker.number.int({ min: 2, max: 5 }); // 매번 하나씩 pick해도 되고, arrayElements로 여러 개를 한 번에 pick해도 됨 for (let k = 0; k < itemCount; k++) { // 1개 item 무작위 선택 const randomItem = faker.helpers.arrayElement(existingItems); // vendorPossibleItems에 Insert const newItem = { vendorId, itemCode: randomItem.itemCode ?? "FAKECODE", description: faker.commerce.productDescription(), }; await db.insert(vendorPossibleItems).values(newItem); } } console.log(`✅ Seeded ${vendorCount} vendors (with contacts & possible items).`); } // 스크립트 실행 부분 seedVendors() .then(() => { console.log("Seeding complete!"); process.exit(0); }) .catch((error) => { console.error("Seeding failed:", error); process.exit(1); });