node-red-contrib-chatbot
Version:
REDBot a Chat bot for a full featured chat bot for Telegram, Facebook Messenger and Slack. Almost no coding skills required
91 lines (81 loc) • 2.56 kB
JavaScript
const Sequelize = require('sequelize');
const _ = require('lodash');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const { hash } = require('../utils/index');
module.exports = ({ dbPath, salt }) => {
const sequelize = new Sequelize('mission_control', '', '', {
host: 'localhost',
dialect: 'sqlite',
storage: dbPath,
logging: false
});
const Admin = sequelize.define('admin', {
username: Sequelize.STRING,
password: Sequelize.STRING,
first_name: Sequelize.STRING,
last_name: Sequelize.STRING,
avatar: Sequelize.STRING,
email: Sequelize.STRING,
payload: Sequelize.TEXT,
permissions: Sequelize.STRING,
chatbotIds: Sequelize.TEXT
}, {
indexes: [
{ name: 'admin_username', using: 'BTREE', fields: ['username'] },
{ name: 'admin_password', using: 'BTREE', fields: ['password'] },
{ name: 'admin_chatbotIds', using: 'BTREE', fields: ['chatbotIds'] }
]
});
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
Admin.findOne({ where: { id: parseInt(id, 10) } })
.then(user => {
done(null, user)
})
.catch(err => done(err));
});
passport.use(new LocalStrategy(async function(username, password, done) {
try {
let user = await Admin.findOne({ where: {
[Sequelize.Op.or]: [
sequelize.where(sequelize.fn('lower', sequelize.col('username')), username.toLocaleLowerCase()),
sequelize.where(sequelize.fn('lower', sequelize.col('email')), username.toLocaleLowerCase())
]
}
});
if (user == null) {
done(null, false);
} else {
const hashedPassword = hash(password, { salt });
if (_.isEmpty(user.password) || user.password === hashedPassword) {
done(null, {
id: user.id,
username: user.username,
firstName: user.first_name,
lastName: user.last_name,
avatar: user.avatar,
email: user.email,
isEmptyPassword: _.isEmpty(user.password),
permissions: !_.isEmpty(user.permissions) ? user.permissions.split(',') : [],
chatbotIds: user.chatbotIds
});
} else {
done(null, false);
}
}
} catch (e) {
done(e);
}
}));
const passportMiddlewares = [
passport.initialize(),
passport.session()
];
return {
passportMiddlewares,
passport
};
};