2020-08-26 04:54:58 +02:00
|
|
|
const winston = require('winston');
|
2020-09-03 19:24:34 +02:00
|
|
|
const postgres = require('pg');
|
2014-06-09 20:48:35 +02:00
|
|
|
|
2020-09-03 19:24:34 +02:00
|
|
|
class PostgresDocumentStore {
|
|
|
|
constructor(options){
|
|
|
|
this.expire = options.expire;
|
|
|
|
this.PostgresClient = new postgres.Client(options.clientOptions);
|
|
|
|
this.safeConnect();
|
|
|
|
this.PostgresClient.on('end', () => {
|
|
|
|
winston.debug('disconnected from pg!');
|
|
|
|
});
|
|
|
|
}
|
2014-06-09 20:48:35 +02:00
|
|
|
|
2020-09-03 19:24:34 +02:00
|
|
|
async set(key, data, skipExpire){
|
2020-08-28 04:39:03 +02:00
|
|
|
const now = Math.floor(Date.now() / 1000);
|
2020-09-03 19:24:34 +02:00
|
|
|
|
|
|
|
return await this.PostgresClient.query(
|
|
|
|
'INSERT INTO entries (key, value, expiration) VALUES ($1, $2, $3)',
|
|
|
|
[ key, data, (this.expire && !skipExpire) ? this.expire + now : null ]
|
|
|
|
)
|
|
|
|
.then(() => {
|
|
|
|
return true;
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
winston.error('failed to set postgres document', { key: key, error: err });
|
|
|
|
return false;
|
2020-08-28 04:39:03 +02:00
|
|
|
});
|
2014-06-09 20:48:35 +02:00
|
|
|
|
2020-09-03 19:24:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
async get(key, skipExpire){
|
2020-08-28 04:39:03 +02:00
|
|
|
const now = Math.floor(Date.now() / 1000);
|
2014-06-09 20:48:35 +02:00
|
|
|
|
2020-09-03 19:24:34 +02:00
|
|
|
return await this.PostgresClient.query(
|
|
|
|
'SELECT id,value,expiration FROM entries WHERE key = $1 AND (expiration IS NULL OR expiration > $2)',
|
|
|
|
[ key, now ])
|
|
|
|
.then(async res => {
|
|
|
|
if (res.rows.length && this.expire && !skipExpire){
|
|
|
|
await this.PostgresClient.query(
|
|
|
|
'UPDATE entries SET expiration = $1 WHERE ID = $2',
|
|
|
|
[ this.expire + now, res.rows[0].id ]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return res.rows.length ? res.rows[0].value : null;
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
winston.error('error retrieving value from postgres', { error: err });
|
|
|
|
return null;
|
|
|
|
});
|
2020-08-28 04:39:03 +02:00
|
|
|
}
|
2014-06-09 20:48:35 +02:00
|
|
|
|
2020-09-03 19:24:34 +02:00
|
|
|
async safeConnect(){
|
|
|
|
return await this.PostgresClient.connect()
|
|
|
|
.then(() => {
|
|
|
|
winston.info('connected to postgres!');
|
|
|
|
return { error: null };
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
winston.error('failed connecting to postgres!', {error: err});
|
|
|
|
return { error: err };
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2014-06-09 20:48:35 +02:00
|
|
|
|
2014-06-09 22:50:43 +02:00
|
|
|
module.exports = PostgresDocumentStore;
|