botpress
Version:
The world's first CMS for bots. Easily create, manage and extend chatbots.
144 lines (118 loc) • 4.25 kB
JavaScript
;
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const isLite = knex => {
return knex.client.config.client === 'sqlite3';
}; /**
* Helpers for the [Botpress Database]{@link Database} running on [Knex]{@link http://knexjs.org/}
* @public
* @module DatabaseHelpers
* @example
* import { DatabaseHelpers } from 'botpress'
* // or
* const { DatabaseHelpers } from 'botpress'
*
* const helpers = DatabaseHelpers(await bp.db.get())
*/
/*
The goal of these helpers is to generate SQL queries
that are valid for both SQLite and Postgres
*/
module.exports = knex => {
const dateParse = exp => {
return isLite(knex) ? knex.raw(`strftime('%Y-%m-%dT%H:%M:%fZ', ${exp})`) : knex.raw(exp);
};
const dateFormat = date => {
const iso = (0, _moment2.default)(date).toDate().toISOString();
return dateParse(`'${iso}'`);
};
const columnOrDateFormat = colOrDate => {
const lite = isLite(knex);
if (colOrDate.sql) {
return colOrDate.sql;
}
if (typeof colOrDate === 'string') {
return lite ? dateParse(colOrDate) : `"${colOrDate}"`;
}
return dateFormat(colOrDate);
};
return {
/**
* Returns whether or not the current database is SQLite
* @return {Boolean} Returns true if the database is SQLite, false if Postgres
*/
isLite: () => isLite(knex),
/**
* **This is a workaround utility function**
* knex's createTableIfNotExists doesn't work with postgres
* https://github.com/tgriesser/knex/issues/1303
* @param {String} tableName Name of the table to create
* @param {Function} Callback function. Identical to Knex's callback.
*/
createTableIfNotExists: (tableName, cb) => {
return knex.schema.hasTable(tableName).then(exists => {
if (exists) {
return;
}
return knex.schema.createTableIfNotExists(tableName, cb);
});
},
// only works for single insert beause of SQLite
insertAndRetrieve: (tableName, data, returnColumns = 'id', idColumnName = 'id') => {
// postgres supports 'returning' natively
if (!isLite(knex)) {
return knex(tableName).insert(data).returning(returnColumns).then().get(0);
}
return knex.transaction(trx => knex(tableName).insert(data).transacting(trx).then(() => knex.select(knex.raw('last_insert_rowid() as id')).transacting(trx).then(([{ id }]) => {
if (returnColumns === idColumnName) {
return id;
}
return knex(tableName).select(returnColumns).where(idColumnName, id).limit(1).transacting(trx).then().get(0);
})).then(trx.commit).catch(trx.rollback));
},
date: {
format: dateFormat,
now: () => isLite(knex) ? knex.raw("strftime('%Y-%m-%dT%H:%M:%fZ', 'now')") : knex.raw('now()'),
isBefore: (d1, d2) => {
d1 = columnOrDateFormat(d1);
d2 = columnOrDateFormat(d2);
return knex.raw(d1 + ' < ' + d2);
},
isAfter: (d1, d2) => {
d1 = columnOrDateFormat(d1);
d2 = columnOrDateFormat(d2);
return knex.raw(d1 + ' > ' + d2);
},
isBetween: (d1, d2, d3) => {
d1 = columnOrDateFormat(d1);
d2 = columnOrDateFormat(d2);
d3 = columnOrDateFormat(d3);
return knex.raw(`${d1} BETWEEN ${d2} AND ${d3}`);
},
isSameDay: (d1, d2) => {
d1 = columnOrDateFormat(d1);
d2 = columnOrDateFormat(d2);
return knex.raw(`date(${d1}) = date(${d2})`);
},
hourOfDay: date => {
date = columnOrDateFormat(date);
return isLite(knex) ? knex.raw(`strftime('%H', ${date})`) : knex.raw(`to_char(${date}, 'HH24')`);
}
},
bool: {
true: () => isLite(knex) ? 1 : true,
false: () => isLite(knex) ? 0 : false,
parse: value => isLite(knex) ? !!value : value
},
json: {
set: obj => {
return isLite(knex) ? obj && JSON.stringify(obj) : obj;
},
get: obj => {
return isLite(knex) ? obj && JSON.parse(obj) : obj;
}
}
};
};
//# sourceMappingURL=helpers.js.map