Mailspring/packages/nylas-core/database-connector.js

92 lines
2.4 KiB
JavaScript
Raw Normal View History

2016-06-19 18:02:32 +08:00
const Sequelize = require('sequelize');
const fs = require('fs');
const path = require('path');
2016-06-24 07:28:51 +08:00
const HookTransactionLog = require('./hook-transaction-log');
const HookAccountCRUD = require('./hook-account-crud');
2016-06-19 18:02:32 +08:00
require('./database-extensions'); // Extends Sequelize on require
const STORAGE_DIR = path.join(__dirname, '..', '..', 'storage');
2016-06-19 18:02:32 +08:00
if (!fs.existsSync(STORAGE_DIR)) {
fs.mkdirSync(STORAGE_DIR);
}
class DatabaseConnector {
2016-06-19 18:02:32 +08:00
constructor() {
this._pools = {};
}
_readModelsInDirectory(sequelize, dirname) {
const db = {};
for (const filename of fs.readdirSync(dirname)) {
if (filename.endsWith('.js')) {
const model = sequelize.import(path.join(dirname, filename));
db[model.name] = model;
}
}
Object.keys(db).forEach((modelName) => {
if ("associate" in db[modelName]) {
db[modelName].associate(db);
}
});
return db;
}
_sequelizeForAccount(accountId) {
if (!accountId) {
2016-06-28 01:27:38 +08:00
return Promise.reject(new Error(`You need to pass an accountId to init the database!`))
}
2016-06-19 18:02:32 +08:00
const sequelize = new Sequelize(accountId, '', '', {
storage: path.join(STORAGE_DIR, `a-${accountId}.sqlite`),
dialect: "sqlite",
logging: false,
2016-06-19 18:02:32 +08:00
});
const modelsPath = path.join(__dirname, 'models/account');
const db = this._readModelsInDirectory(sequelize, modelsPath)
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.accountId = accountId;
2016-06-19 18:02:32 +08:00
2016-06-24 07:28:51 +08:00
HookTransactionLog(db, sequelize);
2016-06-19 18:02:32 +08:00
return sequelize.authenticate().then(() =>
sequelize.sync()
).thenReturn(db);
}
forAccount(accountId) {
this._pools[accountId] = this._pools[accountId] || this._sequelizeForAccount(accountId);
return this._pools[accountId];
}
_sequelizeForShared() {
const sequelize = new Sequelize('shared', '', '', {
storage: path.join(STORAGE_DIR, 'shared.sqlite'),
dialect: "sqlite",
logging: false,
2016-06-19 18:02:32 +08:00
});
const modelsPath = path.join(__dirname, 'models/shared');
const db = this._readModelsInDirectory(sequelize, modelsPath)
db.sequelize = sequelize;
db.Sequelize = Sequelize;
2016-06-24 07:28:51 +08:00
HookAccountCRUD(db, sequelize);
2016-06-19 18:02:32 +08:00
return sequelize.authenticate().then(() =>
sequelize.sync()
).thenReturn(db);
}
forShared() {
this._pools.shared = this._pools.shared || this._sequelizeForShared();
return this._pools.shared;
}
}
module.exports = new DatabaseConnector()