/** * seed.ts * - 드릴즐 + faker로 documents / issueStages / revisions 테이블에 테스트 데이터 삽입 예시 */ import db from "@/db/db" import { eq } from "drizzle-orm" // faker-js/faker 또는 @faker-js/faker import { faker } from "@faker-js/faker" import { documents, issueStages, revisions } from "../schema/vendorDocu" // 몇 개의 도큐먼트를 만들지 const NUM_DOCUMENTS = 200 // 하나의 문서당 스테이지 개수 범위 const STAGE_MIN = 1 const STAGE_MAX = 3 // 하나의 스테이지당 리비전 개수 범위 const REV_MIN = 1 const REV_MAX = 2 // 가상으로 계약 ID가 1~5 범위라고 가정 const CONTRACT_ID_MIN = 96 const CONTRACT_ID_MAX = 125 async function seed() { try { console.log("Seeding started...") // 1) documents 테이블에 NUM_DOCUMENTS 개 생성 const docsData = [] for (let i = 0; i < NUM_DOCUMENTS; i++) { const randomContractId = faker.number.int({ min: CONTRACT_ID_MIN, max: CONTRACT_ID_MAX, }) docsData.push({ contractId: randomContractId, docNumber: `DOC-${faker.number.int({ min: 1000, max: 9999 })}`, title: faker.lorem.sentence(3), // 예: "dolor sit amet" status: faker.helpers.arrayElement(["ACTIVE", "REVIEW", "APPROVED"]), issuedDate: faker.helpers.maybe(() => faker.date.past({ years: 1 }), { probability: 0.7, }) // createdAt, updatedAt은 defaultNow()로 자동 }) } // documents 테이블 INSERT const insertedDocs = await db.insert(documents).values(docsData).returning() console.log(`Inserted ${insertedDocs.length} documents.`) // 2) 각 Document에 대해 스테이지(issueStages) 생성 for (const doc of insertedDocs) { // doc.id가 undefined인지 확인 if (!doc.id) { console.error("Document ID is undefined:", doc) continue } const stageCount = faker.number.int({ min: STAGE_MIN, max: STAGE_MAX }) const stagesData = [] for (let j = 0; j < stageCount; j++) { stagesData.push({ documentId: doc.id, stageName: faker.helpers.arrayElement([ "Issued for Review", "IFC", "AFC", "As-Built", ]), planDate: faker.helpers.maybe(() => faker.date.future({ years: 0.5 }), { probability: 0.5, }), actualDate: faker.helpers.maybe(() => faker.date.future({ years: 0.5 }), { probability: 0.5, }) // 50% 확률로 실제일 }) } // 스테이지 데이터가 비어 있는지 확인 if (stagesData.length === 0) { console.warn(`No stages created for document ${doc.id}`) continue } try { const insertedStages = await db.insert(issueStages).values(stagesData).returning() console.log(`Inserted ${insertedStages.length} stages for document ${doc.id}`) // 3) 각 스테이지별 리비전(revisions) 생성 for (const stage of insertedStages) { // stage.id가 undefined인지 확인 if (!stage.id) { console.error("Stage ID is undefined:", stage) continue } const revCount = faker.number.int({ min: REV_MIN, max: REV_MAX }) const revData = [] for (let k = 0; k < revCount; k++) { revData.push({ issueStageId: stage.id, documentId: doc.id, // 문서 ID도 추가 revision: faker.helpers.arrayElement(["A", "B", "C", "0", "1"]), filePath: faker.system.filePath(), approvedDate: faker.helpers.maybe(() => faker.date.recent({ days: 10 })), }) } // 리비전 데이터가 비어 있는지 확인 if (revData.length === 0) { console.warn(`No revisions created for stage ${stage.id}`) continue } try { const insertedRevs = await db.insert(revisions).values(revData).returning() console.log(`Inserted ${insertedRevs.length} revisions for stage ${stage.id}`) } catch (error) { console.error(`Error inserting revisions for stage ${stage.id}:`, error) } } } catch (error) { console.error(`Error inserting stages for document ${doc.id}:`, error) } } console.log("Seeding completed successfully.") } catch (err) { console.error("Seeding error:", err) process.exit(1) } finally { // 필요하다면 DB connection 종료 로직 } } // 스크립트 직접 실행 시 seed() .then(() => process.exit(0)) .catch(() => process.exit(1))