canina/backend/prisma/seed.ts
parsa aghaei 7615aa0e51 fix: resolve seed encoding, search param, and wiki data source issues
- Fix seed-products.ts TS error (implicit any) and BOM handling
- Re-run full seed to restore correct Persian encoding in DB
- Fix productService query→search param mismatch
- Fix IngredientWiki hardcoded port 4000→use settingsStore
- Restore seed-products-data.json from git after accidental corruption
2026-07-11 15:40:49 +03:30

215 lines
12 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.blog.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();
await prisma.category.deleteMany();
console.log('Database successfully wiped.');
console.log('Creating Admin User...');
await prisma.user.upsert({
where: { id: '12345678-1234-1234-1234-123456789012' },
update: {},
create: {
id: '12345678-1234-1234-1234-123456789012',
firstName: 'Admin',
lastName: 'System',
email: 'admin@canino.ir',
role: 'ADMIN',
mobile: '09000000000'
}
});
// Seeding UI Texts
console.log('Seeding UI Texts...');
const uiTexts = {
hero_badge: "از ۱۹۸۴ در خدمت سلامت حیوانات",
hero_title: "تخصص آلمانی در خدمت\nسلامت پت‌های خانگی",
hero_desc: "از سال ۱۹۸۴، شرکت Canina pharma GmbH در برگیش گلادباخ آلمان، با بهره‌گیری از مواد اولیه طبیعی و فرآیندهای پیشرفته، استاندارد طلایی مکمل‌های دامپزشکی را تعریف می‌کند. کانینا نماینده رسمی این برند در ایران است.",
hero_btn_advisor: "دستیار سلامت پت",
hero_btn_products: "مشاهده محصولات",
hero_stat_founded: "۱۹۸۴ سال تأسیس",
hero_stat_agencies: "نمایندگی فعال",
hero_stat_german_formula: "فرمول آلمانی",
hero_image_badge: "سرآمد علمی در پزشکی پت‌ها",
hero_image_title: "مکمل‌های تایید شده دامپزشکی با گواهی IFS",
hero_quality_standard: "استاندارد کیفی آلمان (IFS & HACCP)",
cta_title: "می‌خواهید بدانید کدام محصول برای پت شما مناسب‌تر است؟",
cta_subtitle: "تیم متخصص دامپزشکی کانینا ایران آماده پاسخگویی به سوالات شماست. با بیش از ۴۰ محصول تخصصی، راهکار مناسب هر نیاز بالینی را خواهید یافت.",
cta_btn_free: "دریافت رژیم مکمل رایگان",
cta_btn_products: "ورود به محصولات تخصصی",
about_teaser_badge: "داستان ما از آلمان",
about_teaser_title: "Canina pharma GmbH میراثی از ۱۹۸۴",
about_teaser_desc: "شرکت Canina pharma GmbH در سال ۱۹۸۴ توسط پتر و کریستین کرشن‌مایر در شهر برگیش گلادباخ آلمان تأسیس شد. این شرکت با شعار «مادر طبیعت بهترین نسخه را می‌داند» از مواد اولیه طبیعی و تجدیدپذیر برای تولید مکمل‌های با گرید دارویی استفاده می‌کند. امروزه محصولات کانینا در بیش از ۴۰ کشور جهان توزیع می‌شود و نماینده رسمی آن در ایران با نام کانینا به ارائه محصولات اصل با پروانه دامپزشکی می‌پردازد.",
about_teaser_feat1_title: "مواد اولیه نایاب",
about_teaser_feat1_desc: "استفاده از پودر صدف لب‌سبز اصل نیوزیلند (Perna canaliculus)، پیت طبیعی آلمان، آغوز و روغن‌های گیاهی ارگانیک با گرید دارویی.",
about_teaser_feat2_title: "فاقد مواد نگهدارنده",
about_teaser_feat2_desc: "تمامی محصولات ۱۰۰٪ طبیعی و فاقد رنگ‌های مصنوعی، طعم‌دهنده‌ها و نگهدارنده‌های شیمیایی هستند.",
about_teaser_feat3_title: "تاییدیه بین‌المللی",
about_teaser_feat3_desc: "دارای گواهی IFS (International Featured Standard) و HACCP. محصولات مطابق با سخت‌گیرانه‌ترین استانداردهای ایمنی مواد غذایی و دارویی اتحادیه اروپا تولید می‌شوند.",
about_teaser_quality_title: "کیفیت آلمانی",
about_teaser_quality_desc: "استانداردهای فوق‌دارویی تولید شده در کارخانه برگیش گلادباخ",
ingredients_wiki: JSON.stringify([
{
id: "green-mussel",
name: "صدف لب‌سبز (Perna Canaliculus)",
description: "این صدف بومی سواحل بکر نیوزیلند است و تنها منبع طبیعی حاوی گلیکوزآمین‌گلیکان‌ها (GAG) در غلظت بسیار بالا محسوب می‌شود. GAGها مولکول‌های آب را در ماتریکس غضروفی جذب کرده و خاصیت بافری و الاستیسیته مفاصل را بازیابی می‌کنند.",
benefits: [
"بازسازی بافت غضروفی تخریب شده",
"خواص ضدالتهابی طبیعی برای رباط‌ها",
"تامین اسیدهای چرب امگا ۳ خاص (ETA)"
]
},
{
id: "silver",
name: "نقره میکروسیلور (Microsilver)",
description: "ذرات نقره خالص با ساختار اسفنجی که به دلیل اندازه ذرات درشت، جذب خون نمی‌شوند اما اثر آنتی‌باکتریال پایداری بر سطح غشاها دارند. بر خلاف نقره کلوئیدی معمولی، میکروسیلور رسوب سطحی طولانی‌مدت ایجاد کرده و فلور طبیعی را تخریب نمی‌کند.",
benefits: [
"مبارزه با باکتری‌های مقاوم در دهان و پوست",
"عدم آسیب به فلور طبیعی بدن",
"جایگزین ایمن برای آنتی‌بیوتیک‌های موضعی"
]
},
{
id: "colostrum",
name: "آغوز (Colostrum)",
description: "اولین شیر پستانداران که حاوی دوز بالایی از ایمونوگلوبولین‌ها (IgG, IgA, IgM)، لاکتوفرین و سایتوکاین‌ها برای فعال‌سازی فوری سیستم ایمنی است. سد دفاعی روده را تقویت کرده و از نفوذ پاتوژن‌ها جلوگیری می‌کند.",
benefits: [
"تقویت سد دفاعی روده",
"انتقال مستقیم آنتی‌بادی به نوزادان",
"تسریع نقاهت بعد از جراحی"
]
},
{
id: "peat-extract",
name: "عصاره پیت (Peat Extract)",
description: "ماده‌ای کاملاً طبیعی حاصل از تجزیه گیاهان در طول هزاران سال که غنی از اسیدهای هومیک با ساختار پلیمری دارای بار منفی است. سموم، قارچ‌ها و باکتری‌های مضر را در روده به دام انداخته و دفع می‌کند.",
benefits: [
"جذب سموم و فلزات سنگین در دستگاه گوارش",
"تنظیم فلور روده",
"بهبود اشتها و هضم"
]
},
{
id: "collagen",
name: "کلاژن هیدرولیز شده",
description: "پپتیدهای کلاژن نوع I و II با وزن مولکولی پایین که مستقیماً در ماتریکس غضروف مفصلی جذب شده و سنتز کلاژن را تحریک می‌کنند. پروتئین خالص ۹۴٪.",
benefits: [
"بازسازی غضروف مفصلی",
"تقویت بافت همبند",
"بهبود خاصیت ارتجاعی مفاصل"
]
},
{
id: "biotin",
name: "بیوتین (ویتامین H / B7)",
description: "کوآنزیم کربوکسیلازهای مسئول سنتز اسیدهای چرب و گلوکونئوژنز. با دوز ۱,۰۰۰,۰۰۰ میکروگرم در کیلوگرم در محصولات کانینا، قوی‌ترین دوز موجود در بازار مکمل‌های دامپزشکی.",
benefits: [
"جلوگیری از ریزش مو",
"تقویت رنگدانه پوشش",
"محکم‌سازی پنجه و ناخن"
]
},
{
id: "taurin",
name: "تورین",
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: "بی‌اشتهایی" },
{ id: "heart_disease", label: "نارسایی قلبی", condition: "نارسایی قلبی" },
{ id: "parasites", 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, '..', '..', 'frontend', 'application', 'lib', '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();
});