steelforesight/panel/seed-content.js

191 lines
36 KiB
JavaScript
Raw Permalink 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.

// panel/seed-content.js
// Run: node panel/seed-content.js
// Seeds all hardcoded frontend content into the panel DB via the REST API.
// Idempotent: skips any endpoint that already has data.
const BASE = process.env.SEED_BASE || `http://localhost:${process.env.PORT || 3000}`;
const USERNAME = process.env.ADMIN_USERNAME || 'admin';
const PASSWORD = process.env.ADMIN_PASSWORD || 'Andishkade1403';
let cookie = '';
async function req(path, { method = 'GET', body } = {}) {
const headers = { 'Content-Type': 'application/json' };
if (cookie) headers['Cookie'] = cookie;
const res = await fetch(`${BASE}${path}`, {
method, headers,
body: body ? JSON.stringify(body) : undefined,
});
const text = await res.text();
if (!res.ok) throw new Error(`${method} ${path}${res.status}: ${text}`);
const sc = res.headers.get('set-cookie');
if (sc) cookie = sc.split(';')[0];
return text ? JSON.parse(text) : null;
}
async function seedIfEmpty(label, checkPath, items, postFn) {
const existing = await req(checkPath);
if (Array.isArray(existing) && existing.length > 0) {
console.log(` SKIP ${label} (${existing.length} records exist)`);
return;
}
console.log(` SEED ${label} (${items.length} items)...`);
for (const item of items) {
try { await postFn(item); }
catch (e) { console.warn(` WARN ${label}:`, e.message); }
}
console.log(` OK ${label}`);
}
// ── DATA ──────────────────────────────────────────────────────────────────────
const EVENTS = [
{ titleFa: 'کنگره بین‌المللی فولاد ایران ۱۴۰۳', titleEn: 'Iran International Steel Congress 1403', dateFa: '12', dateEn: '12', monthFa: 'اسفند', monthEn: 'March', year: 1403, type: 'conference', locationFa: 'مرکز همایش‌های بین‌المللی تهران', locationEn: 'Tehran International Conference Centre', cityFa: 'تهران', cityEn: 'Tehran', descriptionFa: 'بزرگ‌ترین گردهمایی سالانه متخصصان، سیاست‌گذاران و فعالان صنعت فولاد ایران با حضور ۱۲۰۰ نفر شرکت‌کننده از ۲۵ کشور.', descriptionEn: 'The largest annual gathering of Iran steel industry specialists — 1,200 participants from 25 countries.', registrationOpen: 1, sortOrder: 1 },
{ titleFa: 'Middle East Steel & Metals 2024', titleEn: 'Middle East Steel & Metals 2024', dateFa: '25', dateEn: '25', monthFa: 'اسفند', monthEn: 'March', year: 1403, type: 'exhibition', locationFa: 'مرکز نمایشگاهی دبی ورلد ترید سنتر', locationEn: 'Dubai World Trade Centre', cityFa: 'دبی', cityEn: 'Dubai', descriptionFa: 'نمایشگاه تخصصی فولاد و فلزات خاورمیانه با حضور بیش از ۳۰۰ شرکت از ۴۰ کشور.', descriptionEn: 'Middle East steel and metals exhibition — 300+ companies from 40 countries.', registrationOpen: 1, sortOrder: 2 },
{ titleFa: 'نشست تخصصی سیاست‌گذاری فولاد ۱۴۰۴', titleEn: 'Steel Policy Seminar 1404', dateFa: '8', dateEn: '8', monthFa: 'فروردین', monthEn: 'April', year: 1404, type: 'seminar', locationFa: 'پژوهشکده توسعه صنعتی ایران', locationEn: 'Iran Industrial Development Research Institute', cityFa: 'تهران', cityEn: 'Tehran', descriptionFa: 'نشست تخصصی با حضور نمایندگان وزارت صمت، سازمان ایمیدرو و انجمن‌های تخصصی.', descriptionEn: 'Expert session with representatives from MIMT, IMIDRO and industry associations.', registrationOpen: 1, sortOrder: 3 },
{ titleFa: 'World Steel Forum 2025', titleEn: 'World Steel Forum 2025', dateFa: '20', dateEn: '20', monthFa: 'فروردین', monthEn: 'April', year: 1404, type: 'international', locationFa: 'مرکز کنفرانس برلین', locationEn: 'Berlin Conference Centre', cityFa: 'برلین', cityEn: 'Berlin', descriptionFa: 'اجلاس سالانه انجمن جهانی فولاد با تمرکز بر کربن‌زدایی، تجارت جهانی و تحولات ساختاری.', descriptionEn: 'World Steel Association annual summit on decarbonisation, global trade and structural change.', registrationOpen: 0, sortOrder: 4 },
{ titleFa: 'نمایشگاه متالورژی ایران', titleEn: 'Iran Metallurgy Expo', dateFa: '15', dateEn: '15', monthFa: 'اردیبهشت', monthEn: 'May', year: 1404, type: 'exhibition', locationFa: 'نمایشگاه بین‌المللی اصفهان', locationEn: 'Isfahan International Exhibition', cityFa: 'اصفهان', cityEn: 'Isfahan', descriptionFa: 'نمایشگاه تخصصی متالورژی، فولاد و فلزات غیرآهنی ایران با فناوری‌های نوین تولید.', descriptionEn: 'Specialised Iran metallurgy, steel and non-ferrous metals exhibition.', registrationOpen: 0, sortOrder: 5 },
{ titleFa: 'اجلاس OECD فولاد', titleEn: 'OECD Steel Summit', dateFa: '3', dateEn: '3', monthFa: 'خرداد', monthEn: 'June', year: 1404, type: 'international', locationFa: 'دفتر مرکزی OECD', locationEn: 'OECD Headquarters', cityFa: 'پاریس', cityEn: 'Paris', descriptionFa: 'نشست سالانه کمیته فولاد OECD برای بررسی مازاد ظرفیت جهانی و استانداردهای پایداری.', descriptionEn: 'OECD Steel Committee annual session on global overcapacity and sustainability standards.', registrationOpen: 0, sortOrder: 6 },
];
const TEAM = [
{ nameFa: 'دکتر علی محمدی', nameEn: 'Dr. Ali Mohammadi', roleFa: 'مدیر ارشد پژوهش', roleEn: 'Chief Research Officer', initial: 'م', bioFa: 'دکتری اقتصاد صنعتی از دانشگاه تهران با بیش از ۱۸ سال تجربه در تحلیل بازارهای فولاد و فلزات.', bioEn: 'PhD in Industrial Economics from University of Tehran, 18+ years in steel/metals market analysis.', expertise: ['اقتصاد صنعتی','تحلیل بازار فولاد','سیاست‌گذاری صنعتی','مدل‌سازی اقتصادی','تجارت بین‌الملل'], reportCount: 52, email: 'mohammadi@andishkade-foolad.ir', isExpert: 0, sortOrder: 1 },
{ nameFa: 'دکتر فاطمه احمدی', nameEn: 'Dr. Fatemeh Ahmadi', roleFa: 'مدیر تحقیقات ریسک', roleEn: 'Risk Research Director', initial: 'ا', bioFa: 'دکتری مدیریت ریسک از دانشگاه علم و صنعت ایران با تخصص در ارزیابی ریسک‌های ژئوپلیتیک.', bioEn: 'PhD in Risk Management from IUST, specialising in geopolitical and supply-chain risk.', expertise: ['مدیریت ریسک','تحریم‌پژوهی','ژئوپلیتیک انرژی','تأمین مالی پروژه','مذاکرات تجاری'], reportCount: 38, email: 'ahmadi@andishkade-foolad.ir', isExpert: 0, sortOrder: 2 },
{ nameFa: 'دکتر حسین کریمی', nameEn: 'Dr. Hossein Karimi', roleFa: 'تحلیلگر ارشد بازار', roleEn: 'Senior Market Analyst', initial: 'ک', bioFa: 'دکتری مهندسی مواد از دانشگاه صنعتی اصفهان با تخصص در متالورژی و اقتصاد بازار کامودیتی‌ها.', bioEn: 'PhD in Materials Engineering from Isfahan UT, combined expertise in metallurgy and commodity economics.', expertise: ['بازار جهانی فولاد','قیمت‌گذاری کامودیتی','متالورژی صنعتی','پیش‌بینی تقاضا','بازارهای آسیایی'], reportCount: 41, email: 'karimi@andishkade-foolad.ir', isExpert: 0, sortOrder: 3 },
{ nameFa: 'مهندس سارا رضایی', nameEn: 'Eng. Sara Rezaei', roleFa: 'پژوهشگر ارشد انرژی', roleEn: 'Senior Energy Researcher', initial: 'ر', bioFa: 'کارشناسی ارشد مهندسی انرژی از دانشگاه شریف با تمرکز بر بهینه‌سازی مصرف انرژی در صنایع سنگین.', bioEn: 'MSc in Energy Engineering from Sharif UT, focusing on energy optimisation in heavy industry.', expertise: ['انرژی صنعتی','ESG و پایداری','کربن‌زدایی','بهره‌وری انرژی','مقررات زیست‌محیطی'], reportCount: 29, email: 'rezaei@andishkade-foolad.ir', isExpert: 0, sortOrder: 4 },
{ nameFa: 'مهندس رضا توکلی', nameEn: 'Eng. Reza Tavakoli', roleFa: 'تحلیلگر بازار کامودیتی', roleEn: 'Commodity Market Analyst', initial: 'ت', bioFa: 'کارشناسی ارشد اقتصاد از دانشگاه تهران با تخصص در تحلیل بنیادی و تکنیکال بازارهای کامودیتی.', bioEn: 'MSc in Economics from University of Tehran, specialising in fundamental and technical commodity analysis.', expertise: ['بورس کالا','تحلیل تکنیکال','بازارهای آتی','قیمت‌گذاری سنگ‌آهن','بازار داخلی فولاد'], reportCount: 34, email: 'tavakoli@andishkade-foolad.ir', isExpert: 0, sortOrder: 5 },
{ nameFa: 'دکتر مریم حسینی', nameEn: 'Dr. Maryam Hosseini', roleFa: 'پژوهشگر ارشد صادرات', roleEn: 'Senior Export Researcher', initial: 'ح', bioFa: 'دکتری بازاریابی بین‌الملل از دانشگاه الزهرا با تجربه گسترده در بازارهای صادراتی آسیا، آفریقا و اروپای شرقی.', bioEn: 'PhD in International Marketing from Alzahra University, extensive experience in Asia, Africa and Eastern Europe export markets.', expertise: ['بازاریابی بین‌الملل','توسعه صادرات','بازار آفریقا و آسیا','استراتژی بازار','مذاکرات تجاری'], reportCount: 22, email: 'hosseini@andishkade-foolad.ir', isExpert: 0, sortOrder: 6 },
];
const PLANS = [
{ nameFa: 'فردی', nameEn: 'Individual', price: 350000, periodFa: 'ماهانه', periodEn: 'Monthly', features: ['دسترسی به تمام گزارش‌های پایه','دانلود ۵ گزارش در ماه','دریافت خبرنامه هفتگی','دسترسی به داده‌های قیمت لحظه‌ای','آرشیو ۱۲ ماه گذشته'], isFeatured: 0, ctaFa: 'شروع اشتراک', ctaEn: 'Start subscription', sortOrder: 1 },
{ nameFa: 'سازمانی', nameEn: 'Organisational', price: 1200000, periodFa: 'ماهانه', periodEn: 'Monthly', features: ['دسترسی کامل به تمام گزارش‌ها','دانلود نامحدود گزارش','دسترسی برای ۵ کاربر همزمان','گزارش‌های ویژه و تحلیل‌های فوری','آرشیو کامل از ابتدای تأسیس','مشاوره تلفنی ماهانه با تحلیلگران','داشبورد اختصاصی تحلیل بازار'], badgeFa: 'پرطرفدار', badgeEn: 'Popular', isFeatured: 1, ctaFa: 'شروع اشتراک', ctaEn: 'Start subscription', sortOrder: 2 },
{ nameFa: 'وزارتخانه', nameEn: 'Ministry', price: 0, periodFa: 'سالانه', periodEn: 'Annual', features: ['دسترسی نامحدود برای تمام کارکنان','سفارش گزارش‌های تحلیلی اختصاصی','نشست‌های تخصصی حضوری با تیم پژوهشی','پشتیبانی اولویت‌دار ۲۴/۷','داشبورد تصمیم‌گیری یکپارچه','API اتصال به سیستم‌های داخلی','آموزش و کارگاه‌های تخصصی دوره‌ای','گزارش‌دهی سفارشی برای سیاست‌گذاران'], isFeatured: 0, ctaFa: 'درخواست مشاوره', ctaEn: 'Request consultation', sortOrder: 3 },
];
const BANNERS = [
{ position: 'featured', active: 1, image: '/Horizontal_Book_Mockup_6 1.webp', ctaUrl: '', overlineFa: 'ماهنامه شماره ۱۲ منتشر شد...', titleFa: 'دیپلماسی معدنی در عصر انسدادهای ژئوپلیتیک', subtitleFa: 'Mineral Diplomacy in the Era of Geopolitical Blockades', ctaLabelFa: 'دانلود گزارش', overlineEn: 'Monthly issue #12 is out...', titleEn: 'Mineral Diplomacy in the Era of Geopolitical Blockades', subtitleEn: 'دیپلماسی معدنی در عصر انسدادهای ژئوپلیتیک', ctaLabelEn: 'Download report', sortOrder: 1 },
{ position: 'glance', active: 1, image: '/summit-banner.jpg', ctaUrl: '/events', overlineFa: 'نشست تخصصیِ راهبردی', titleFa: 'اجلاس دیپلماسی معدنی و تاب‌آوریِ زنجیره‌ی تامین', subtitleFa: 'Mineral Diplomacy & Supply-Chain Resilience Summit', ctaLabelFa: 'اطلاعات بیشتر و ثبت‌نام', overlineEn: 'Strategic Session', titleEn: 'Mineral Diplomacy & Supply-Chain Resilience Summit', subtitleEn: 'اجلاس دیپلماسی معدنی و تاب‌آوریِ زنجیره‌ی تامین', ctaLabelEn: 'Learn more & register', sortOrder: 2 },
{ position: 'media-split', active: 1, image: '/Horizontal_Book_Mockup_6 1.webp', ctaUrl: '/podcast', overlineFa: 'پادکست و ویدیوکست جدید', titleFa: 'کالبدشکافی عقلانی پیچیدگی‌های صنعتی', subtitleFa: 'Steel Industry Podcast & Videocast Series', ctaLabelFa: 'شنیدن پادکست', overlineEn: 'New Podcast & Videocast', titleEn: 'Deconstruction of Industrial Complexities', subtitleEn: 'کالبدشکافی عقلانی پیچیدگی‌های صنعتی', ctaLabelEn: 'Listen Podcast', sortOrder: 3 },
{ position: 'radar-market', active: 1, image: '/news/photo-1611974789855-9c2a0a7236a3.jpg', ctaUrl: '', overlineFa: 'تحلیل ویژه', titleFa: 'معماری نوین زنجیره تأمین', subtitleFa: 'A New Supply-Chain Architecture', ctaLabelFa: 'دانلود گزارش', overlineEn: 'Special Analysis', titleEn: 'A New Supply-Chain Architecture', subtitleEn: 'معماری نوین زنجیره تأمین', ctaLabelEn: 'Download report', sortOrder: 4 },
{ position: 'radar-sustainability', active: 1, image: '/news/photo-1466611653911-95081537e5b7.jpg', ctaUrl: '', overlineFa: 'تحلیل ویژه', titleFa: 'مسیر کربن‌زدایی صنعت فولاد', subtitleFa: 'The Steel Decarbonization Pathway', ctaLabelFa: 'دانلود گزارش', overlineEn: 'Special Analysis', titleEn: 'The Steel Decarbonization Pathway', subtitleEn: 'مسیر کربن‌زدایی صنعت فولاد', ctaLabelEn: 'Download report', sortOrder: 5 },
{ position: 'radar-geopolitics', active: 1, image: '/news/photo-1518770660439-4636190af475.jpg', ctaUrl: '', overlineFa: 'تحلیل ویژه', titleFa: 'ژئوپلیتیک تجارت فولاد', subtitleFa: 'The Geopolitics of Steel Trade', ctaLabelFa: 'دانلود گزارش', overlineEn: 'Special Analysis', titleEn: 'The Geopolitics of Steel Trade', subtitleEn: 'ژئوپلیتیک تجارت فولاد', ctaLabelEn: 'Download report', sortOrder: 6 },
{ position: 'radar-technology', active: 1, image: '/news/photo-1581092160607-ee22731c9b4e.jpg', ctaUrl: '', overlineFa: 'تحلیل ویژه', titleFa: 'انقلاب دیجیتال در صنعت فولاد', subtitleFa: 'The Digital Revolution in Steel', ctaLabelFa: 'دانلود گزارش', overlineEn: 'Special Analysis', titleEn: 'The Digital Revolution in Steel', subtitleEn: 'انقلاب دیجیتال در صنعت فولاد', ctaLabelEn: 'Download report', sortOrder: 7 },
];
const VISION_ITEMS = [
{ icon: 'FlaskConical', titleFa: 'پیشرو در پژوهش', titleEn: 'Research Leadership', descFa: 'تولید تحلیل‌های راهبردی و گزارش‌های تخصصی در حوزه صنعت فولاد', descEn: 'Producing strategic analyses and specialised reports in the steel industry', sortOrder: 1 },
{ icon: 'Network', titleFa: 'شبکه‌سازی خبرگان', titleEn: 'Expert Networking', descFa: 'ایجاد پیوند میان متخصصان، سیاست‌گذاران و فعالان صنعتی', descEn: 'Building connections between specialists, policymakers, and industry practitioners', sortOrder: 2 },
{ icon: 'Leaf', titleFa: 'فولاد سبز', titleEn: 'Green Steel', descFa: 'ترویج رویکردهای پایدار و کاهش اثرات زیست‌محیطی در زنجیره فولاد', descEn: 'Promoting sustainable approaches and reducing environmental impacts across the steel chain', sortOrder: 3 },
];
const ADVISORY_BOARD = [
{ nameFa: 'دکتر علیرضا اکبریان', nameEn: 'Dr. Alireza Akbarian', roleFa: 'مدیر اندیشکده', roleEn: 'Institute Director', sortOrder: 1 },
{ nameFa: 'مهندس سارا محمدی', nameEn: 'Eng. Sara Mohammadi', roleFa: 'پژوهشگر ارشد فولاد سبز', roleEn: 'Senior Green Steel Researcher', sortOrder: 2 },
{ nameFa: 'دکتر محمد جلالی', nameEn: 'Dr. Mohammad Jalali', roleFa: 'تحلیلگر بازارهای جهانی', roleEn: 'Global Markets Analyst', sortOrder: 3 },
{ nameFa: 'دکتر فاطمه رضایی', nameEn: 'Dr. Fatemeh Rezaei', roleFa: 'متخصص ژئوپلیتیک صنعتی', roleEn: 'Industrial Geopolitics Specialist', sortOrder: 4 },
{ nameFa: 'مهندس رضا کریمی', nameEn: 'Eng. Reza Karimi', roleFa: 'کارشناس فناوری و نوآوری', roleEn: 'Technology & Innovation Expert', sortOrder: 5 },
];
const VIDEOS = [
{ title: 'نگاهی به آن سوی مرزهای تولید', author: 'مهندس سیامک فجری', summary: 'فراتر از داده‌های خام قیمت و تناژ، به سراغ مهندسی تغییر و معماری آینده صنعت می‌رویم.', type: 'video', category: 'تولید داخلی', publishDate: '۲۵ خرداد ۱۴۰۵', coverImage: '/news/photo-1504307651254-35680f356dfd.jpg', isFree: true, tags: ['EP.12','ویدیوکست'] },
{ title: 'تحلیل بازار جهانی فلزات پایه', author: 'دکتر نیلوفر احمدی', summary: 'نوسانات قیمت مس، آلومینیوم و روی و تأثیر آن بر زنجیره ارزش فولاد.', type: 'video', category: 'بازار جهانی', publishDate: '۱۸ خرداد ۱۴۰۵', coverImage: '/news/photo-1558618666-fcd25c85cd64.jpg', isFree: true, tags: ['EP.11','ویدیوکست'] },
{ title: 'ژئوپلیتیک و صادرات فولاد ایران', author: 'مهندس فرید تهرانی', summary: 'تأثیر تحولات منطقه‌ای بر بازارهای صادراتی فولاد ایران و فرصت‌های پیش رو.', type: 'video', category: 'صادرات', publishDate: '۱۱ خرداد ۱۴۰۵', coverImage: '/news/photo-1504328345606-18bbc8c9d7d1.jpg', isFree: true, tags: ['EP.10','ویدیوکست'] },
{ title: 'سرمایه‌گذاری در زنجیره ارزش فولاد', author: 'دکتر آرش کریمی', summary: 'فرصت‌ها و چالش‌های سرمایه‌گذاری در بخش‌های مختلف زنجیره ارزش فولاد.', type: 'video', category: 'بازار جهانی', publishDate: '۴ خرداد ۱۴۰۵', coverImage: '/news/photo-1611273426858-450d8e3c9fce.jpg', isFree: true, tags: ['EP.09','ویدیوکست'] },
{ title: 'آینده فولاد سبز در ایران', author: 'مهندس کاوه رستمی', summary: 'مسیر گذار به فولاد کم‌کربن در ایران؛ چالش‌ها، فرصت‌ها و ضرورت سرمایه‌گذاری.', type: 'video', category: 'انرژی و ESG', publishDate: '۲۸ اردیبهشت ۱۴۰۵', coverImage: '/news/photo-1566873535350-6586b0b7a1f2.jpg', isFree: true, tags: ['EP.08','ویدیوکست'] },
{ title: 'هوش مصنوعی و تحول کارخانه‌های فولاد', author: 'دکتر رضا محمدی', summary: 'چگونه یادگیری ماشین کارایی خطوط تولید فولاد را متحول می‌کند.', type: 'video', category: 'تولید داخلی', publishDate: '۲۱ اردیبهشت ۱۴۰۵', coverImage: '/news/photo-1578662996442-48f60103fc96.jpg', isFree: true, tags: ['EP.07','ویدیوکست'] },
];
const PODCASTS = [
{ title: 'کالبدشکافی عقلانی پیچیدگی‌های صنعتی', author: 'مهندس سیامک شجاعی', summary: 'صنعت فولاد در عصر حاضر، در پیچیده‌ترین چرخه حیات خود قرار گرفته است؛ جایی که همگرایی هوش مصنوعی، الزامات زیست‌محیطی و تنش‌های ژئواکونومیک، قواعد کلاسیک تولید و تجارت را به‌کلی بازنویسی کرده‌اند.', type: 'podcast', category: 'تولید داخلی', publishDate: '۲۵ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1540575467063-178a50c2df87.jpg', isFree: true, tags: ['اپیزود ۷۷','پادکست'] },
{ title: 'آزمایشگاه کوره؛ فناوری‌های نوین فولادسازی', author: 'دکتر رضا محمدی', summary: 'در این اپیزود با نگاهی موشکافانه به چالش‌های فنی گذار از کوره‌های بلند به فولادسازی پاک می‌پردازیم.', type: 'podcast', category: 'تولید داخلی', publishDate: '۱۸ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1566873535350-6586b0b7a1f2.jpg', isFree: true, tags: ['اپیزود ۷۶','پادکست'] },
{ title: 'معمار فولاد؛ رهبری در عصر تحول', author: 'مهندس کاوه رستمی', summary: 'داستان ساختن فولاد فردا؛ روایت رهبرانی که مدل‌های سنتی کسب‌وکار را به چالش کشیده‌اند.', type: 'podcast', category: 'تولید داخلی', publishDate: '۱۱ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1578662996442-48f60103fc96.jpg', isFree: true, tags: ['اپیزود ۷۵','پادکست'] },
{ title: 'فولاد سبز؛ رویا یا واقعیت؟', author: 'دکتر نیلوفر احمدی', summary: 'بررسی مسیر دشوار و پرهزینه گذار به تولید فولاد با کمترین انتشار کربن و آنچه صنعت ایران باید بداند.', type: 'podcast', category: 'انرژی و ESG', publishDate: '۴ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1504328345606-18bbc8c9d7d1.jpg', isFree: true, tags: ['اپیزود ۷۴','پادکست'] },
{ title: 'بازی بزرگ؛ چین، هند و آینده بازار فولاد', author: 'مهندس فرید تهرانی', summary: 'چگونه رقابت دو غول آسیایی مسیر بازار جهانی فولاد را در دهه پیش رو تغییر خواهد داد.', type: 'podcast', category: 'بازار جهانی', publishDate: '۲۸ / اردیبهشت / ۱۴۰۵', coverImage: '/news/photo-1558618666-fcd25c85cd64.jpg', isFree: true, tags: ['اپیزود ۷۳','پادکست'] },
{ title: 'هوش مصنوعی در خط تولید فولاد', author: 'دکتر آرش کریمی', summary: 'کاربردهای عملی یادگیری ماشین در بهینه‌سازی فرآیند ذوب، کنترل کیفیت و نگهداری پیش‌گیرانه.', type: 'podcast', category: 'تولید داخلی', publishDate: '۲۱ / اردیبهشت / ۱۴۰۵', coverImage: '/news/photo-1611273426858-450d8e3c9fce.jpg', isFree: true, tags: ['اپیزود ۷۲','پادکست'] },
];
const RADAR_ITEMS = [
{ category: 'commodity', img: '/news/photo-1611273426858-450d8e3c9fce.jpg', authorName: 'دکتر سارا احمدی', authorAvatar: '/news/photo-1494790108377-be9c29b29330.jpg', titleFa: 'پیش‌بینی بازار با هوش مصنوعی', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'مدل‌های یادگیری ماشین تقاضای لیتیوم و فلزات باتری را در افق ۲۰۳۵ بازتعریف می‌کنند.', titleEn: 'AI-Powered Market Forecasting', dateEn: 'May 4, 2026', excerptEn: 'Machine-learning models are redefining lithium and battery-metal demand on the 2035 horizon.', sortOrder: 1 },
{ category: 'tech', img: '/news/photo-1581092160607-ee22731c9b4e.jpg', authorName: 'مهندس رضا کریمی', authorAvatar: '/news/photo-1500648767791-00dcc994a43e.jpg', titleFa: 'تحول دیجیتال در زنجیره ارزش فولاد', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'تحول دیجیتال و اتوماسیون هوشمند در حال تغییر بنیادین زنجیره ارزش فولاد هستند.', titleEn: 'Digital Transformation in Steel Value Chain', dateEn: 'May 4, 2026', excerptEn: 'Digital transformation and smart automation are fundamentally reshaping the steel value chain.', sortOrder: 2 },
{ category: 'market', img: '/news/photo-1504307651254-35680f356dfd.jpg', authorName: 'دکتر مریم رضایی', authorAvatar: '/news/photo-1438761681033-6461ffad8d80.jpg', titleFa: 'تأثیر نوسانات طلا بر سرمایه‌گذاری فولاد', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'تحلیل روند قیمت طلا و فلزات گران‌بها و اثر آن بر سرمایه‌گذاری در زنجیره فولاد.', titleEn: 'Gold Volatility Impact on Steel Investment', dateEn: 'May 4, 2026', excerptEn: 'Gold and precious-metal price trends and their effect on steel-chain investment.', sortOrder: 3 },
{ category: 'geo', img: '/news/photo-1518770660439-4636190af475.jpg', authorName: 'دکتر علی موسوی', authorAvatar: '/news/photo-1472099645785-5658abf4ff4e.jpg', titleFa: 'ژئوپلیتیک و بازارهای صادراتی فولاد ایران', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'هندسه قدرت جهانی و اثر تحولات ژئوپلیتیک بر بازارهای صادراتی فولاد ایران.', titleEn: "Geopolitics and Iran's Steel Export Markets", dateEn: 'May 4, 2026', excerptEn: "Global power geometry and the impact of geopolitics on Iran's steel export markets.", sortOrder: 4 },
{ category: 'energy', img: '/news/photo-1466611653911-95081537e5b7.jpg', authorName: 'مهندس نازنین حسینی', authorAvatar: '/news/photo-1544005313-94ddf0286df2.jpg', titleFa: 'گذار انرژی و فولاد سبز', dateFa: '۱۲ اردیبهشت ۱۴۰۵', excerptFa: 'هیدروژن سبز و برق تجدیدپذیر مسیر کربن‌زدایی صنعت فولاد را شتاب می‌دهند.', titleEn: 'Energy Transition & Green Steel', dateEn: 'May 2, 2026', excerptEn: 'Green hydrogen and renewable power are accelerating steel decarbonization.', sortOrder: 5 },
{ category: 'tech', img: '/news/photo-1567789884554-0b844b597180.jpg', authorName: 'دکتر سارا احمدی', authorAvatar: '/news/photo-1494790108377-be9c29b29330.jpg', titleFa: 'اتوماسیون خطوط نورد', dateFa: '۱۰ اردیبهشت ۱۴۰۵', excerptFa: 'سیستم‌های کنترل هوشمند بهره‌وری خطوط نورد را تا ۲۲٪ افزایش داده‌اند.', titleEn: 'Rolling Line Automation', dateEn: 'Apr 30, 2026', excerptEn: 'Smart control systems have boosted rolling-line productivity by up to 22%.', sortOrder: 6 },
{ category: 'commodity', img: '/news/photo-1570168007204-dfb528c6958f.jpg', authorName: 'مهندس رضا کریمی', authorAvatar: '/news/photo-1500648767791-00dcc994a43e.jpg', titleFa: 'زنجیره تأمین سنگ‌آهن', dateFa: '۸ اردیبهشت ۱۴۰۵', excerptFa: 'نوسانات عرضه سنگ‌آهن استرالیا و برزیل و پیامد آن برای تولیدکنندگان منطقه.', titleEn: 'Iron Ore Supply Chain', dateEn: 'Apr 28, 2026', excerptEn: 'Australian and Brazilian iron-ore supply swings and their regional fallout.', sortOrder: 7 },
{ category: 'market', img: '/news/photo-1540575467063-178a50c2df87.jpg', authorName: 'دکتر مریم رضایی', authorAvatar: '/news/photo-1438761681033-6461ffad8d80.jpg', titleFa: 'تحلیل بازار جهانی فولاد', dateFa: '۶ اردیبهشت ۱۴۰۵', excerptFa: 'سیل صادرات فولاد چین و فشار قیمتی بر بازارهای هدف صادراتی ایران.', titleEn: 'Global Steel Market Analysis', dateEn: 'Apr 26, 2026', excerptEn: "China's steel export flood and price pressure on Iran's target export markets.", sortOrder: 8 },
];
const FACTORY_REPORTS = [
{ img: '/news/photo-1504307651254-35680f356dfd.jpg', scrollDir: 'left', tagFa: 'تولید و صادرات', titleFa: 'تحلیل عملکرد تولید و صادرات', dateFa: 'بهمن ۱۴۰۳', excerptFa: 'بررسی آمار تولید ماهانه، مقایسه با بودجه سالانه و روند صادرات فولاد تخت در بازارهای منطقه‌ای.', tagEn: 'Output & Exports', titleEn: 'Production & Export Performance', dateEn: 'Feb 2025', excerptEn: 'Monthly output vs. annual budget and the flat-steel export trend across regional markets.', sortOrder: 1 },
{ img: '/news/photo-1581092160607-ee22731c9b4e.jpg', scrollDir: 'left', tagFa: 'بازار و قیمت', titleFa: 'وضعیت بازار و قیمت‌گذاری', dateFa: 'دی ۱۴۰۳', excerptFa: 'تحلیل نوسانات قیمت فولاد تخت در بازار داخلی و اثر نرخ ارز بر چشم‌انداز زمستان.', tagEn: 'Market & Price', titleEn: 'Market & Pricing Outlook', dateEn: 'Jan 2025', excerptEn: 'Flat-steel price swings in the domestic market and the FX effect on the winter outlook.', sortOrder: 2 },
{ img: '/news/photo-1518770660439-4636190af475.jpg', scrollDir: 'left', tagFa: 'فناوری', titleFa: 'دیجیتال‌سازی خطوط تولید', dateFa: 'آذر ۱۴۰۳', excerptFa: 'گزارشی از پیاده‌سازی سامانه‌های کنترل هوشمند و اثر آن بر بهره‌وری خطوط نورد.', tagEn: 'Technology', titleEn: 'Production Line Digitalization', dateEn: 'Dec 2024', excerptEn: 'Rolling-out smart control systems and their impact on rolling-line productivity.', sortOrder: 3 },
{ img: '/news/photo-1567789884554-0b844b597180.jpg', scrollDir: 'up', tagFa: 'نیروی انسانی', titleFa: 'تحلیل نیروی انسانی و بهره‌وری', dateFa: 'آبان ۱۴۰۳', excerptFa: 'شاخص‌های بهره‌وری نیروی کار، آموزش‌های ماهانه و آمار ایمنی شغلی.', tagEn: 'Workforce', titleEn: 'Workforce & Productivity', dateEn: 'Nov 2024', excerptEn: 'Labor productivity indicators, monthly training and occupational-safety statistics.', sortOrder: 4 },
{ img: '/news/photo-1466611653911-95081537e5b7.jpg', scrollDir: 'up', tagFa: 'پایداری', titleFa: 'گزارش پایداری و محیط زیست', dateFa: 'آذر ۱۴۰۳', excerptFa: 'شاخص‌های زیست‌محیطی ماهانه؛ مصرف انرژی، کاهش انتشار کربن و بازچرخانی پساب صنعتی.', tagEn: 'Sustainability', titleEn: 'Sustainability & Environment', dateEn: 'Dec 2024', excerptEn: 'Monthly environmental metrics: energy use, carbon reduction and industrial water recycling.', sortOrder: 5 },
{ img: '/news/photo-1570168007204-dfb528c6958f.jpg', scrollDir: 'up', tagFa: 'زنجیره تأمین', titleFa: 'تأمین مواد اولیه و لجستیک', dateFa: 'مهر ۱۴۰۳', excerptFa: 'وضعیت تأمین سنگ‌آهن و قراضه، موجودی انبار و تحلیل ریسک زنجیره تأمین.', tagEn: 'Supply Chain', titleEn: 'Raw Materials & Logistics', dateEn: 'Oct 2024', excerptEn: 'Iron-ore and scrap supply, inventory levels and supply-chain risk analysis.', sortOrder: 6 },
{ img: '/news/photo-1611273426858-450d8e3c9fce.jpg', scrollDir: 'right', tagFa: 'سرمایه‌گذاری', titleFa: 'طرح‌های توسعه و سرمایه‌گذاری', dateFa: 'شهریور ۱۴۰۳', excerptFa: 'پیشرفت طرح‌های توسعه ظرفیت و تحلیل بازده سرمایه‌گذاری پروژه‌های جاری.', tagEn: 'Investment', titleEn: 'Expansion & Investment Plans', dateEn: 'Sep 2024', excerptEn: 'Capacity-expansion progress and ROI analysis of ongoing projects.', sortOrder: 7 },
{ img: '/news/photo-1485827404703-89b55fcc595e.jpg', scrollDir: 'right', tagFa: 'کیفیت', titleFa: 'کنترل کیفیت با هوش مصنوعی', dateFa: 'مرداد ۱۴۰۳', excerptFa: 'کاربرد بینایی ماشین در تشخیص عیوب سطحی و کاهش نرخ ضایعات تولید.', tagEn: 'Quality', titleEn: 'AI-Driven Quality Control', dateEn: 'Aug 2024', excerptEn: 'Machine vision for surface-defect detection and lower production scrap rates.', sortOrder: 8 },
{ img: '/news/photo-1613665813446-82a78c468a1d.jpg', scrollDir: 'right', tagFa: 'انرژی', titleFa: 'تحلیل مصرف انرژی و بهینه‌سازی', dateFa: 'تیر ۱۴۰۳', excerptFa: 'الگوی مصرف برق و گاز، فرصت‌های بهینه‌سازی و اثر آن بر بهای تمام‌شده.', tagEn: 'Energy', titleEn: 'Energy Use & Optimization', dateEn: 'Jul 2024', excerptEn: 'Electricity and gas usage patterns, optimization opportunities and cost impact.', sortOrder: 9 },
];
const INTEGRATIONS = [
{ name: 'London Metal Exchange', icon: 'exchange', accent: '#CD9E53', gridCol: 6, gridRow: 1, sortOrder: 1 },
{ name: 'Shanghai Futures Exchange', icon: 'trending', accent: '#c0392b', gridCol: 4, gridRow: 2, sortOrder: 2 },
{ name: 'S&P Global Platts', icon: 'chart', accent: '#2471a3', gridCol: 6, gridRow: 2, sortOrder: 3 },
{ name: 'Reuters', icon: 'newspaper', accent: '#e67e22', gridCol: 3, gridRow: 3, sortOrder: 4 },
{ name: 'Fastmarkets', icon: 'activity', accent: '#1e8449', gridCol: 5, gridRow: 3, sortOrder: 5 },
{ name: 'World Steel Association', icon: 'building', accent: '#7d3c98', gridCol: 4, gridRow: 4, sortOrder: 6 },
{ name: 'Mysteel', icon: 'database', accent: '#16a085', gridCol: 6, gridRow: 4, sortOrder: 7 },
{ name: 'CME Group', icon: 'coins', accent: '#2980b9', gridCol: 5, gridRow: 5, sortOrder: 8 },
{ name: 'Dalian Commodity Exchange', icon: 'globe', accent: '#d35400', gridCol: 3, gridRow: 5, sortOrder: 9 },
];
// ── MAIN ──────────────────────────────────────────────────────────────────────
async function main() {
console.log('Logging in...');
await req('/api/auth/login', { method: 'POST', body: { username: USERNAME, password: PASSWORD } });
console.log('OK. Seeding...\n');
await seedIfEmpty('Events', '/api/events?limit=1', EVENTS, i => req('/api/events', { method: 'POST', body: i }));
await seedIfEmpty('Team', '/api/team?limit=1', TEAM, i => req('/api/team', { method: 'POST', body: i }));
await seedIfEmpty('Plans', '/api/plans?limit=1', PLANS, i => req('/api/plans', { method: 'POST', body: i }));
await seedIfEmpty('Banners', '/api/banners?limit=1', BANNERS, i => req('/api/banners', { method: 'POST', body: i }));
await seedIfEmpty('Vision Items', '/api/vision-items?limit=1', VISION_ITEMS, i => req('/api/vision-items', { method: 'POST', body: i }));
await seedIfEmpty('Advisory Board', '/api/advisory-board?limit=1', ADVISORY_BOARD, i => req('/api/advisory-board', { method: 'POST', body: i }));
await seedIfEmpty('Radar Items', '/api/radar?limit=1', RADAR_ITEMS, i => req('/api/radar', { method: 'POST', body: i }));
await seedIfEmpty('Factory Reports','/api/factory-reports?limit=1', FACTORY_REPORTS,i => req('/api/factory-reports', { method: 'POST', body: i }));
await seedIfEmpty('Integrations', '/api/integrations?limit=1', INTEGRATIONS, i => req('/api/integrations', { method: 'POST', body: i }));
// Videos + Podcasts live in /api/articles — check by type
const existingVideos = await req('/api/articles?type=video&limit=1');
if (Array.isArray(existingVideos) && existingVideos.length > 0) {
console.log(` SKIP Videos (records exist)`);
} else {
console.log(` SEED Videos (${VIDEOS.length} items)...`);
for (const v of VIDEOS) {
try { await req('/api/articles', { method: 'POST', body: v }); }
catch (e) { console.warn(' WARN Video:', e.message); }
}
console.log(' OK Videos');
}
const existingPodcasts = await req('/api/articles?type=podcast&limit=1');
if (Array.isArray(existingPodcasts) && existingPodcasts.length > 0) {
console.log(` SKIP Podcasts (records exist)`);
} else {
console.log(` SEED Podcasts (${PODCASTS.length} items)...`);
for (const p of PODCASTS) {
try { await req('/api/articles', { method: 'POST', body: p }); }
catch (e) { console.warn(' WARN Podcast:', e.message); }
}
console.log(' OK Podcasts');
}
console.log('\nDone. Panel DB seeded.');
}
main().catch(err => { console.error('FATAL:', err.message); process.exit(1); });