db.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. const _ = require('lodash')
  2. const fs = require('fs')
  3. const path = require('path')
  4. const Promise = require('bluebird')
  5. const Sequelize = require('sequelize')
  6. /* global WIKI */
  7. const operatorsAliases = {
  8. $eq: Sequelize.Op.eq,
  9. $ne: Sequelize.Op.ne,
  10. $gte: Sequelize.Op.gte,
  11. $gt: Sequelize.Op.gt,
  12. $lte: Sequelize.Op.lte,
  13. $lt: Sequelize.Op.lt,
  14. $not: Sequelize.Op.not,
  15. $in: Sequelize.Op.in,
  16. $notIn: Sequelize.Op.notIn,
  17. $is: Sequelize.Op.is,
  18. $like: Sequelize.Op.like,
  19. $notLike: Sequelize.Op.notLike,
  20. $iLike: Sequelize.Op.iLike,
  21. $notILike: Sequelize.Op.notILike,
  22. $regexp: Sequelize.Op.regexp,
  23. $notRegexp: Sequelize.Op.notRegexp,
  24. $iRegexp: Sequelize.Op.iRegexp,
  25. $notIRegexp: Sequelize.Op.notIRegexp,
  26. $between: Sequelize.Op.between,
  27. $notBetween: Sequelize.Op.notBetween,
  28. $overlap: Sequelize.Op.overlap,
  29. $contains: Sequelize.Op.contains,
  30. $contained: Sequelize.Op.contained,
  31. $adjacent: Sequelize.Op.adjacent,
  32. $strictLeft: Sequelize.Op.strictLeft,
  33. $strictRight: Sequelize.Op.strictRight,
  34. $noExtendRight: Sequelize.Op.noExtendRight,
  35. $noExtendLeft: Sequelize.Op.noExtendLeft,
  36. $and: Sequelize.Op.and,
  37. $or: Sequelize.Op.or,
  38. $any: Sequelize.Op.any,
  39. $all: Sequelize.Op.all,
  40. $values: Sequelize.Op.values,
  41. $col: Sequelize.Op.col
  42. }
  43. /**
  44. * PostgreSQL DB module
  45. */
  46. module.exports = {
  47. Sequelize,
  48. Op: Sequelize.Op,
  49. /**
  50. * Initialize DB
  51. *
  52. * @return {Object} DB instance
  53. */
  54. init() {
  55. let self = this
  56. let dbModelsPath = path.join(WIKI.SERVERPATH, 'models')
  57. // Define Sequelize instance
  58. this.inst = new this.Sequelize(WIKI.config.db.db, WIKI.config.db.user, WIKI.config.db.pass, {
  59. host: WIKI.config.db.host,
  60. port: WIKI.config.db.port,
  61. dialect: WIKI.config.db.type,
  62. storage: WIKI.config.db.storage,
  63. pool: {
  64. max: 10,
  65. min: 0,
  66. idle: 10000
  67. },
  68. logging: log => { WIKI.logger.log('debug', log) },
  69. operatorsAliases
  70. })
  71. // Attempt to connect and authenticate to DB
  72. this.inst.authenticate().then(() => {
  73. WIKI.logger.info(`Database (${WIKI.config.db.type}) connection: [ OK ]`)
  74. }).catch(err => {
  75. WIKI.logger.error(`Failed to connect to ${WIKI.config.db.type} instance.`)
  76. WIKI.logger.error(err)
  77. process.exit(1)
  78. })
  79. // Load DB Models
  80. fs
  81. .readdirSync(dbModelsPath)
  82. .filter(file => {
  83. return (file.indexOf('.') !== 0 && file.indexOf('_') !== 0)
  84. })
  85. .forEach(file => {
  86. let modelName = _.upperFirst(_.camelCase(_.split(file, '.')[0]))
  87. self[modelName] = self.inst.import(path.join(dbModelsPath, file))
  88. })
  89. // Associate DB Models
  90. require(path.join(dbModelsPath, '_relations.js'))(self)
  91. // Set init tasks
  92. let initTasks = {
  93. // -> Sync DB Schemas
  94. syncSchemas() {
  95. return self.inst.sync({
  96. force: false,
  97. logging: log => { WIKI.logger.log('debug', log) }
  98. })
  99. },
  100. // -> Set Connection App Name
  101. setAppName() {
  102. switch (WIKI.config.db.type) {
  103. case 'postgres':
  104. return self.inst.query(`set application_name = 'WIKI.js'`, { raw: true })
  105. }
  106. }
  107. }
  108. let initTasksQueue = (WIKI.IS_MASTER) ? [
  109. initTasks.syncSchemas,
  110. initTasks.setAppName
  111. ] : [
  112. initTasks.setAppName
  113. ]
  114. // Perform init tasks
  115. this.onReady = Promise.each(initTasksQueue, t => t()).return(true)
  116. return this
  117. }
  118. }