// ───────────────────────────────────────────────────────────────────────────── // One-off content migration: // 1) move every existing radar_item → articles(type='radarfuture') as a BLOCK // article (رادار آینده), mapping its category to one of the 5 sub-menus. // 2) clear radar_items, then seed it with the 10 «در یک نگاه» (/at-a-glance) cards. // // Safe to run once. If radarfuture articles already exist it assumes the // migration ran and exits without doing anything. // // cd panel && node scripts/migrate-content.mjs // ───────────────────────────────────────────────────────────────────────────── import 'dotenv/config'; import { nanoid } from 'nanoid'; import { db } from '../db.js'; // radar_item.category → رادار آینده sub-menu const CAT_TO_SUBMENU = { market: 'بازار و زنجیره فولاد', commodity: 'بازار و زنجیره فولاد', tech: 'فناوری و نوآوری', geo: 'ژئوپلیتیک و اقتصاد جهانی', energy: 'پایداری و فولاد سبز', }; // the 10 «در یک نگاه» cards (mirrors src/pages/AtAGlance/AtAGlance.tsx) const GLANCE = [ { cat:'market', img:'/news/photo-1504307651254-35680f356dfd.jpg', title:'شوک هیدروژنی به بازار جهانی فولاد', body:['پروژه عظیم «فولاد سبز H2» در سوئد با جذب بی‌سابقه ۶.۵ میلیارد یورو سرمایه، رسماً وارد فاز اجرایی شد.','این تأسیسات با هدف کاهش ۹۵ درصدی انتشار CO₂، قواعد رقابت در زنجیره ارزش اروپا را برای همیشه بازتعریف می‌کند.'], analysis:'تحول فولاد سبز، فرصت صادراتی ایران را در بازارهای سنتی تهدید می‌کند.', tags:['فولاد سبز','هیدروژن','اروپا'], source:'Financial Times', date:'۱۴ اردیبهشت ۱۴۰۵' }, { cat:'market', img:'/news/photo-1581092160607-ee22731c9b4e.jpg', title:'CBAM اروپا وارد اجرای کامل شد', body:['با اجرای کامل مکانیسم تنظیم مرزهای کربنی، صادرکنندگان فولاد به اروپا موظف به پرداخت هزینه کامل کربن شدند.','این تحول فشار بی‌سابقه‌ای بر تولیدکنندگان مبتنی بر کوره بلند وارد کرده است.'], analysis:'ایران باید فوری‌ترین اولویت خود را کربن‌زدایی از فرآیند تولید قرار دهد.', tags:['CBAM','کربن','صادرات'], source:'Reuters', date:'۱۲ اردیبهشت ۱۴۰۵' }, { cat:'tech', img:'/news/photo-1518770660439-4636190af475.jpg', title:'هوش مصنوعی تقاضای فولاد مراکز داده را بازتعریف می‌کند', body:['موج ساخت مراکز داده هوش مصنوعی، تقاضای جدیدی برای مقاطع ساختمانی و فولاد ویژه ایجاد کرده است.','تحلیلگران پیش‌بینی می‌کنند این روند تا پایان دهه یکی از پیشران‌های اصلی رشد مصرف فولاد باشد.'], analysis:'فولادسازان باید ظرفیت تولید مقاطع ساختمانی پیشرفته را افزایش دهند.', tags:['هوش مصنوعی','مراکز داده','تقاضا'], source:'Bloomberg', date:'۱۰ اردیبهشت ۱۴۰۵' }, { cat:'tech', img:'/news/photo-1567789884554-0b844b597180.jpg', title:'اتوماسیون کوره‌های القایی در ایران', body:['چندین کارخانه بزرگ فولاد ایران سرمایه‌گذاری در سیستم‌های کنترل هوشمند کوره را آغاز کرده‌اند.','این سیستم‌ها توانایی کاهش مصرف انرژی تا ۱۵ درصد را دارند.'], analysis:'گام مثبتی است اما سرعت پیاده‌سازی باید افزایش یابد.', tags:['اتوماسیون','کوره','انرژی'], source:'فولاد نیوز', date:'۸ اردیبهشت ۱۴۰۵' }, { cat:'geo', img:'/news/photo-1540575467063-178a50c2df87.jpg', title:'تنش‌های خاورمیانه و تجارت فولاد', body:['ناآرامی‌های منطقه‌ای مسیرهای حمل‌ونقل دریایی را مختل کرده و هزینه‌های لجستیک را افزایش داده است.','صادرکنندگان ایرانی با چالش‌های اضافی در انتقال محصولات روبرو هستند.'], analysis:'تنوع‌بخشی در مسیرهای صادراتی اکنون یک ضرورت استراتژیک است.', tags:['ژئوپلیتیک','حمل دریایی','صادرات'], source:'Al Jazeera', date:'۶ اردیبهشت ۱۴۰۵' }, { cat:'geo', img:'/news/photo-1570168007204-dfb528c6958f.jpg', title:'رقابت چین و آمریکا بر سر فلزات استراتژیک', body:['تنش‌های ژئوپلیتیک میان قدرت‌های بزرگ، زنجیره تأمین فلزات حیاتی را بی‌ثبات کرده است.','این رقابت فرصت‌هایی برای تأمین‌کنندگان جایگزین ایجاد می‌کند.'], analysis:'ایران می‌تواند نقش تأمین‌کننده جایگزین برخی فلزات را ایفا کند.', tags:['چین','آمریکا','فلزات'], source:'Reuters', date:'۴ اردیبهشت ۱۴۰۵' }, { cat:'energy', img:'/news/photo-1466611653911-95081537e5b7.jpg', title:'بحران گاز و صنعت فولاد ایران', body:['کمبود گاز در فصل سرما چندین واحد فولادسازی را مجبور به تعلیق موقت تولید کرد.','این چالش ساختاری نیاز به سرمایه‌گذاری جدی در زیرساخت انرژی دارد.'], analysis:'بدون تأمین پایدار انرژی، اهداف تولید فولاد محقق نمی‌شود.', tags:['گاز','انرژی','تولید'], source:'ایسنا', date:'۲ اردیبهشت ۱۴۰۵' }, { cat:'energy', img:'/news/photo-1611273426858-450d8e3c9fce.jpg', title:'انرژی خورشیدی برای فولادسازی پایدار', body:['پتانسیل عظیم انرژی خورشیدی ایران می‌تواند پایه‌ای برای فولادسازی کم‌کربن باشد.','اولین پروژه‌های آزمایشی ترکیب پنل خورشیدی با کوره‌های الکتریکی در حال بررسی است.'], analysis:'سرمایه‌گذاری در این حوزه می‌تواند چند مشکل را هم‌زمان حل کند.', tags:['خورشیدی','فولاد سبز','EAF'], source:'PV Magazine', date:'۳۰ فروردین ۱۴۰۵' }, { cat:'commodity', img:'/news/photo-1540575467063-178a50c2df87.jpg', title:'قیمت سنگ‌آهن در مسیر کاهش', body:['کاهش تقاضای چین در بخش ساختمان قیمت سنگ‌آهن را به پایین‌ترین سطح دو سال گذشته رساند.','این کاهش برای تولیدکنندگان فولاد مبتنی بر کوره بلند مزیت هزینه‌ای ایجاد می‌کند.'], analysis:'فرصتی برای افزایش ذخیره‌سازی سنگ‌آهن با قیمت پایین وجود دارد.', tags:['سنگ‌آهن','چین','قیمت'], source:'Bloomberg', date:'۲۸ فروردین ۱۴۰۵' }, { cat:'commodity', img:'/news/photo-1504307651254-35680f356dfd.jpg', title:'نوسان قیمت زغال‌سنگ کک‌شو', body:['محدودیت‌های صادرات استرالیا و بارندگی در مناطق استخراجی، قیمت زغال کک‌شو را نوسانی کرده است.','این بی‌ثباتی برنامه‌ریزی تولید را برای کارخانه‌های کوره بلند دشوار می‌کند.'], analysis:'تنوع در منابع تأمین زغال‌سنگ یک اولویت استراتژیک است.', tags:['زغال‌سنگ','استرالیا','تولید'], source:'Metal Bulletin', date:'۲۶ فروردین ۱۴۰۵' }, ]; const done = await db.prepare("SELECT COUNT(*)::int AS n FROM articles WHERE type = 'radarfuture'").get(); if (done.n > 0) { console.log(`⏭ ${done.n} radarfuture article(s) already exist — migration already ran, exiting.`); process.exit(0); } // 1) radar_items → articles(radarfuture) as block articles const radars = await db.prepare('SELECT * FROM radar_items ORDER BY sort_order, created_at').all(); let migrated = 0; for (const r of radars) { const blocks = []; if (r.img) blocks.push({ type: 'image', url: r.img, caption: '' }); if (r.body_fa) blocks.push({ type: 'text', value: r.body_fa }); if (r.analysis_fa) blocks.push({ type: 'text', value: 'تحلیل راهبردی: ' + r.analysis_fa }); if (!blocks.length) blocks.push({ type: 'text', value: r.excerpt_fa || r.title_fa || '' }); const tags = r.tags ? JSON.parse(r.tags) : []; const sources = r.source ? [{ title: r.source, url: '' }] : []; await db.prepare(`INSERT INTO articles (id,title,category,type,publish_date,summary,body,cover_image,blocks,sources,tags,featured) VALUES (@id,@title,@category,'radarfuture',@publish_date,@summary,@body,@cover_image,@blocks,@sources,@tags,0)`) .run({ id: nanoid(14), title: r.title_fa || 'بدون عنوان', category: CAT_TO_SUBMENU[r.category] || 'آینده‌پژوهی و رصد هوشمند', publish_date: r.date_fa || null, summary: r.excerpt_fa || null, body: r.body_fa || null, cover_image: r.img || null, blocks: JSON.stringify(blocks), sources: JSON.stringify(sources), tags: JSON.stringify(tags), }); migrated++; } console.log(`✓ migrated ${migrated} radar_item(s) → رادار آینده (articles/radarfuture)`); // 2) clear radar_items, seed with the 10 «در یک نگاه» cards await db.prepare('DELETE FROM radar_items').run(); let seeded = 0; for (let i = 0; i < GLANCE.length; i++) { const c = GLANCE[i]; await db.prepare(`INSERT INTO radar_items (id,category,img,title_fa,date_fa,excerpt_fa,body_fa,analysis_fa,tags,source,sort_order) VALUES (@id,@category,@img,@title_fa,@date_fa,@excerpt_fa,@body_fa,@analysis_fa,@tags,@source,@sort_order)`) .run({ id: nanoid(14), category: c.cat, img: c.img, title_fa: c.title, date_fa: c.date, excerpt_fa: c.body[0] || '', body_fa: c.body.join('\n\n'), analysis_fa: c.analysis, tags: JSON.stringify(c.tags), source: c.source, sort_order: i, }); seeded++; } console.log(`✓ seeded ${seeded} «در یک نگاه» card(s) → radar_items`); console.log('🎉 migration complete.'); process.exit(0);