// One-off: backfill «در یک نگاه» (radar_items) with random plausible Jalali dates, // credible sources, category tags (so hashtags work), and category-consistent images. // Run once: node seed-radar.js import 'dotenv/config'; import pg from 'pg'; const { Pool } = pg; const pool = new Pool({ connectionString: process.env.DATABASE_URL, ssl: process.env.DATABASE_SSL === 'disable' ? false : { rejectUnauthorized: false }, }); const FA_DIGITS = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹']; const faNum = (n) => String(n).replace(/\d/g, (d) => FA_DIGITS[+d]); // Jalali month → rough Gregorian month for the English date const MONTHS = [ { fa: 'فروردین', en: 'Apr' }, { fa: 'اردیبهشت', en: 'May' }, { fa: 'خرداد', en: 'Jun' }, { fa: 'تیر', en: 'Jul' }, { fa: 'مرداد', en: 'Aug' }, { fa: 'شهریور', en: 'Sep' }, ]; const SOURCES = [ 'Reuters', 'Bloomberg', 'Financial Times', 'S&P Global Platts', 'Metal Bulletin', 'Fastmarkets', 'Kallanish', 'Mining.com', 'worldsteel', 'دنیای اقتصاد', 'ایسنا', 'فولاد نیوز', 'چیلان', ]; const TAGS = { market: ['بازار جهانی', 'قیمت فولاد', 'تقاضا', 'عرضه', 'صادرات'], tech: ['فناوری', 'نوآوری', 'هوش مصنوعی', 'اتوماسیون', 'هیدروژن'], commodity: ['سنگ آهن', 'زغال سنگ', 'کامودیتی', 'مواد اولیه', 'قراضه'], geo: ['ژئوپلیتیک', 'تحریم', 'تجارت جهانی', 'زنجیره تأمین', 'CBAM'], energy: ['انرژی', 'گاز', 'برق', 'فولاد سبز', 'کربن زدایی'], }; // category-relevant cover (best available stock in /public/news) const IMG = { market: '/news/photo-1504307651254-35680f356dfd.jpg', tech: '/news/photo-1518770660439-4636190af475.jpg', commodity: '/news/photo-1540575467063-178a50c2df87.jpg', geo: '/news/photo-1570168007204-dfb528c6958f.jpg', energy: '/news/photo-1466611653911-95081537e5b7.jpg', }; const pick = (arr) => arr[Math.floor(Math.random() * arr.length)]; const pickN = (arr, n) => [...arr].sort(() => Math.random() - 0.5).slice(0, n); const rows = (await pool.query('SELECT id, category, tags, img FROM radar_items')).rows; console.log(`Updating ${rows.length} radar_items…`); let n = 0; for (const r of rows) { const m = pick(MONTHS); const day = 1 + Math.floor(Math.random() * 28); const dateFa = `${faNum(day)} ${m.fa} ۱۴۰۵`; const dateEn = `${m.en} ${day}, 2026`; const source = pick(SOURCES); const cat = TAGS[r.category] ? r.category : 'market'; // keep existing tags if present; otherwise seed 3 category tags let tags = r.tags; try { const parsed = JSON.parse(r.tags || '[]'); if (!parsed.length) tags = null; } catch { tags = null; } if (!tags) tags = JSON.stringify(pickN(TAGS[cat], 3)); // set a category-relevant image unless the editor uploaded one (/media/…) const img = (r.img && r.img.startsWith('/media/')) ? r.img : IMG[cat]; await pool.query( `UPDATE radar_items SET date_fa=$1, date_en=$2, source=$3, tags=$4, img=$5, updated_at=now() WHERE id=$6`, [dateFa, dateEn, source, tags, img, r.id] ); n++; } console.log(`✓ Updated ${n} rows.`); await pool.end(); process.exit(0);