55 lines
1.3 KiB
JavaScript
55 lines
1.3 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs');
|
|
const { getDb } = require('../src/db');
|
|
|
|
const migrationsDir = path.resolve(__dirname, '..', 'src', 'db', 'migrations');
|
|
|
|
function runMigrations() {
|
|
const db = getDb();
|
|
|
|
// Create _migrations table if it doesn't exist
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE,
|
|
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
)
|
|
`);
|
|
|
|
// Get already-applied migrations
|
|
const applied = new Set(
|
|
db.prepare('SELECT name FROM _migrations').pluck().all()
|
|
);
|
|
|
|
// Find migration files
|
|
const files = fs.readdirSync(migrationsDir)
|
|
.filter(f => f.endsWith('.sql'))
|
|
.sort();
|
|
|
|
for (const file of files) {
|
|
if (applied.has(file)) {
|
|
console.log(` SKIP ${file} (already applied)`);
|
|
continue;
|
|
}
|
|
|
|
const sql = fs.readFileSync(path.join(migrationsDir, file), 'utf-8');
|
|
console.log(` APPLY ${file}`);
|
|
|
|
// Wrap in a transaction
|
|
db.transaction(() => {
|
|
db.exec(sql);
|
|
db.prepare('INSERT INTO _migrations (name) VALUES (?)').run(file);
|
|
})();
|
|
}
|
|
|
|
console.log('Migrations complete.');
|
|
}
|
|
|
|
// Run if called directly
|
|
if (require.main === module) {
|
|
runMigrations();
|
|
process.exit(0);
|
|
}
|
|
|
|
module.exports = { runMigrations };
|