232 lines
9.7 KiB
TypeScript
232 lines
9.7 KiB
TypeScript
import { PrismaClient } from '@prisma/client';
|
||
import * as fs from 'fs';
|
||
import * as path from 'path';
|
||
import * as ts from 'typescript';
|
||
import * as vm from 'vm';
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
async function main() {
|
||
console.log('Wiping existing database records...');
|
||
await prisma.reminderCompletion.deleteMany();
|
||
await prisma.reminder.deleteMany();
|
||
await prisma.healthLog.deleteMany();
|
||
await prisma.petMedicalCondition.deleteMany();
|
||
await prisma.pet.deleteMany();
|
||
await prisma.orderItem.deleteMany();
|
||
await prisma.order.deleteMany();
|
||
await prisma.walletTransaction.deleteMany();
|
||
await prisma.userAddress.deleteMany();
|
||
await prisma.user.deleteMany();
|
||
await prisma.productIngredient.deleteMany();
|
||
await prisma.productSymptom.deleteMany();
|
||
await prisma.product.deleteMany();
|
||
await prisma.coupon.deleteMany();
|
||
await prisma.uiText.deleteMany();
|
||
await prisma.scientificTerm.deleteMany();
|
||
console.log('Database successfully wiped.');
|
||
|
||
console.log('Seeding database with products...');
|
||
|
||
const productsFilePath = path.join(__dirname, '..', '..', 'src', 'data', 'products.ts');
|
||
const fileContent = fs.readFileSync(productsFilePath, 'utf-8');
|
||
|
||
const jsCode = ts.transpile(fileContent, {
|
||
module: ts.ModuleKind.CommonJS,
|
||
target: ts.ScriptTarget.ES2018,
|
||
});
|
||
|
||
const context = { exports: {} };
|
||
vm.createContext(context);
|
||
vm.runInContext(jsCode, context);
|
||
|
||
const PRODUCTS = (context.exports as any).PRODUCTS;
|
||
|
||
if (!PRODUCTS || !Array.isArray(PRODUCTS)) {
|
||
console.error('Could not load PRODUCTS from src/data/products.ts');
|
||
process.exit(1);
|
||
}
|
||
|
||
for (const productData of PRODUCTS) {
|
||
const p = await prisma.product.upsert({
|
||
where: { artNo: productData.artNo },
|
||
update: {},
|
||
create: {
|
||
artNo: productData.artNo,
|
||
name: productData.name,
|
||
scientificTagline: productData.scientificTagline,
|
||
description: productData.description,
|
||
shortDescription: productData.shortDescription || '',
|
||
category: productData.category,
|
||
categorySlug: productData.categorySlug || 'general',
|
||
priceValue: productData.priceValue,
|
||
priceDisplay: productData.price,
|
||
unit: productData.unit,
|
||
packageSize: productData.packageSize,
|
||
dosageLogic: productData.dosage_logic,
|
||
suitableFor: productData.suitableFor,
|
||
imageUrl: productData.image,
|
||
}
|
||
});
|
||
|
||
if (productData.main_ingredients) {
|
||
for (const ing of productData.main_ingredients) {
|
||
await prisma.productIngredient.upsert({
|
||
where: { productId_ingredient: { productId: p.id, ingredient: ing } },
|
||
update: {},
|
||
create: { productId: p.id, ingredient: ing }
|
||
});
|
||
}
|
||
}
|
||
|
||
if (productData.symptoms) {
|
||
for (const sym of productData.symptoms) {
|
||
await prisma.productSymptom.upsert({
|
||
where: { productId_symptom: { productId: p.id, symptom: sym } },
|
||
update: {},
|
||
create: { productId: p.id, symptom: sym }
|
||
});
|
||
}
|
||
}
|
||
|
||
console.log(`Seeded product: ${p.name}`);
|
||
}
|
||
|
||
// 1. Seed UI Texts
|
||
console.log('Seeding UI Texts...');
|
||
const uiTexts = {
|
||
hero_badge: "تخصص دارویی از آلمان",
|
||
hero_title: "تخصص آلمانی در خدمت\nسلامت پتهای خانگی",
|
||
hero_desc: "بیش از ۴۰ سال تجربه نوآورانه در تولید مکملهای درمانی با بالاترین استاندارد کیفی «گرید دارویی اختصاصی». راهکار هوشمند برای هر نیاز بالینی.",
|
||
hero_btn_advisor: "دستیار سلامت پت",
|
||
hero_btn_products: "مشاهده محصولات",
|
||
hero_stat_founded: "۱۹۸۴ سال تأسیس",
|
||
hero_stat_agencies: "نمایندگی فعال",
|
||
hero_stat_german_formula: "فرمول آلمانی",
|
||
hero_image_badge: "سرآمد علمی در پزشکی پتها",
|
||
hero_image_title: "مکملهای تایید شده دامپزشکی",
|
||
hero_quality_standard: "استاندارد کیفی آلمان",
|
||
cta_title: "میخواهید بدانید کدام محصول برای پت شما مناسبتر است؟",
|
||
cta_subtitle: "تیم متخصص دامپزشکی کانینا ایران آماده پاسخگویی به سوالات شماست.",
|
||
cta_btn_free: "دریافت رژیم مکمل رایگان",
|
||
cta_btn_products: "ورود به محصولات تخصصی",
|
||
about_teaser_badge: "میراث ما از آلمان",
|
||
about_teaser_title: "چرا برند آلمانی Canina مرجع دامپزشکان است؟",
|
||
about_teaser_feat1_title: "مواد اولیه نایاب",
|
||
about_teaser_feat1_desc: "استفاده از پودر صدف لبسبز اصل نیوزیلند و مواد ارگانیک با گرید دارویی.",
|
||
about_teaser_feat2_title: "فاقد مواد نگهدارنده",
|
||
about_teaser_feat2_desc: "تمامی محصولات ۱۰۰٪ طبیعی و فاقد رنگهای مصنوعی و طعمدهندههای شیمیایی هستند.",
|
||
about_teaser_feat3_title: "تاییدیه اروپا",
|
||
about_teaser_feat3_desc: "مطابق با سختگیرانهترین استانداردهای ایمنی مواد غذایی و دارویی در اتحادیه اروپا.",
|
||
about_teaser_quality_title: "کیفیت",
|
||
about_teaser_quality_desc: "استانداردهای فوقدارویی",
|
||
ingredients_wiki: JSON.stringify([
|
||
{
|
||
id: "green-mussel",
|
||
name: "صدف لبسبز (Perna Canaliculus)",
|
||
description: "این صدف بومی سواحل بکر نیوزیلند است و تنها منبع طبیعی حاوی گلیکوزآمینگلیکانها (GAG) در غلظت بسیار بالا محسوب میشود.",
|
||
benefits: [
|
||
"بازسازی بافت غضروفی تخریب شده",
|
||
"خواص ضدالتهابی طبیعی برای رباطها",
|
||
"تامین اسیدهای چرب امگا ۳ خاص"
|
||
]
|
||
},
|
||
{
|
||
id: "silver",
|
||
name: "نقره میکروسیلور (Microsilver)",
|
||
description: "ذرات نقره خالص با ساختار اسفنجی که به دلیل اندازه ذرات درشت، جذب خون نمیشوند اما اثر آنتیباکتریال پایداری بر سطح غشاها دارند.",
|
||
benefits: [
|
||
"مبارزه با باکتریهای مقاوم در دهان و پوست",
|
||
"عدم آسیب به فلور طبیعی بدن",
|
||
"جایگزین ایمن برای آنتیبیوتیکهای موضعی"
|
||
]
|
||
},
|
||
{
|
||
id: "colostrum",
|
||
name: "آغوز (Colostrum)",
|
||
description: "اولین شیر مادر که حاوی دوز بالایی از ایمونوگلوبولینها، ویتامینها و مواد معدنی برای فعالسازی فوری سیستم ایمنی است.",
|
||
benefits: [
|
||
"تقویت سد دفاعی روده",
|
||
"انتقال مستقیم آنتیبادی به نوزادان",
|
||
"تسریع نقاهت بعد از جرافی"
|
||
]
|
||
},
|
||
{
|
||
id: "peat-extract",
|
||
name: "عصاره پیت (Peat Extract)",
|
||
description: "مادهای کاملا طبیعی حاصل از تجزیه گیاهان در طول هزاران سال که غنی از اسیدهای هومیک و مواد معدنی است.",
|
||
benefits: [
|
||
"جذب سموم در دستگاه گوارش",
|
||
"تنظیم فلور روده",
|
||
"بهبود اشتها و هضم"
|
||
]
|
||
}
|
||
]),
|
||
medical_options: JSON.stringify([
|
||
{ id: "joint_surgery", label: "جراحی مفاصل", condition: "جراحی مفاصل" },
|
||
{ id: "recent_birth", label: "زایمان اخیر", condition: "زایمان اخیر" },
|
||
{ id: "pregnancy", label: "بارداری", condition: "بارداری" },
|
||
{ id: "digestion", label: "مشکلات گوارشی", condition: "مشکلات گوارشی" },
|
||
{ id: "hair_loss", label: "ریزش موی شدید", condition: "ریزش موی شدید" },
|
||
{ id: "appetite", label: "بیاشتهایی", condition: "بیاشتهایی" }
|
||
])
|
||
};
|
||
|
||
for (const [key, value] of Object.entries(uiTexts)) {
|
||
await prisma.uiText.upsert({
|
||
where: { key },
|
||
update: { value },
|
||
create: { key, value }
|
||
});
|
||
}
|
||
|
||
// 2. Seed Scientific Terms
|
||
console.log('Seeding Scientific Terms...');
|
||
const termsFilePath = path.join(__dirname, '..', '..', 'src', 'data', 'scientificTerms.ts');
|
||
if (fs.existsSync(termsFilePath)) {
|
||
const termsContent = fs.readFileSync(termsFilePath, 'utf-8');
|
||
const termsJsCode = ts.transpile(termsContent, {
|
||
module: ts.ModuleKind.CommonJS,
|
||
target: ts.ScriptTarget.ES2018,
|
||
});
|
||
|
||
const termsContext = { exports: {} };
|
||
vm.createContext(termsContext);
|
||
vm.runInContext(termsJsCode, termsContext);
|
||
|
||
const SCIENTIFIC_TERMS = (termsContext.exports as any).SCIENTIFIC_TERMS;
|
||
|
||
if (SCIENTIFIC_TERMS) {
|
||
for (const [key, termData] of Object.entries(SCIENTIFIC_TERMS)) {
|
||
const td = termData as any;
|
||
await prisma.scientificTerm.upsert({
|
||
where: { key },
|
||
update: {
|
||
term: td.term,
|
||
definition: td.definition,
|
||
wikiId: td.wikiId || 'general'
|
||
},
|
||
create: {
|
||
key,
|
||
term: td.term,
|
||
definition: td.definition,
|
||
wikiId: td.wikiId || 'general'
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
console.log('Seeding completed successfully!');
|
||
}
|
||
|
||
|
||
main()
|
||
.catch((e) => {
|
||
console.error('Error seeding data:', e);
|
||
process.exit(1);
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect();
|
||
});
|