require('dotenv').config() const settingsDb = require('../src/model/settings/settings.db') const wikiDb = require('../src/model/wiki/wiki.db') const users = require('../src/model/users/users.model') const { ensureSchema, close } = require('../src/utils/db') const brand = require('../src/config/brand') const log = require('../src/utils/logger')('seed') // Default settings — only inserted if the key does not already exist. const DEFAULT_SETTINGS = { site_mode: 'maintenance', // start safe: site is in maintenance until set live site_mode_changed_at: '', site_mode_changed_by: '', maintenance_message: `${brand.shortName} is being shaped beneath a midnight sky. The site will return soon.`, status_message: 'In progress.', homepage_teaser: `${brand.shortName} is still being shaped beneath a midnight sky. A quiet preview for ` + 'future news, screenshots, guides, and community notes as the world comes online.', contact_email: brand.contactEmail, site_title: brand.name, } // Starter wiki sections (editable later via the admin panel). // [slug, title, description, sort_order] const WIKI_CATEGORIES = [ ['guides', 'Guides', 'Getting started and how-to guides.', 10], ['world', 'World & Lore', `Regions, maps, and the story of ${brand.shortName}.`, 20], ['gameplay', 'Systems & Gameplay', 'Mechanics, items, monsters, and crafting.', 30], ['community', 'Community & Rules', 'Player conduct and shard policies.', 40], ] // The 8 starter pages, each mapped to a section. [slug, title, body, categorySlug] const WIKI_PAGES = [ ['new-player-guide', 'New Player Guide', 'First steps, basic survival, and early goals.', 'guides'], ['maps-atlas', 'Maps & Atlas', 'Regions, towns, routes, and travel notes.', 'world'], ['lore', 'Lore', 'Stories, places, factions, and mysteries.', 'world'], ['systems', 'Server Systems', 'Shard mechanics and custom features.', 'gameplay'], ['items', 'Items & Rewards', 'Equipment, treasures, rewards, and curiosities.', 'gameplay'], ['monsters', 'Monsters & Encounters', 'Creatures, bosses, spawns, and dangers.', 'gameplay'], ['crafting', 'Crafting', 'Professions, materials, recipes, and tools.', 'gameplay'], ['rules', 'Rules', 'Player conduct, shard expectations, and policies.', 'community'], ] async function seedDefaults() { for (const [key, value] of Object.entries(DEFAULT_SETTINGS)) { await settingsDb.seedDefault(key, value) } for (const [slug, title, description, sortOrder] of WIKI_CATEGORIES) { await wikiDb.seedDefaultCategory(slug, title, description, sortOrder) } for (const [slug, title, body, categorySlug] of WIKI_PAGES) { await wikiDb.seedDefault(slug, title, body) // Attach to its section (only if not already categorized — safe re-run / // migration of pages seeded before the wiki upgrade). await wikiDb.assignCategoryBySlug(slug, categorySlug) } log.info('settings and wiki defaults ensured') } // Create the first admin from env vars, only when no users exist yet. async function createInitialAdminFromEnv() { const { ADMIN_USERNAME, ADMIN_PASSWORD } = process.env if (!ADMIN_USERNAME || !ADMIN_PASSWORD) return if ((await users.count()) > 0) return await users.createUser({ username: ADMIN_USERNAME, password: ADMIN_PASSWORD, role: 'admin' }) log.info(`created initial admin "${ADMIN_USERNAME}"`) } // Allow running standalone: `npm run seed` if (require.main === module) { ;(async () => { try { await ensureSchema() await seedDefaults() await createInitialAdminFromEnv() } catch (err) { log.error('seed failed', err) process.exitCode = 1 } finally { await close() } })() } module.exports = { seedDefaults, createInitialAdminFromEnv }