const _ = require('lodash') const fs = require('fs') const path = require('path') const Promise = require('bluebird') const Sequelize = require('sequelize') /* global wiki */ const operatorsAliases = { $eq: Sequelize.Op.eq, $ne: Sequelize.Op.ne, $gte: Sequelize.Op.gte, $gt: Sequelize.Op.gt, $lte: Sequelize.Op.lte, $lt: Sequelize.Op.lt, $not: Sequelize.Op.not, $in: Sequelize.Op.in, $notIn: Sequelize.Op.notIn, $is: Sequelize.Op.is, $like: Sequelize.Op.like, $notLike: Sequelize.Op.notLike, $iLike: Sequelize.Op.iLike, $notILike: Sequelize.Op.notILike, $regexp: Sequelize.Op.regexp, $notRegexp: Sequelize.Op.notRegexp, $iRegexp: Sequelize.Op.iRegexp, $notIRegexp: Sequelize.Op.notIRegexp, $between: Sequelize.Op.between, $notBetween: Sequelize.Op.notBetween, $overlap: Sequelize.Op.overlap, $contains: Sequelize.Op.contains, $contained: Sequelize.Op.contained, $adjacent: Sequelize.Op.adjacent, $strictLeft: Sequelize.Op.strictLeft, $strictRight: Sequelize.Op.strictRight, $noExtendRight: Sequelize.Op.noExtendRight, $noExtendLeft: Sequelize.Op.noExtendLeft, $and: Sequelize.Op.and, $or: Sequelize.Op.or, $any: Sequelize.Op.any, $all: Sequelize.Op.all, $values: Sequelize.Op.values, $col: Sequelize.Op.col } /** * PostgreSQL DB module */ module.exports = { Sequelize, Op: Sequelize.Op, /** * Initialize DB * * @return {Object} DB instance */ init() { let self = this let dbModelsPath = path.join(wiki.SERVERPATH, 'models') // Define Sequelize instance this.inst = new this.Sequelize(wiki.config.db.db, wiki.config.db.user, wiki.config.db.pass, { host: wiki.config.db.host, port: wiki.config.db.port, dialect: 'postgres', pool: { max: 10, min: 0, idle: 10000 }, logging: log => { wiki.logger.log('debug', log) }, operatorsAliases }) // Attempt to connect and authenticate to DB this.inst.authenticate().then(() => { wiki.logger.info('Database (PostgreSQL) connection: [ OK ]') }).catch(err => { wiki.logger.error('Failed to connect to PostgreSQL instance.') wiki.logger.error(err) process.exit(1) }) // Load DB Models fs .readdirSync(dbModelsPath) .filter(file => { return (file.indexOf('.') !== 0 && file.indexOf('_') !== 0) }) .forEach(file => { let modelName = _.upperFirst(_.camelCase(_.split(file, '.')[0])) self[modelName] = self.inst.import(path.join(dbModelsPath, file)) }) // Associate DB Models require(path.join(dbModelsPath, '_relations.js'))(self) // Set init tasks let initTasks = { // -> Sync DB Schemas syncSchemas() { return self.inst.sync({ force: false, logging: log => { wiki.logger.log('debug', log) } }) }, // -> Set Connection App Name setAppName() { return self.inst.query(`set application_name = 'Wiki.js'`, { raw: true }) } } let initTasksQueue = (wiki.IS_MASTER) ? [ initTasks.syncSchemas, initTasks.setAppName ] : [ initTasks.setAppName ] // Perform init tasks this.onReady = Promise.each(initTasksQueue, t => t()).return(true) return this } }