diff options
Diffstat (limited to 'db/seeds/vendorSeed.ts')
| -rw-r--r-- | db/seeds/vendorSeed.ts | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/db/seeds/vendorSeed.ts b/db/seeds/vendorSeed.ts new file mode 100644 index 00000000..bb659562 --- /dev/null +++ b/db/seeds/vendorSeed.ts @@ -0,0 +1,86 @@ +// 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); + });
\ No newline at end of file |
