Files
dwroller/scripts/move-staging-to-rules.js

58 lines
2.2 KiB
JavaScript

const Database = require('better-sqlite3');
const db = new Database('database/sqlite/deathwatch.db');
function slug(s){
return (s||'rule').toString().toLowerCase().trim()
.replace(/[^a-z0-9]+/g,'-')
.replace(/(^-|-$)/g,'');
}
try{
const staging = db.prepare('SELECT id,title,content,category,page,original_json,created_at FROM rules_staging ORDER BY id').all();
console.log('stagingCount', staging.length);
if(staging.length===0){ db.close(); process.exit(0); }
const insert = db.prepare('INSERT OR IGNORE INTO rules (rule_id, title, content, page, source, source_abbr, category) VALUES (?, ?, ?, ?, ?, ?, ?)');
const exists = db.prepare('SELECT COUNT(*) as c FROM rules WHERE rule_id = ?');
const inserted = [];
const processedIds = [];
const tx = db.transaction((rows)=>{
for(const r of rows){
const title = r.title || (r.original_json ? (JSON.parse(r.original_json).title || '') : '') || 'rule';
let base = slug(title);
if(!base) base = 'rule';
let candidate = base;
let i = 0;
while(exists.get(candidate).c > 0){ i++; candidate = base + '-' + i; }
const pageVal = (r.page && !isNaN(Number(r.page))) ? Number(r.page) : null;
const res = insert.run(candidate, r.title || title, r.content || '', pageVal, 'sanitized', 'SAN', r.category || 'skills');
if(res.changes && res.lastInsertRowid){
inserted.push({rule_id: candidate, title: r.title || title, page: r.page});
processedIds.push(r.id);
}
}
if(processedIds.length){
const placeholders = processedIds.map(()=>'?').join(',');
db.prepare(`DELETE FROM rules_staging WHERE id IN (${placeholders})`).run(...processedIds);
}
});
tx(staging);
const counts = {
staging: db.prepare('SELECT COUNT(*) as c FROM rules_staging').get().c,
rules_sanitized: db.prepare('SELECT COUNT(*) as c FROM rules WHERE source = ?').get('sanitized').c,
rules_total: db.prepare('SELECT COUNT(*) as c FROM rules').get().c
};
console.log(JSON.stringify({inserted, count: inserted.length, counts}, null, 2));
}catch(err){
console.error('ERROR', err && err.stack ? err.stack : err);
process.exit(1);
}finally{
try{ db.close(); }catch(e){}
}