55 Zeilen
1.4 KiB
JavaScript
55 Zeilen
1.4 KiB
JavaScript
const fs = require('fs')
|
|
const path = require('path')
|
|
const Database = require('better-sqlite3')
|
|
|
|
const dbPath = process.env.DATABASE_PATH || path.join(process.cwd(), 'skillmate.dev.encrypted.db')
|
|
const db = new Database(dbPath)
|
|
|
|
function ensureSchemaTable() {
|
|
db.exec(`CREATE TABLE IF NOT EXISTS schema_version (id TEXT PRIMARY KEY, applied_at TEXT NOT NULL)`)
|
|
}
|
|
|
|
function getApplied() {
|
|
try {
|
|
const rows = db.prepare('SELECT id FROM schema_version').all()
|
|
return new Set(rows.map(r => r.id))
|
|
} catch {
|
|
return new Set()
|
|
}
|
|
}
|
|
|
|
function applyMigration(file) {
|
|
const migration = require(file)
|
|
const id = path.basename(file)
|
|
const tx = db.transaction(() => {
|
|
migration.up(db)
|
|
db.prepare('INSERT INTO schema_version (id, applied_at) VALUES (?, ?)').run(id, new Date().toISOString())
|
|
})
|
|
tx()
|
|
console.log('Applied migration:', id)
|
|
}
|
|
|
|
function main() {
|
|
ensureSchemaTable()
|
|
const applied = getApplied()
|
|
const dir = path.join(__dirname, 'migrations')
|
|
if (!fs.existsSync(dir)) {
|
|
console.log('No migrations directory found, skipping.')
|
|
process.exit(0)
|
|
}
|
|
const files = fs.readdirSync(dir)
|
|
.filter(f => f.endsWith('.js'))
|
|
.sort()
|
|
.map(f => path.join(dir, f))
|
|
for (const file of files) {
|
|
const id = path.basename(file)
|
|
if (!applied.has(id)) {
|
|
applyMigration(file)
|
|
}
|
|
}
|
|
console.log('Migrations complete.')
|
|
}
|
|
|
|
main()
|
|
|