UNPKG

botpress

Version:

The world's first CMS for bots. Easily create, manage and extend chatbots.

201 lines (159 loc) 8.64 kB
'use strict'; var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _knex2 = require('knex'); var _knex3 = _interopRequireDefault(_knex2); var _pick = require('lodash/pick'); var _pick2 = _interopRequireDefault(_pick); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _tables = require('./tables'); var _tables2 = _interopRequireDefault(_tables); var _kvs2 = require('./kvs'); var _kvs3 = _interopRequireDefault(_kvs2); var _migration = require('./migration'); var _migration2 = _interopRequireDefault(_migration); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new _bluebird2.default(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return _bluebird2.default.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } /** * The db (database) namespace lets you control the database directly via [Knex]{@link http://knexjs.org/} * @public * @namespace Database * @example * await knex = bp.db.get() */ const initializeCoreDatabase = (knex, botpressPath) => { if (!knex) { throw new Error('You must initialize the database before'); } const directory = _path2.default.join(botpressPath, './migrations/'); return _bluebird2.default.mapSeries(_tables2.default, fn => fn(knex)).then(() => knex.migrate.latest({ directory })); }; const createKnex = (() => { var _ref = _asyncToGenerator(function* ({ sqlite, postgres, botpressPath, logger }) { const commonConfig = { useNullAsDefault: true }; const dbConfig = postgres.enabled ? { client: 'pg', connection: postgres.connection || (0, _pick2.default)(postgres, ['host', 'port', 'user', 'password', 'database', 'ssl']) } : { client: 'sqlite3', connection: { filename: sqlite.location }, pool: { afterCreate: function (conn, cb) { conn.run('PRAGMA foreign_keys = ON', cb); } } }; const _knex = (0, _knex3.default)(Object.assign(commonConfig, dbConfig)); yield initializeCoreDatabase(_knex, botpressPath); return _knex; }); return function createKnex(_x) { return _ref.apply(this, arguments); }; })(); module.exports = ({ sqlite, postgres, logger, botpressPath }) => { let knex = null; const getDb = (() => { var _ref2 = _asyncToGenerator(function* () { if (!knex) { knex = yield createKnex({ sqlite, postgres, botpressPath, logger }); } return knex; }); return function getDb() { return _ref2.apply(this, arguments); }; })(); const saveUser = (() => { var _ref3 = _asyncToGenerator(function* ({ id, platform, gender = 'unknown', timezone = null, locale = null, picture_url, first_name, last_name }) { const userId = platform + ':' + id; const userRow = { id: userId, userId: id, platform, gender, timezone, picture_url, last_name, first_name, locale, created_on: (0, _moment2.default)(new Date()).toISOString() }; const knex = yield getDb(); let query = knex('users').insert(userRow).where(function () { return this.select(knex.raw(1)).from('users').where('id', '=', userId); }); if (postgres.enabled) { query = `${query.toString()} on conflict (id) do nothing`.replace('?', '\\?'); // escape "?" symbols in strings } else { // SQLite query = query.toString().replace(/^insert/i, 'insert or ignore'); } yield knex.raw(query); return userRow; }); return function saveUser(_x2) { return _ref3.apply(this, arguments); }; })(); let kvsInstance = null; const createKvs = (() => { var _ref4 = _asyncToGenerator(function* () { const knex = yield getDb(); const _kvs = (0, _kvs3.default)(knex); yield _kvs.bootstrap(); return _kvs; }); return function createKvs() { return _ref4.apply(this, arguments); }; })(); const getKvs = (() => { var _ref5 = _asyncToGenerator(function* () { if (!kvsInstance) { kvsInstance = createKvs(); } return kvsInstance; }); return function getKvs() { return _ref5.apply(this, arguments); }; })(); const kvsGet = (...args) => getKvs().then(instance => instance.get(...args)); const kvsSet = (...args) => getKvs().then(instance => instance.set(...args)); const kvsWrapper = { get: kvsGet, set: kvsSet }; return { /** * Returns an initialized and connected instance of [Knex]{@link http://knexjs.org/}. * Knex is a SQL Query Builder and database abstractor that Botpress (and every Botpress modules) use internally. * [Knex Documentation]{@link http://knexjs.org/#Builder} * @func * @async * @memberOf! Database * @return {KnexQueryBuilder} */ get: getDb, saveUser, location: postgres.enabled ? 'postgres' : sqlite.location, migration: _migration2.default, get kvs() { logger && logger.warn('[Deprecation Notice] `bp.db.kvs` is deprecated and will be removed in Botpress 11. Please use `bp.kvs` directly instead.'); return kvsWrapper; }, _kvs: kvsWrapper }; }; //# sourceMappingURL=index.js.map