58 lines
2.1 KiB
JavaScript
58 lines
2.1 KiB
JavaScript
const Pgp = require('pg-promise')
|
|
const uuid = require('uuid')
|
|
const _ = require('lodash/fp')
|
|
const psqlUrl = require('../lib/options').postgresql
|
|
const logger = require('./logger')
|
|
const eventBus = require('./event-bus')
|
|
const extendedQueries = require('./extendedQueries')
|
|
|
|
const pgp = Pgp({
|
|
pgNative: true,
|
|
extend (obj, dbContext) {
|
|
obj.taskEx = function () {
|
|
const args = pgp.utils.taskArgs(arguments)
|
|
const { schema } = args.options
|
|
delete args.options.schema
|
|
if (schema) {
|
|
return obj.task.call(this, args.options, t => {
|
|
return t.none('SET search_path to $1:name', [schema])
|
|
.then(args.cb.bind(t, t))
|
|
})
|
|
}
|
|
return Promise.reject(new Error('No schema selected, cannot complete query'))
|
|
}
|
|
obj.$query = (query, values, qrm) => extendedQueries.query(obj, query, values, qrm)
|
|
obj.$result = (query, variables, cb, thisArg) => extendedQueries.result(obj, query, variables, cb, thisArg)
|
|
obj.$many = (query, variables) => extendedQueries.many(obj, query, variables)
|
|
obj.$manyOrNone = (query, variables) => extendedQueries.manyOrNone(obj, query, variables)
|
|
obj.$oneOrNone = (query, variables) => extendedQueries.oneOrNone(obj, query, variables)
|
|
obj.$one = (query, variables) => extendedQueries.one(obj, query, variables)
|
|
obj.$none = (query, variables) => extendedQueries.none(obj, query, variables)
|
|
obj.$any = (query, variables) => extendedQueries.any(obj, query, variables)
|
|
},
|
|
error: (err, e) => {
|
|
if (e.cn) logger.error('Database not reachable.')
|
|
if (e.query) {
|
|
logger.error(e.query)
|
|
e.params && logger.error(e.params)
|
|
}
|
|
logger.error(err)
|
|
}
|
|
})
|
|
|
|
const db = pgp(psqlUrl)
|
|
|
|
eventBus.subscribe('log', args => {
|
|
if (process.env.SKIP_SERVER_LOGS) return
|
|
|
|
const { level, message, meta } = args
|
|
const msgToSave = message ? message : _.get('message', meta)
|
|
|
|
const sql = `insert into server_logs
|
|
(id, device_id, message, log_level, meta) values ($1, $2, $3, $4, $5) returning *`
|
|
|
|
db.one(sql, [uuid.v4(), '', msgToSave, level, meta])
|
|
.then(_.mapKeys(_.camelCase))
|
|
})
|
|
|
|
module.exports = db
|