const EventEmitter = require('events');
const SqlLite = require('sqlite3');
const { Sequelize } = require('sequelize');
const Umzug = require('umzug');
const { finished } = require('stream');
class database extends EventEmitter {
constructor() {
super();
this.db = null;
}
/**
* Starts / initializes database connection to core database
* @param {function} callback true or false
*/
startDatabase(callback) {
console.log('MODELS-DATABASE | Starting check for database existence');
this.checkIfCoreDatabaseExists((successDB) => {
if (successDB) {
console.log('MODELS-DATABASE | Starting database migrations');
this.runMigrations((successMigrations) => {
if (successMigrations) {
this.openCoreDatabase((successConnection) => {
if (successConnection) {
console.log('MODELS-DATABASE | Initialization of Core Database: ' + successConnection);
callback(true);
} else {
callback(false);
}
})
} else {
callback(false);
}
})
} else {
callback(false);
}
})
}
/**
* Runs database migration steps
* @param {function} callback true or false
*/
runMigrations(callback) {
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: './store/coredatabase.db',
logging: msg => {
console.log("SEQUELIZE | " + msg);
}
});
const umzug = new Umzug({
migrations: {
path: './migrations',
params: [
sequelize.getQueryInterface()
]
},
storage: 'sequelize',
storageOptions: {
sequelize: sequelize
}
});
(async () => {
// Checks migrations and run them if they are not already applied. To keep
// track of the executed migrations, a table (and sequelize model) called SequelizeMeta
// will be automatically created (if it doesn't exist already) and parsed.
await umzug.up();
// HIER MUSS DER CALLBACK SEIN
callback(true);
})();
}
/**
* Checks if coredatabase exists. if not -> copy template for initial start.
* @param {function} callback success (true or false)
*/
checkIfCoreDatabaseExists(callback) {
const fs = require('fs');
const path = require('path');
try {
var store_folder = path.join(global.appRoot, 'store');
var restore_folder = path.join(store_folder, 'restore');
var templates_folder = path.join(store_folder, 'templates');
var db_filename = 'coredatabase.db';
if(fs.existsSync(restore_folder))
{
console.log("MODELS | DATABASE | restore folder found.");
console.log('MODELS | DATABASE | copy '+ db_filename +' from ' + restore_folder + ' to ' + store_folder +'.');
var src = path.join(restore_folder, db_filename);
var dst = path.join(store_folder, db_filename);
fs.copyFileSync(src, dst);
console.log('MODELS | DATABASE | remove ' + restore_folder + '.');
fs.rmdirSync(restore_folder, { recursive: true });
}
else if (!fs.existsSync(path.join(store_folder, db_filename)))
{
console.log('MODELS | DATABASE | coredatabase does not exist. Copying initial template to store.');
var src = path.join(templates_folder, db_filename);
var dst = path.join(store_folder, db_filename);
fs.copyFileSync(src, dst);
} else
{
console.log("MODELS | DATABASE | coredatabase exists. Ready to open.");
}
/* So funktionierts .... */
callback(true);
// Aber callback wird aufgerufen, bevor dbmigrate durchläuft
} catch (err) {
console.error(err);
callback(false);
}
}
/**
* initializes connection to core database
* @param {function} callback success (true or false)
*/
openCoreDatabase(callback) {
this.db = new SqlLite.Database(global.appRoot + '/store/coredatabase.db', (err) => {
if (err) {
console.log('DATABASEMANAGER | Could not connect to database', err);
callback(false);
} else {
console.log('DATABASEMANAGER | Connected');
callback(true);
}
})
}
}
module.exports = database;