feat: queue handling
This commit is contained in:
@@ -4,87 +4,89 @@
|
||||
|
||||
const _ = require('lodash')
|
||||
|
||||
module.exports = (passport) => {
|
||||
module.exports = {
|
||||
init(passport) {
|
||||
// Serialization user methods
|
||||
|
||||
passport.serializeUser(function (user, done) {
|
||||
done(null, user._id)
|
||||
})
|
||||
|
||||
passport.deserializeUser(function (id, done) {
|
||||
wiki.db.User.findById(id).then((user) => {
|
||||
if (user) {
|
||||
done(null, user)
|
||||
} else {
|
||||
done(new Error(wiki.lang.t('auth:errors:usernotfound')), null)
|
||||
}
|
||||
return true
|
||||
}).catch((err) => {
|
||||
done(err, null)
|
||||
passport.serializeUser(function (user, done) {
|
||||
done(null, user._id)
|
||||
})
|
||||
})
|
||||
|
||||
// Load authentication strategies
|
||||
|
||||
wiki.config.authStrategies = {
|
||||
list: _.pickBy(wiki.config.auth, strategy => strategy.enabled),
|
||||
socialEnabled: (_.chain(wiki.config.auth).omit('local').filter(['enabled', true]).value().length > 0)
|
||||
}
|
||||
|
||||
_.forOwn(wiki.config.authStrategies.list, (strategyConfig, strategyName) => {
|
||||
strategyConfig.callbackURL = `${wiki.config.site.host}/login/${strategyName}/callback`
|
||||
require(`../authentication/${strategyName}`)(passport, strategyConfig)
|
||||
wiki.logger.info(`Authentication Provider ${_.upperFirst(strategyName)}: OK`)
|
||||
})
|
||||
|
||||
// Create Guest account for first-time
|
||||
|
||||
return wiki.db.User.findOne({
|
||||
where: {
|
||||
provider: 'local',
|
||||
email: 'guest@example.com'
|
||||
}
|
||||
}).then((c) => {
|
||||
if (c < 1) {
|
||||
return wiki.db.User.create({
|
||||
provider: 'local',
|
||||
email: 'guest@example.com',
|
||||
name: 'Guest',
|
||||
password: '',
|
||||
role: 'guest'
|
||||
}).then(() => {
|
||||
wiki.logger.info('[AUTH] Guest account created successfully!')
|
||||
passport.deserializeUser(function (id, done) {
|
||||
wiki.db.User.findById(id).then((user) => {
|
||||
if (user) {
|
||||
done(null, user)
|
||||
} else {
|
||||
done(new Error(wiki.lang.t('auth:errors:usernotfound')), null)
|
||||
}
|
||||
return true
|
||||
}).catch((err) => {
|
||||
wiki.logger.error('[AUTH] An error occured while creating guest account:')
|
||||
wiki.logger.error(err)
|
||||
return err
|
||||
done(err, null)
|
||||
})
|
||||
})
|
||||
|
||||
// Load authentication strategies
|
||||
|
||||
wiki.config.authStrategies = {
|
||||
list: _.pickBy(wiki.config.auth, strategy => strategy.enabled),
|
||||
socialEnabled: (_.chain(wiki.config.auth).omit('local').filter(['enabled', true]).value().length > 0)
|
||||
}
|
||||
})
|
||||
|
||||
// .then(() => {
|
||||
// if (process.env.WIKI_JS_HEROKU) {
|
||||
// return wiki.db.User.findOne({ provider: 'local', email: process.env.WIKI_ADMIN_EMAIL }).then((c) => {
|
||||
// if (c < 1) {
|
||||
// // Create root admin account (HEROKU ONLY)
|
||||
_.forOwn(wiki.config.authStrategies.list, (strategyConfig, strategyName) => {
|
||||
strategyConfig.callbackURL = `${wiki.config.site.host}/login/${strategyName}/callback`
|
||||
require(`../authentication/${strategyName}`)(passport, strategyConfig)
|
||||
wiki.logger.info(`Authentication Provider ${_.upperFirst(strategyName)}: OK`)
|
||||
})
|
||||
|
||||
// return wiki.db.User.create({
|
||||
// provider: 'local',
|
||||
// email: process.env.WIKI_ADMIN_EMAIL,
|
||||
// name: 'Administrator',
|
||||
// password: '$2a$04$MAHRw785Xe/Jd5kcKzr3D.VRZDeomFZu2lius4gGpZZ9cJw7B7Mna', // admin123 (default)
|
||||
// role: 'admin'
|
||||
// }).then(() => {
|
||||
// wiki.logger.info('[AUTH] Root admin account created successfully!')
|
||||
// return true
|
||||
// }).catch((err) => {
|
||||
// wiki.logger.error('[AUTH] An error occured while creating root admin account:')
|
||||
// wiki.logger.error(err)
|
||||
// return err
|
||||
// })
|
||||
// } else { return true }
|
||||
// })
|
||||
// } else { return true }
|
||||
// })
|
||||
// Create Guest account for first-time
|
||||
|
||||
return wiki.db.User.findOne({
|
||||
where: {
|
||||
provider: 'local',
|
||||
email: 'guest@example.com'
|
||||
}
|
||||
}).then((c) => {
|
||||
if (c < 1) {
|
||||
return wiki.db.User.create({
|
||||
provider: 'local',
|
||||
email: 'guest@example.com',
|
||||
name: 'Guest',
|
||||
password: '',
|
||||
role: 'guest'
|
||||
}).then(() => {
|
||||
wiki.logger.info('[AUTH] Guest account created successfully!')
|
||||
return true
|
||||
}).catch((err) => {
|
||||
wiki.logger.error('[AUTH] An error occured while creating guest account:')
|
||||
wiki.logger.error(err)
|
||||
return err
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// .then(() => {
|
||||
// if (process.env.WIKI_JS_HEROKU) {
|
||||
// return wiki.db.User.findOne({ provider: 'local', email: process.env.WIKI_ADMIN_EMAIL }).then((c) => {
|
||||
// if (c < 1) {
|
||||
// // Create root admin account (HEROKU ONLY)
|
||||
|
||||
// return wiki.db.User.create({
|
||||
// provider: 'local',
|
||||
// email: process.env.WIKI_ADMIN_EMAIL,
|
||||
// name: 'Administrator',
|
||||
// password: '$2a$04$MAHRw785Xe/Jd5kcKzr3D.VRZDeomFZu2lius4gGpZZ9cJw7B7Mna', // admin123 (default)
|
||||
// role: 'admin'
|
||||
// }).then(() => {
|
||||
// wiki.logger.info('[AUTH] Root admin account created successfully!')
|
||||
// return true
|
||||
// }).catch((err) => {
|
||||
// wiki.logger.error('[AUTH] An error occured while creating root admin account:')
|
||||
// wiki.logger.error(err)
|
||||
// return err
|
||||
// })
|
||||
// } else { return true }
|
||||
// })
|
||||
// } else { return true }
|
||||
// })
|
||||
}
|
||||
}
|
||||
|
@@ -13,9 +13,6 @@ module.exports = {
|
||||
|
||||
/**
|
||||
* Load root config from disk
|
||||
*
|
||||
* @param {any} confPaths
|
||||
* @returns
|
||||
*/
|
||||
init() {
|
||||
let confPaths = {
|
||||
|
@@ -63,12 +63,32 @@ module.exports = {
|
||||
|
||||
require(path.join(dbModelsPath, '_relations.js'))(self)
|
||||
|
||||
// Sync DB
|
||||
// Set init tasks
|
||||
|
||||
self.onReady = (wiki.IS_MASTER) ? self.inst.sync({
|
||||
force: false,
|
||||
logging: false
|
||||
}) : Promise.resolve()
|
||||
let initTasks = {
|
||||
// -> Sync DB Schemas
|
||||
syncSchemas() {
|
||||
return self.inst.sync({
|
||||
force: false,
|
||||
logging: false
|
||||
})
|
||||
},
|
||||
// -> 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
|
||||
|
||||
self.onReady = Promise.each(initTasksQueue, t => t())
|
||||
|
||||
return self
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@ const _ = require('lodash')
|
||||
const entryHelper = require('../helpers/entry')
|
||||
|
||||
/**
|
||||
* Entries Model
|
||||
* Documents Model
|
||||
*/
|
||||
module.exports = {
|
||||
|
37
server/modules/queue.js
Normal file
37
server/modules/queue.js
Normal file
@@ -0,0 +1,37 @@
|
||||
'use strict'
|
||||
|
||||
/* global wiki */
|
||||
|
||||
const Bull = require('bull')
|
||||
const Promise = require('bluebird')
|
||||
|
||||
module.exports = {
|
||||
init() {
|
||||
wiki.data.queues.forEach(queueName => {
|
||||
this[queueName] = new Bull(queueName, {
|
||||
prefix: `q-${wiki.config.ha.nodeuid}`,
|
||||
redis: wiki.config.redis
|
||||
})
|
||||
})
|
||||
return this
|
||||
},
|
||||
clean() {
|
||||
return Promise.each(wiki.data.queues, queueName => {
|
||||
return new Promise((resolve, reject) => {
|
||||
let keyStream = wiki.redis.scanStream({
|
||||
match: `q-${wiki.config.ha.nodeuid}:${queueName}:*`
|
||||
})
|
||||
keyStream.on('data', resultKeys => {
|
||||
if (resultKeys.length > 0) {
|
||||
wiki.redis.del(resultKeys)
|
||||
}
|
||||
})
|
||||
keyStream.on('end', resolve)
|
||||
})
|
||||
}).then(() => {
|
||||
wiki.logger.info('Purging old queue jobs: OK')
|
||||
}).catch(err => {
|
||||
wiki.logger.error(err)
|
||||
})
|
||||
}
|
||||
}
|
@@ -19,7 +19,11 @@ module.exports = {
|
||||
*/
|
||||
init() {
|
||||
if (isPlainObject(wiki.config.redis)) {
|
||||
return new Redis(wiki.config.redis)
|
||||
let red = new Redis(wiki.config.redis)
|
||||
red.on('ready', () => {
|
||||
wiki.logger.info('Redis connection: OK')
|
||||
})
|
||||
return red
|
||||
} else {
|
||||
wiki.logger.error('Invalid Redis configuration!')
|
||||
process.exit(1)
|
||||
|
Reference in New Issue
Block a user