1
0
Fork 0
mirror of https://github.com/seejohnrun/haste-server.git synced 2024-11-24 21:41:21 +00:00
haste-server/lib/document_stores/mongodb.js

90 lines
2.7 KiB
JavaScript
Raw Normal View History

const MongoClient = require('mongodb').MongoClient,
2016-06-10 20:43:43 +00:00
winston = require('winston');
const MongoDocumentStore = function (options) {
2016-06-10 20:43:43 +00:00
this.expire = options.expire;
this.connectionUrl = process.env.DATABASE_URL || options.connectionUrl;
this.connectionName = process.env.DATABASE_NAME || options.connectionName;
2016-06-10 20:43:43 +00:00
};
MongoDocumentStore.prototype.set = function (key, data, callback, skipExpire) {
const now = Math.floor(new Date().getTime() / 1000),
2016-06-10 20:43:43 +00:00
that = this;
this.safeConnect(function (err, db) {
if (err)
return callback(false);
2020-12-03 18:05:09 +00:00
db.collection('entries').updateOne({
2016-06-10 20:43:43 +00:00
'entry_id': key,
$or: [
{ expiration: -1 },
{ expiration: { $gt: now } }
]
}, {
2020-12-03 18:05:09 +00:00
$set: {
'entry_id': key,
'value': data,
'expiration': that.expire && !skipExpire ? that.expire + now : -1
}
2016-06-10 20:43:43 +00:00
}, {
upsert: true
}, function (err, existing) {
if (err) {
winston.error('error persisting value to mongodb', { error: err });
return callback(false);
}
callback(true);
});
});
};
MongoDocumentStore.prototype.get = function (key, callback, skipExpire) {
const now = Math.floor(new Date().getTime() / 1000),
2016-06-10 20:43:43 +00:00
that = this;
this.safeConnect(function (err, db) {
if (err)
return callback(false);
2016-06-10 20:43:43 +00:00
db.collection('entries').findOne({
'entry_id': key,
$or: [
{ expiration: -1 },
{ expiration: { $gt: now } }
]
}, function (err, entry) {
if (err) {
winston.error('error persisting value to mongodb', { error: err });
return callback(false);
}
callback(entry === null ? false : entry.value);
if (entry !== null && entry.expiration !== -1 && that.expire && !skipExpire) {
2020-12-03 18:05:09 +00:00
db.collection('entries').updateOne({
2016-06-10 20:43:43 +00:00
'entry_id': key
}, {
$set: {
'expiration': that.expire + now
}
}, function (err, result) { });
}
});
});
};
MongoDocumentStore.prototype.safeConnect = function (callback) {
2020-12-03 18:05:09 +00:00
MongoClient.connect(this.connectionUrl, { useUnifiedTopology: true }, function (err, client) {
2016-06-10 20:43:43 +00:00
if (err) {
winston.error('error connecting to mongodb', { error: err });
callback(err);
} else {
2021-07-20 22:53:17 +00:00
callback(undefined, client.db(this.connectionName));
2016-06-10 20:43:43 +00:00
}
});
};
module.exports = MongoDocumentStore;