Add MongoDB support to Hastebin.
All checks were successful
TerribleCodeClub/ButlerBin/pipeline/head This commit looks good

This commit is contained in:
Jack Hadrill 2020-06-09 01:26:48 +01:00
parent a21a6c595a
commit f35eae30d5
4 changed files with 64 additions and 39 deletions

View File

@ -4,6 +4,10 @@
"keyLength": 5, "keyLength": 5,
"keySpace": "abcdefghijklmnopqrstuvwxyz0123456789", "keySpace": "abcdefghijklmnopqrstuvwxyz0123456789",
"staticMaxAge": 86400, "staticMaxAge": 86400,
"mongodbUsername": "ButlerBot",
"mongodbPassword": "YzSwi2j2Pp6m5ln0",
"mongodbDbName": "butler_db",
"mongodbCollectionName": "pastes-test",
"logging": [ "logging": [
{ {
"level": "verbose", "level": "verbose",

View File

@ -1,47 +1,62 @@
var fs = require("fs"); var MongoClient = require("mongodb").MongoClient
var crypto = require("crypto"); var Winston = require("winston")
var FileDocumentStore = function() { class MongoDocumentStore {
this.basePath = "/data";
this.expire = null;
};
FileDocumentStore.md5 = function(str) { constructor(options) {
var md5sum = crypto.createHash("md5"); this.connectionURL = `mongodb+srv://${options.username}:${options.password}@cluster0-vycgu.mongodb.net/${options.dbName}?retryWrites=true&w=majority`;
md5sum.update(str); this.dbName = options.dbName;
return md5sum.digest("hex"); this.collectionName = options.collectionName;
}; }
FileDocumentStore.prototype.set = function(key, data, callback) { set(key, data, callback) {
try {
var _this = this; var _this = this;
fs.mkdir(this.basePath, "700", function() { const client = new MongoClient(this.connectionURL, { useUnifiedTopology: true, useNewUrlParser: true });
var fn = _this.basePath + "/" + FileDocumentStore.md5(key); client.connect(err => {
fs.writeFile(fn, data, "utf8", function(err) { if (err) {
callback(false);
Winston.error("Error connecting to MongoDB database.", { error: err });
return;
}
const db = client.db(_this.dbName);
const collection = db.collection(_this.collectionName);
collection.insertOne({key: key, data: data}, (err, result) => {
if (err) { if (err) {
callback(false); callback(false);
Winston.error("Error inserting data into MongoDB database.", { error: error });
return;
} }
else { Winston.info("Inserted data into MongoDB database.");
callback(true); callback(true);
}
}); });
}); });
} catch(err) {
callback(false);
} }
};
FileDocumentStore.prototype.get = function(key, callback) { get(key, callback) {
var _this = this; var _this = this;
var fn = _this.basePath + "/" + FileDocumentStore.md5(key); MongoClient.connect(this.connectionURL, { useUnifiedTopology: true }, function(err, client) {
fs.readFile(fn, "utf8", function(err, data) { if (err) {
if (err) { callback(false);
callback(false); Winston.error("Error connecting to MongoDB database.", { error: err });
} return;
else { }
callback(data); const db = client.db(_this.dbName);
} const collection = db.collection(_this.collectionName);
});
};
module.exports = FileDocumentStore; collection.findOne({key: key}, (err, result) => {
if (err || !result) {
callback(false);
if (err) {
Winston.error("Error getting data from MongoDB database.", { error: error });
}
return;
}
Winston.info("Retrieved data from MongoDB database.");
callback(result.data);
});
});
}
}
module.exports = MongoDocumentStore;

View File

@ -14,11 +14,12 @@
}, },
"main": "butlerbin", "main": "butlerbin",
"dependencies": { "dependencies": {
"connect-route": "0.1.5", "busboy": "0.3.1",
"connect": "3.7.0", "connect": "3.7.0",
"connect-route": "0.1.5",
"mongodb": "3.5.8",
"st": "2.0.0", "st": "2.0.0",
"winston": "0.6.2", "winston": "0.6.2"
"busboy": "0.3.1"
}, },
"bundledDependencies": [], "bundledDependencies": [],
"engines": { "engines": {

View File

@ -31,7 +31,12 @@ if (config.logging) {
} }
// Configure the data store. // Configure the data store.
store = new Store(); store = new Store({
username: config.mongodbUsername,
password: config.mongodbPassword,
dbName: config.mongodbDbName,
collectionName: config.mongodbCollectionName
});
// Pick up a key generator. // Pick up a key generator.
var keyGenerator = new KeyGenerator({ var keyGenerator = new KeyGenerator({