Files
dwroller/scripts/import-midgame-rules-to-db.js
Alex 7873f450da feat: rules midgame priority system, mission enhancements, and requisition shop improvements
- Add midgame priority ranking for rules (midgamePriority field)
- Enhance rules search to support midgame filtering and sorting
- Improve mission simulation and midgame tracking
- Fix RequisitionShop player name handling
- Add rules midplay simulation tests
- Update MissionTab with midgame scene tracking
- Add backend logging for rules updates
2026-06-24 12:09:25 +02:00

102 lines
3.4 KiB
JavaScript

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const mysql = require('mysql2/promise');
const repoRoot = path.resolve(__dirname, '..');
const rulesPath = path.join(repoRoot, 'database', 'rules', 'rules-database.json');
const dbConfig = {
host: process.env.DB_HOST || '192.168.1.113',
user: process.env.DB_USER || 'deathwatch',
password: process.env.DB_PASSWORD || 'defaultpassword',
database: process.env.DB_NAME || 'deathwatch',
port: Number(process.env.DB_PORT || 3307)
};
const addColumnIfMissing = async (connection, table, definition) => {
try {
await connection.execute(`ALTER TABLE ${table} ADD COLUMN ${definition}`);
} catch (error) {
if (error.code !== 'ER_DUP_FIELDNAME') throw error;
}
};
const main = async () => {
const data = JSON.parse(fs.readFileSync(rulesPath, 'utf8'));
const rules = data.rules || [];
if (!rules.length) throw new Error(`No rules found in ${rulesPath}`);
const connection = await mysql.createConnection(dbConfig);
await addColumnIfMissing(connection, 'rules', 'summary TEXT');
await addColumnIfMissing(connection, 'rules', 'page_end INT');
await addColumnIfMissing(connection, 'rules', 'tags TEXT');
await addColumnIfMissing(connection, 'rules', 'aliases TEXT');
await addColumnIfMissing(connection, 'rules', 'related_rules TEXT');
await addColumnIfMissing(connection, 'rules', 'source_method VARCHAR(50)');
await addColumnIfMissing(connection, 'rules', 'confidence DECIMAL(4,2)');
await addColumnIfMissing(connection, 'rules', 'midgame_priority INT DEFAULT 0');
const [before] = await connection.execute('SELECT COUNT(*) AS cnt FROM rules');
let upserted = 0;
for (const rule of rules) {
await connection.execute(
`INSERT INTO rules
(rule_id, title, content, summary, page, page_end, source, source_abbr, category,
tags, aliases, related_rules, source_method, confidence, midgame_priority)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
title=VALUES(title),
content=VALUES(content),
summary=VALUES(summary),
page=VALUES(page),
page_end=VALUES(page_end),
source=VALUES(source),
source_abbr=VALUES(source_abbr),
category=VALUES(category),
tags=VALUES(tags),
aliases=VALUES(aliases),
related_rules=VALUES(related_rules),
source_method=VALUES(source_method),
confidence=VALUES(confidence),
midgame_priority=VALUES(midgame_priority)`,
[
rule.rule_id || rule.id,
rule.title || '',
rule.content || '',
rule.summary || '',
rule.page || null,
rule.pageEnd || null,
rule.source || null,
rule.sourceAbbr || null,
rule.category || null,
JSON.stringify(rule.tags || []),
JSON.stringify(rule.aliases || []),
JSON.stringify(rule.relatedRules || []),
rule.sourceMethod || null,
rule.confidence == null ? null : Number(rule.confidence),
rule.midgamePriority || 0
]
);
upserted += 1;
}
const [after] = await connection.execute('SELECT COUNT(*) AS cnt FROM rules');
await connection.end();
console.log(JSON.stringify({
rulesFile: path.relative(repoRoot, rulesPath),
upserted,
before: before[0].cnt,
after: after[0].cnt
}, null, 2));
};
main().catch(error => {
console.error(error.message);
process.exit(1);
});