forest-cli
Version:
The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.
143 lines • 11.9 kB
JavaScript
class Database {
constructor({ assertPresent, mongodb, Sequelize, terminator }) {
assertPresent({
mongodb,
Sequelize,
terminator,
});
this.mongodb = mongodb;
this.Sequelize = Sequelize;
this.terminator = terminator;
}
async handleAuthenticationError(error) {
return this.terminator.terminate(1, {
logs: ['Cannot connect to the database due to the following error:', error],
errorCode: 'database_authentication_error',
errorMessage: error.message,
});
}
sequelizeAuthenticate(connection) {
return connection
.authenticate()
.then(() => connection)
.catch(error => this.handleAuthenticationError(error));
}
// eslint-disable-next-line class-methods-use-this
getDialect(dbConnectionUrl, dbDialect) {
if (dbConnectionUrl) {
if (dbConnectionUrl.startsWith('postgres')) {
return 'postgres';
}
if (dbConnectionUrl.startsWith('mysql://')) {
return 'mysql';
}
if (dbConnectionUrl.startsWith('mssql://')) {
return 'mssql';
}
// NOTICE: For MongoDB can be "mongodb://" or "mongodb+srv://"
if (dbConnectionUrl.startsWith('mongodb')) {
return 'mongodb';
}
}
return dbDialect;
}
connectToMongodb(options, isSSL) {
let connectionOptionsMongoClient = options.connectionOptions;
if (!connectionOptionsMongoClient) {
connectionOptionsMongoClient = {
useNewUrlParser: true,
useUnifiedTopology: true,
};
if (isSSL) {
connectionOptionsMongoClient.ssl = true;
}
}
let connectionUrl = options.dbConnectionUrl;
if (!connectionUrl) {
connectionUrl = 'mongodb';
if (options.mongodbSrv) {
connectionUrl += '+srv';
}
connectionUrl += '://';
if (options.dbUser) {
connectionUrl += options.dbUser;
}
if (options.dbPassword) {
connectionUrl += `:${options.dbPassword}`;
}
if (options.dbUser || options.dbPassword) {
connectionUrl += '@';
}
connectionUrl += options.dbHostname;
if (!options.mongodbSrv) {
connectionUrl += `:${options.dbPort}`;
}
connectionUrl += `/${options.dbName}`;
}
return this.mongodb.MongoClient.connect(connectionUrl, connectionOptionsMongoClient).catch(error => this.handleAuthenticationError(error));
}
connectToSequelize(databaseDialect, options, isSSL) {
let connectionOptionsSequelize = options.connectionOptions;
if (!connectionOptionsSequelize) {
connectionOptionsSequelize = {};
if (databaseDialect === 'mssql') {
connectionOptionsSequelize.dialectOptions = { options: { encrypt: isSSL } };
}
else if (isSSL) {
// Add SSL options only if the user selected SSL mode.
// SSL Cerificate is always trusted during `forest projects:create` command
// to ease their onboarding.
connectionOptionsSequelize.dialectOptions = { ssl: { rejectUnauthorized: false } };
}
}
connectionOptionsSequelize.logging = false;
let connection;
if (options.dbConnectionUrl) {
connection = new this.Sequelize(options.dbConnectionUrl, connectionOptionsSequelize);
}
else {
connectionOptionsSequelize.host = options.dbHostname;
connectionOptionsSequelize.port = options.dbPort;
connectionOptionsSequelize.dialect = databaseDialect;
connection = new this.Sequelize(options.dbName, options.dbUser, options.dbPassword, connectionOptionsSequelize);
}
return this.sequelizeAuthenticate(connection);
}
async connect(options) {
const isSSL = options.dbSSL || options.dbSsl;
const databaseDialect = this.getDialect(options.dbConnectionUrl, options.dbDialect);
if (databaseDialect === 'mongodb') {
return this.connectToMongodb(options, isSSL);
}
return this.connectToSequelize(databaseDialect, options, isSSL);
}
connectFromDatabasesConfig(databasesConfig) {
return Promise.all(databasesConfig.map(async (databaseConfig) => {
const connectionOptions = { ...databaseConfig.connection.options };
const connectionInstance = await this.connect({
dbConnectionUrl: databaseConfig.connection.url,
connectionOptions,
});
return {
...databaseConfig,
connectionInstance,
};
}));
}
// eslint-disable-next-line class-methods-use-this
disconnectFromDatabases(databaseConnections) {
return Promise.all(databaseConnections.map(connection => this.disconnect(connection.connectionInstance)));
}
// eslint-disable-next-line class-methods-use-this
async disconnect(connection) {
return connection.close();
}
areAllDatabasesOfTheSameType(databasesConfig) {
const databasesDialect = databasesConfig.map(databaseConfig => this.getDialect(databaseConfig.connection.url));
const hasMongoDb = databasesDialect.some(dialect => dialect === 'mongodb');
const hasAnotherDbType = databasesDialect.some(dialect => dialect !== 'mongodb');
return !(hasMongoDb && hasAnotherDbType);
}
}
module.exports = Database;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvc2NoZW1hL3VwZGF0ZS9kYXRhYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFFBQVE7SUFDWixZQUFZLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFO1FBQzNELGFBQWEsQ0FBQztZQUNaLE9BQU87WUFDUCxTQUFTO1lBQ1QsVUFBVTtTQUNYLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQUMsS0FBSztRQUNuQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUNsQyxJQUFJLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLENBQUM7WUFDM0UsU0FBUyxFQUFFLCtCQUErQjtZQUMxQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQixDQUFDLFVBQVU7UUFDOUIsT0FBTyxVQUFVO2FBQ2QsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQzthQUN0QixLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELFVBQVUsQ0FBQyxlQUFlLEVBQUUsU0FBUztRQUNuQyxJQUFJLGVBQWUsRUFBRTtZQUNuQixJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQzFDLE9BQU8sVUFB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