x
This commit is contained in:
1 parent
c42dd4272f
commit
730fdb49e6
8 files changed
+1611
-72
No files matched your search
@@ -0,0 +1,224 @@
|
||||
import bcrypt from "bcryptjs";
|
||||
import prisma from "./prisma";
|
||||
|
||||
export const brandNames = [
|
||||
"ตะไคร้", "ลาเวนเดอร์", "วานิลลา", "ซากุระ", "มะลิ", "ยูคาลิปตัส", "เฟรชลาเวนเดอร์",
|
||||
"เปเปอร์มิ้น", "โอเชี่ยน", "เซเว่นซี", "ดอกแก้ว", "ดอกโมก", "ลีลาวดี", "ส้ม", "มะนาว",
|
||||
"แคนตาลูป", "แอปเปิ้ลแดง", "แอปเปิ้ลเขียว", "ดอกลิลลี่", "โรสเมรี่", "อัญชัน",
|
||||
"กุหลาบแดง", "หมากฝรั่ง", "ผลไม้รวม", "มะกรูด", "แซนด้าวูส", "ดอกปีบ", "ดอกบัว",
|
||||
"โอโซน", "ไทยสปา", "กล้วย", "กาแฟ", "ดอกชมนาด", "กลิ่นน้ำนม", "ดอกการะเวก",
|
||||
"ดอกจำปา", "ดอกพิกุล", "ดอกพุด", "ดอกราตรี", "ดอกลำดวน", "ทับทิม", "มะละกอสุก",
|
||||
"ดอกราชาวดี", "กลิ่นลูกพีช", "กลิ่นองุ่น"
|
||||
];
|
||||
|
||||
export const categoryConfigs = [
|
||||
{
|
||||
name: "Oil Ozone",
|
||||
sizes: ["30ml", "60ml", "85ml", "120ml"],
|
||||
priceMap: { "30ml": 69, "60ml": 100, "85ml": 120, "120ml": 150 }
|
||||
},
|
||||
{
|
||||
name: "Aroma Oil",
|
||||
sizes: ["30ml", "60ml", "85ml", "120ml"],
|
||||
priceMap: { "30ml": 90, "60ml": 150, "85ml": 165, "120ml": 225 }
|
||||
},
|
||||
{
|
||||
name: "Reed Diffuser",
|
||||
sizes: ["60ml", "85ml", "120ml"],
|
||||
priceMap: { "60ml": 120, "85ml": 160, "120ml": 190 }
|
||||
},
|
||||
{
|
||||
name: "Room Spray",
|
||||
sizes: ["85ml"],
|
||||
priceMap: { "85ml": 150 }
|
||||
},
|
||||
{
|
||||
name: "Car Diffuser",
|
||||
sizes: ["25ml"],
|
||||
priceMap: { "25ml": 60 }
|
||||
}
|
||||
];
|
||||
|
||||
export async function runEmergencySeed() {
|
||||
const summary: Record<string, any> = {};
|
||||
|
||||
// 1. Seed Admin User
|
||||
const adminPassword = await bcrypt.hash("homaroma123", 10);
|
||||
const adminUser = await prisma.user.upsert({
|
||||
where: { username: "admin" },
|
||||
update: { password: adminPassword },
|
||||
create: {
|
||||
username: "admin",
|
||||
password: adminPassword,
|
||||
role: "ADMIN"
|
||||
}
|
||||
});
|
||||
summary.admin = { username: adminUser.username, defaultPassword: "homaroma123" };
|
||||
|
||||
// 2. Seed Core Menus
|
||||
const coreMenus = [
|
||||
{ name: "main", items: [{ id: 1, label: "Home", url: "/", order: 1 }, { id: 2, label: "Shop", url: "/shop", order: 2 }, { id: 3, label: "Scent Guide", url: "/scent-guide", order: 3 }, { id: 4, label: "About Us", url: "/about", order: 4 }] },
|
||||
{ name: "footer-explore", items: [{ id: 5, label: "Home", url: "/", order: 1 }, { id: 6, label: "Shop", url: "/shop", order: 2 }, { id: 7, label: "Scent Guide", url: "/scent-guide", order: 3 }, { id: 8, label: "About Us", url: "/about", order: 4 }] },
|
||||
{ name: "footer-support", items: [{ id: 9, label: "Track Order", url: "/track-order", order: 1 }, { id: 10, label: "FAQ", url: "/faq", order: 2 }, { id: 11, label: "Contact Us", url: "/contact", order: 3 }, { id: 12, label: "Delivery & Returns", url: "/delivery", order: 4 }] }
|
||||
];
|
||||
|
||||
for (const menu of coreMenus) {
|
||||
const m = await prisma.menu.upsert({
|
||||
where: { name: menu.name },
|
||||
update: {},
|
||||
create: { name: menu.name }
|
||||
});
|
||||
for (const item of menu.items) {
|
||||
await prisma.menuItem.upsert({
|
||||
where: { id: item.id },
|
||||
update: { label: item.label, url: item.url, order: item.order, menuId: m.id },
|
||||
create: { id: item.id, label: item.label, url: item.url, order: item.order, menuId: m.id }
|
||||
});
|
||||
}
|
||||
}
|
||||
summary.menusCount = coreMenus.length;
|
||||
|
||||
// 3. Seed Brands & Categories
|
||||
const brands: any[] = [];
|
||||
for (const name of brandNames) {
|
||||
const s = await prisma.productBrand.upsert({
|
||||
where: { name },
|
||||
update: {},
|
||||
create: { name }
|
||||
});
|
||||
brands.push(s);
|
||||
}
|
||||
summary.brandsCount = brands.length;
|
||||
|
||||
const categories: any[] = [];
|
||||
for (const config of categoryConfigs) {
|
||||
const c = await prisma.category.upsert({
|
||||
where: { name: config.name },
|
||||
update: {},
|
||||
create: { name: config.name }
|
||||
});
|
||||
categories.push(c);
|
||||
}
|
||||
summary.categoriesCount = categories.length;
|
||||
|
||||
// 4. Seed StoreSettings
|
||||
const existingSettings = await prisma.storeSettings.findFirst();
|
||||
if (!existingSettings) {
|
||||
await prisma.storeSettings.create({
|
||||
data: {
|
||||
storeName: "HomAroma",
|
||||
siteTitle: "HomAroma — Scents for Serenity",
|
||||
siteDescription: "Premium sensory experiences crafted for mindful living.",
|
||||
contactEmail: "contact@homaroma.shop",
|
||||
contactPhone: "+66 81 234 5678",
|
||||
headerStyle: "single_line",
|
||||
scrollRevealStyle: "fade-up",
|
||||
scrollRevealDuration: 700
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 5. Seed Pages & Sections
|
||||
const pagesConfig = [
|
||||
{ slug: "home", title: "Home Page" },
|
||||
{ slug: "shop-layout", title: "Shop Page Layout" },
|
||||
{ slug: "scent-guide-layout", title: "Scent Guide Layout" },
|
||||
{ slug: "category-layout", title: "Category Page Layout" },
|
||||
{ slug: "product-detail-layout", title: "Product Detail Layout" },
|
||||
{ slug: "faq-layout", title: "FAQ Page Layout" },
|
||||
{ slug: "wishlist-layout", title: "Wishlist Page Layout" },
|
||||
{ slug: "search-layout", title: "Search Page Layout" },
|
||||
{ slug: "coupons-layout", title: "Coupons Page Layout" },
|
||||
{ slug: "contact-layout", title: "Contact Page Layout" },
|
||||
{ slug: "order-success-layout", title: "Order Success Page Layout" },
|
||||
{ slug: "track-order-layout", title: "Track Order Page Layout" },
|
||||
{ slug: "checkout-layout", title: "Checkout Page Layout" },
|
||||
{ slug: "profile-layout", title: "Profile Page Layout" }
|
||||
];
|
||||
|
||||
let pagesCount = 0;
|
||||
for (const pg of pagesConfig) {
|
||||
const p = await prisma.page.upsert({
|
||||
where: { slug: pg.slug },
|
||||
update: { title: pg.title, isPublished: true },
|
||||
create: { slug: pg.slug, title: pg.title, isPublished: true }
|
||||
});
|
||||
pagesCount++;
|
||||
|
||||
// Seed default hero section if no sections exist
|
||||
const sectionCount = await prisma.pageSection.count({ where: { pageId: p.id } });
|
||||
if (sectionCount === 0) {
|
||||
if (pg.slug === "home") {
|
||||
await prisma.pageSection.create({
|
||||
data: {
|
||||
pageId: p.id,
|
||||
type: "HERO",
|
||||
order: 1,
|
||||
isActive: true,
|
||||
payload: {
|
||||
tagline: "VIBRANT ELEGANCE COLLECTION",
|
||||
title: "Inhale [Serenity]",
|
||||
description: "Crafting premium sensory experiences that transform your space into a sanctuary of peace.",
|
||||
imageUrl: "/images/hero.png",
|
||||
buttonText: "Explore Collection",
|
||||
buttonLink: "/shop"
|
||||
}
|
||||
}
|
||||
});
|
||||
await prisma.pageSection.create({
|
||||
data: {
|
||||
pageId: p.id,
|
||||
type: "CATEGORIES",
|
||||
order: 2,
|
||||
isActive: true,
|
||||
payload: {
|
||||
title: "Our Collections",
|
||||
subtitle: "Discover the perfect scent for every moment"
|
||||
}
|
||||
}
|
||||
});
|
||||
await prisma.pageSection.create({
|
||||
data: {
|
||||
pageId: p.id,
|
||||
type: "PRODUCTS",
|
||||
order: 3,
|
||||
isActive: true,
|
||||
payload: {
|
||||
title: "Featured Aromas",
|
||||
subtitle: "Handcrafted blends designed for your well-being",
|
||||
category: "All",
|
||||
limit: 8
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
await prisma.pageSection.create({
|
||||
data: {
|
||||
pageId: p.id,
|
||||
type: "BANNER",
|
||||
order: 1,
|
||||
isActive: true,
|
||||
payload: {
|
||||
title: pg.title,
|
||||
subtitle: "Explore our handcrafted scents and collections",
|
||||
buttonText: "Shop Now",
|
||||
buttonLink: "/shop"
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
summary.pagesCount = pagesCount;
|
||||
|
||||
// 6. Reset PostgreSQL Sequence
|
||||
try {
|
||||
await prisma.$executeRawUnsafe(
|
||||
`SELECT setval('"MenuItem_id_seq"', COALESCE((SELECT MAX(id) FROM "MenuItem") + 1, 1), false);`
|
||||
);
|
||||
} catch (err) {
|
||||
// SQLite or other non-postgres ignored
|
||||
}
|
||||
|
||||
return summary;
|
||||
}
|
||||
Reference in new issue
Block a user