/** * Menu seed — seeds all dishes, variants, and deals from the Golden Wok menu card. * Run: npm run seed:menu */ require('dotenv').config({ path: require('path').resolve(__dirname, '../.env') }); const mongoose = require('mongoose'); const Category = require('./models/Category'); const MenuItem = require('./models/MenuItem'); // ── Full menu data from menu card ──────────────────────────── const MENU_DATA = [ // ── SOUPS ────────────────────────────────────────────────── { category: 'Soups', items: [ { name: 'Chicken Corn Soup', variants: [{ label: 'Full', price: 800 }, { label: 'Half', price: 500 }] }, { name: 'Chicken Hot and Sour Soup', variants: [{ label: 'Full', price: 800 }, { label: 'Half', price: 500 }] }, { name: 'Soup Single Cup', variants: [{ label: 'Regular', price: 270 }] }, { name: 'Fish Crackers', variants: [{ label: 'Full', price: 400 }, { label: 'Half', price: 280 }] }, ], }, // ── APPETIZERS ───────────────────────────────────────────── { category: 'Appetizers', items: [ { name: 'Honey Chicken Wings', variants: [{ label: 'Full', price: 800 }, { label: 'Half', price: 600 }] }, { name: 'Spicy Fried Fish', variants: [{ label: 'Full', price: 1600 }, { label: 'Half', price: 900 }] }, { name: 'Chicken Drum Stick', variants: [{ label: 'Full', price: 1700 }, { label: 'Half', price: 900 }] }, ], }, // ── RICE ─────────────────────────────────────────────────── { category: 'Rice', items: [ { name: 'Chicken Fried Rice', variants: [{ label: 'Full', price: 800 }, { label: 'Half', price: 550 }] }, { name: 'Egg Fried Rice', variants: [{ label: 'Full', price: 750 }, { label: 'Half', price: 500 }] }, { name: 'Chicken Masala Rice', variants: [{ label: 'Full', price: 800 }, { label: 'Half', price: 550 }] }, ], }, // ── NOODLES ──────────────────────────────────────────────── { category: 'Noodles', items: [ { name: 'Chicken Chow Mein', variants: [{ label: 'Full', price: 900 }, { label: 'Half', price: 600 }] }, // Prawn Chow Mein listed as N/A — created but marked unavailable { name: 'Prawn Chow Mein', variants: [{ label: 'Full', price: 0 }, { label: 'Half', price: 0 }], available: false }, ], }, // ── CHICKEN GRAVY ────────────────────────────────────────── { category: 'Chicken Gravy', items: [ { name: 'Chicken Manchurian', variants: [{ label: 'Full', price: 900 }, { label: 'Half', price: 600 }] }, { name: 'Black Pepper Chicken with Chillies & Onion', variants: [{ label: 'Full', price: 900 }, { label: 'Half', price: 600 }] }, { name: 'Braised Chicken in Hot Spices', variants: [{ label: 'Full', price: 1050 }, { label: 'Half', price: 700 }] }, { name: 'Garlic Chicken', variants: [{ label: 'Full', price: 1000 }, { label: 'Half', price: 700 }] }, { name: 'Chicken Button Mushroom in Garlic Sauce', variants: [{ label: 'Full', price: 1000 }, { label: 'Half', price: 700 }] }, { name: 'Chicken Chilly Dry', variants: [{ label: 'Full', price: 1050 }, { label: 'Half', price: 850 }] }, { name: 'Chicken Chilly Vegetable', variants: [{ label: 'Full', price: 1000 }, { label: 'Half', price: 700 }] }, { name: 'Chicken with Cashew Nuts', variants: [{ label: 'Full', price: 1050 }] }, { name: 'Chicken Shashlik', variants: [{ label: 'Full', price: 1000 }, { label: 'Half', price: 700 }] }, ], }, // ── SEA FOOD ─────────────────────────────────────────────── { category: 'Sea Food', items: [ { name: 'Garlic Shrimp', variants: [{ label: 'Full', price: 1600 }] }, { name: 'Hot and Sour Shrimp', variants: [{ label: 'Full', price: 1500 }] }, { name: 'Garlic Fish', variants: [{ label: 'Full', price: 1600 }] }, { name: 'Braised Fish in Hot Spices', variants: [{ label: 'Full', price: 1600 }] }, ], }, // ── BEVERAGES ────────────────────────────────────────────── { category: 'Beverages', items: [ { name: 'Coca Cola', variants: [{ label: '250 ml', price: 70 }, { label: 'Half Litre', price: 120 }, { label: '1.5 Litre', price: 180 }] }, { name: 'Mineral Water', variants: [{ label: 'Half Litre', price: 60 }, { label: '1.5 Litre', price: 100 }] }, ], }, // ── DEALS ────────────────────────────────────────────────── { category: 'Deals', items: [ { name: 'Deal 1 — Chicken Manchurian with Rice (Single Person)', variants: [{ label: 'Single Person', price: 600 }] }, { name: 'Deal 2 — Chicken Chow Mein with Black Pepper Chicken (Single Person)', variants: [{ label: 'Single Person', price: 600 }] }, { name: 'Deal 3 — Hot & Sour Soup with One Piece Drum Stick', variants: [{ label: 'Regular', price: 550 }] }, { name: 'Deal 4 — Chicken Manchurian with Rice (Full)', variants: [{ label: 'Full', price: 1400 }] }, { name: 'Deal 5 — Chicken Chow Mein with Black Pepper Chicken (Full)', variants: [{ label: 'Full', price: 1400 }] }, { name: 'Deal 6 — Masala Fried Rice + Chicken Chilly Dry + 2 Fried Wings', variants: [{ label: 'Regular', price: 900 }] }, { name: 'Deal 7 — Egg Fried Rice + Braised Chicken in Hot Spices + Two Fried Wings', variants: [{ label: 'Regular', price: 900 }] }, { name: 'Deal 8 — Chicken Chow Mein + Masala Fried Rice + Chicken Shashlik', variants: [{ label: 'Regular', price: 1700 }] }, { name: 'Deal 9 — Fried Rice + Chicken Chow Mein + Black Pepper Chicken', variants: [{ label: 'Regular', price: 900 }] }, { name: 'Deal 10 — Full Masala Fried Rice + Garlic Fish / Fish Chilly and Ginger', variants: [{ label: 'Regular', price: 1600 }] }, { name: 'Deal 11 — Hot & Spicy Fried Wings (10 Pieces)', variants: [{ label: '10 Pieces', price: 700 }] }, { name: 'Deal 12 — ½ Egg Fried Rice + ½ Chicken Chilly Dry', variants: [{ label: 'Regular', price: 1100 }] }, { name: 'Deal 13 — Chicken Masala Rice + Garlic Chicken + 4 Pieces Wings', variants: [{ label: 'Regular', price: 1300 }] }, { name: 'Deal 14 — Full Hot & Sour Soup + Fish Cracker + 10 Pieces Wings', variants: [{ label: 'Regular', price: 1700 }] }, { name: 'Deal 15 — Full Egg Fried Rice + Full Chicken Chow Mein + Full Chicken Chilly Dry + Full Chicken Manchurian', variants: [{ label: 'Regular', price: 2800 }] }, ], }, ]; // ── Seed logic ─────────────────────────────────────────────── async function seedMenu() { await mongoose.connect(process.env.MONGODB_URI); console.log('✅ Connected to MongoDB Atlas\n'); let created = 0; let skipped = 0; for (const section of MENU_DATA) { // Find the category by name (case-insensitive) const category = await Category.findOne({ name: new RegExp(`^${section.category}$`, 'i') }); if (!category) { console.warn(`⚠️ Category not found: "${section.category}" — run npm run seed first`); continue; } for (const itemData of section.items) { const exists = await MenuItem.findOne({ name: new RegExp(`^${itemData.name}$`, 'i') }); if (exists) { console.log(` ⏭ Already exists: ${itemData.name}`); skipped++; continue; } await MenuItem.create({ name: itemData.name, category: category._id, available: itemData.available !== false, // default true variants: itemData.variants.map((v) => ({ ...v, available: true })), }); console.log(` ✅ ${section.category} → ${itemData.name} (${itemData.variants.map((v) => `${v.label}: Rs.${v.price}`).join(', ')})`); created++; } } console.log(`\n🎉 Menu seed complete! Created: ${created} | Skipped: ${skipped}`); process.exit(0); } seedMenu().catch((err) => { console.error('Menu seed failed:', err); process.exit(1); });