From cdcaef11c1f0b209367dab558b02c229ff3d6f6f Mon Sep 17 00:00:00 2001 From: Robbie Antenesse Date: Sun, 8 Dec 2019 00:06:21 -0700 Subject: [PATCH] Add framework for database setup and migration --- .gitignore | 3 +- package.json | 1 + server/sequelize/migration.js | 16 +++++++ .../sequelize/setup-database.js | 43 ++++++++++++++++--- 4 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 server/sequelize/migration.js rename setup-database.js => server/sequelize/setup-database.js (51%) diff --git a/.gitignore b/.gitignore index 0e2c144..05b46a0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ dev/ **/*.log config.json *.sqlite* -*.db \ No newline at end of file +*.db +.dbversion \ No newline at end of file diff --git a/package.json b/package.json index dd7bb1d..b542857 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "build": "npm run process-images && npm run bundle", "bundle": "parcel build app/index.html --out-dir public --no-source-maps --no-cache", "process-images": "node ./process-images.js", + "setup-db": "node ./server/sequelize/setup-database.js", "clear": "rimraf public/{*,.*}" }, "devDependencies": { diff --git a/server/sequelize/migration.js b/server/sequelize/migration.js new file mode 100644 index 0000000..0f08b6c --- /dev/null +++ b/server/sequelize/migration.js @@ -0,0 +1,16 @@ +const path = require('path'); +const fs = require('fs'); + +const dbVersion = '0.0.0'; + +function migrateDb(oldVersion, sequelize) { + // if (oldVersion < targetVersion) { + // migrate db here + // } + return sequelize; +} + +module.exports = { + dbVersion, + migrateDb, +}; \ No newline at end of file diff --git a/setup-database.js b/server/sequelize/setup-database.js similarity index 51% rename from setup-database.js rename to server/sequelize/setup-database.js index 40ee53d..dc0ff61 100644 --- a/setup-database.js +++ b/server/sequelize/setup-database.js @@ -1,12 +1,13 @@ // Eventually, I'd like this to be run through Commander so it can confirm things before just overwriting stuff. const path = require('path'); -const Sequelize = require('sequelize'); -const getModels = require('./server/sequelize/getModels'); +const fs = require('fs'); const force = typeof process.argv[2] !== 'undefined' && process.argv[2] === 'force'; + +const Sequelize = require('sequelize'); let siteConfig; try { - siteConfig = require('./server/config.json'); + siteConfig = require('../config.json'); } catch (ex) { console.error('Please copy `config.example.json` to `config.json` and fill it with your server\'s data.'); process.exit(1); @@ -37,9 +38,34 @@ switch (siteConfig.db_engine) { const sequelize = new Sequelize(sequelizeConfig); -const Models = getModels(sequelize); +const migration = require('./migration'); +const dbVersionPath = path.resolve(__dirname, './.dbversion'); +if (!force) { + if (fs.existsSync(dbVersionPath)) { + const installedDbVersion = fs.readFileSync(dbVersionPath); + if (installedDbVersion < migration.dbVersion) { + console.log(`Migrating from ${installedDbVersion} to ${migration.dbVersion}...`); + migration.migrateDb(installedDbVersion, sequelize); + return fs.writeFile(dbVersionPath, migration.dbVersion, err => { + if (err) { + console.error(err); + } + console.log('Migration complete!'); + }); + } + if (installedDbVersion == migration.dbVersion) { + return console.log(`No database setup needed: installed version ${installedDbVersion} is the current version.`); + } + console.log(`Skipping database migration: installed version ${installedDbVersion} is not less than current version ${migration.dbVersion}.`); + return console.log('Please check your installation and make sure you have the right server files downloaded.'); + } +} +const Models = require('./getModels')(sequelize); + +console.log(`Installing database tables${force ? ', dropping existing ones first' : ''}...`); sequelize.sync({ force }).then(() => { + console.log('Tables installed! Adding Status Types...') const promises = [ // Default status types to use in Statuses { name: 'update' }, { name: 'progress' }, @@ -49,4 +75,11 @@ sequelize.sync({ force }).then(() => { return Promise.all(promises); }).then(() => { sequelize.close(); -}); \ No newline at end of file + console.log(`Status Types installed! Writing database version to ${dbVersionPath}...`); + fs.writeFile(dbVersionPath, migration.dbVersion, err => { + if (err) { + console.error(err); + } + console.log('Done!'); + }); +});