--- seed.cjs 2026-06-23 +++ seed.cjs.new 2026-06-23 @@ -12,7 +12,7 @@ const adapter = new PrismaPg(pool); const prisma = new PrismaClient({ adapter }); -const scentNames = [ +const brandNames = [ 'ตะไคร้', 'ลาเวนเดอร์', 'วานิลลา', 'ซากุระ', 'มะลิ', 'ยูคาลิปตัส', 'เฟรชลาเวนเดอร์', 'เปเปอร์มิ้น', 'โอเชี่ยน', 'เซเว่นซี', 'ดอกแก้ว', 'ดอกโมก', 'ลีลาวดี', 'ส้ม', 'มะนาว', 'แคนตาลูป', 'แอปเปิ้ลแดง', 'แอปเปิ้ลเขียว', 'ดอกลิลลี่', 'โรสเมรี่', 'อัญชัน', @@ -65,7 +65,7 @@ // Auto-create with default template if not exists if (!fs.existsSync(descPath)) { - const defaultDesc = `ผลิตภัณฑ์ ${config.name} กลิ่น {{scent}} มอบประสบการณ์ความหอมที่ผ่อนคลายและสดชื่น ช่วยให้บรรยากาศในห้องของคุณน่าอยู่มากยิ่งขึ้น`; + const defaultDesc = `ผลิตภัณฑ์ ${config.name} กลิ่น {{brand}} มอบประสบการณ์ความหอมที่ผ่อนคลายและสดชื่น ช่วยให้บรรยากาศในห้องของคุณน่าอยู่มากยิ่งขึ้น`; fs.writeFileSync(descPath, defaultDesc, 'utf8'); } @@ -78,7 +78,7 @@ } const detailPath = path.join(detailsDir, `${safeName}.txt`); if (!fs.existsSync(detailPath)) { - const defaultDetail = `รายละเอียดฉบับเต็มของ ${config.name} กลิ่น {{scent}}\n- ส่วนประกอบนำเข้าคุณภาพสูง\n- กระจายความหอมได้ยาวนานในห้อง\n- ปลอดภัยต่อสุขภาพและเหมาะสำหรับทุกคนในครอบครัว`; + const defaultDetail = `รายละเอียดฉบับเต็มของ ${config.name} กลิ่น {{brand}}\n- ส่วนประกอบนำเข้าคุณภาพสูง\n- กระจายความหอมได้ยาวนานในห้อง\n- ปลอดภัยต่อสุขภาพและเหมาะสำหรับทุกคนในครอบครัว`; fs.writeFileSync(detailPath, defaultDetail, 'utf8'); } categoryConfigs[config.name] = categoryConfigs[config.name] || {}; @@ -122,17 +122,17 @@ process.stdout.write('✅ Seeded Core Menus.\n'); - // 1. Seed Scents & Categories - const scents = []; - for (const name of scentNames) { - const s = await prisma.scent.upsert({ + // 1. Seed Brands & Categories + const brands = []; + for (const name of brandNames) { + const s = await prisma.productBrand.upsert({ where: { name }, update: {}, create: { name } }); - scents.push(s); + brands.push(s); } - process.stdout.write(`✅ Seeded ${scents.length} Scents.\n`); + process.stdout.write(`✅ Seeded ${brands.length} Brands.\n`); const categories = []; for (const config of categoryConfigs) { @@ -145,43 +145,46 @@ } process.stdout.write(`✅ Seeded ${categories.length} Categories.\n`); - // 2. Cross Scents x Categories to create Products + // 2. Cross Brands x Categories to create Products process.stdout.write('📦 Generating Products and Variants...\n'); let productCount = 0; let variantCount = 0; - for (const scent of scents) { + for (const brand of brands) { for (const category of categories) { - const productName = `${scent.name} ${category.name}`; + const productName = `${brand.name} ${category.name}`; - // Get category description template and replace {{scent}} - let productDescription = categoryDescriptions[category.name] || `Product ${scent.name} in category ${category.name}`; - productDescription = productDescription.replace(/{{scent}}/g, scent.name); + // Get category description template and replace {{brand}} + let productDescription = categoryDescriptions[category.name] || `Product ${brand.name} in category ${category.name}`; + productDescription = productDescription.replace(/{{brand}}/g, brand.name); + // fallback for old template files that might still have {{scent}} + productDescription = productDescription.replace(/{{scent}}/g, brand.name); let productDetails = category.detailsTemplate || ''; - productDetails = productDetails.replace(/{{scent}}/g, scent.name); + productDetails = productDetails.replace(/{{brand}}/g, brand.name); + productDetails = productDetails.replace(/{{scent}}/g, brand.name); - // Upsert Product - const product = await prisma.product.upsert({ - where: { - scentId_categoryId: { - scentId: scent.id, - categoryId: category.id - } - }, - update: { - name: productName, - description: productDescription, - details: productDetails - }, - create: { - name: productName, - scentId: scent.id, - categoryId: category.id, - description: productDescription, - details: productDetails - } - }); + // Upsert Product manually since we don't have a unique constraint on brandId + categoryId + let product = await prisma.product.findFirst({ + where: { brandId: brand.id, categoryId: category.id } + }); + if (product) { + product = await prisma.product.update({ + where: { id: product.id }, + data: { + name: productName, + description: productDescription, + details: productDetails + } + }); + } else { + product = await prisma.product.create({ + data: { + name: productName, + brandId: brand.id, + categoryId: category.id, + description: productDescription, + details: productDetails + } + }); + } productCount++; // 3. Create Default Product Image @@ -235,7 +238,7 @@ process.stdout.write(`\n✨ Seeding Complete!\n`); process.stdout.write(`📊 Summary:\n`); - process.stdout.write(` - Scents: ${scents.length}\n`); + process.stdout.write(` - Brands: ${brands.length}\n`); process.stdout.write(` - Categories: ${categories.length}\n`); process.stdout.write(` - Products: ${productCount}\n`); process.stdout.write(` - Variants: ${variantCount}\n`);