UNPKG

mongo-express-leufu

Version:

Web-based admin interface for MongoDB

176 lines (141 loc) 5.13 kB
"use strict"; var _ = require("lodash"); var Busboy = require("busboy"); var GridFSStream = require("gridfs-stream"); var mongo = require("mongodb"); var utils = require("../utils"); // var routes = function(config) { var routes = function(config, socket) { var exp = {}; //view all files in a bucket exp.viewBucket = function(req, res) { var files = req.files; var columns = ["filename", "length"]; // putting these here keeps them at the front/left var statsAvgChunk = utils.bytesToSize( files.reduce((prev, curr) => prev + curr.chunkSize, 0) / files.length ); var statsTotalSize = utils.bytesToSize( files.reduce((prev, curr) => prev + curr.length, 0) ); // Iterate through files for a cleanup for (var f in files) { columns.push(Object.keys(files[f])); // Generate an array of columns used by all documents visible on this page files[f].length = utils.bytesToSize(files[f].length); // Filesizes to something more readable delete files[f].chunkSize; // Already taken the average above, no need; } columns = _.uniq(_.flatten(columns)); columns.splice(columns.indexOf("_id"), 1); columns.splice(columns.indexOf("chunkSize"), 1); var ctx = { buckets: res.locals.gridFSBuckets[req.dbName], columns: columns, files: req.files, title: "Viewing Bucket: " + req.bucketName, stats: { avgChunk: statsAvgChunk, totalSize: statsTotalSize, }, }; res.render("gridfs", ctx); }; // upload a file exp.addFile = function(req, res) { var busboy = new Busboy({ headers: req.headers }); var newFileID = new mongo.ObjectId(); // Override the bucket name with what is currently selected // https://github.com/aheckmann/gridfs-stream/blob/a3b7c4e48a08ac625cf7564304c83e56d6b93821/lib/index.js#L31 mongo.GridStore.DEFAULT_ROOT_COLLECTION = req.bucketName; var gfs = new GridFSStream(req.db, mongo); busboy .on("file", function(fieldname, file, filename, encoding, mimetype) { if (!filename) { req.session.error = "No filename."; return res.redirect("back"); } var writeStream = gfs.createWriteStream({ _id: newFileID, filename: filename, mode: "w", content_type: mimetype, }); file.pipe(writeStream); }) .on("finish", function() { req.session.success = "File uploaded!"; setTimeout(function() { // short delay to allow Mongo to finish syncing return res.redirect("back"); }, 500); }); req.pipe(busboy); }; // download a file exp.getFile = function(req, res) { // Override the bucket name with what is currently selected // https://github.com/aheckmann/gridfs-stream/blob/a3b7c4e48a08ac625cf7564304c83e56d6b93821/lib/index.js#L31 mongo.GridStore.DEFAULT_ROOT_COLLECTION = req.bucketName; var gfs = new GridFSStream(req.db, mongo); gfs.findOne({ _id: req.fileID }, function(err, file) { if (err) { console.error(err); req.session.error = "Error: " + err; return res.redirect("back"); } if (!file) { console.error("No file"); req.session.error = "File not found!"; return res.redirect("back"); } res.set("Content-Type", file.contentType); res.set( "Content-Disposition", 'attachment; filename="' + encodeURI(file.filename) + '"' ); var readstream = gfs.createReadStream({ _id: file._id, }); readstream.on("error", function(err) { console.error("Got error while processing stream " + err.message); req.session.error = "Error: " + err; res.end(); }); readstream.pipe(res); }); }; // delete a file exp.deleteFile = function(req, res) { // Override the bucket name with what is currently selected // https://github.com/aheckmann/gridfs-stream/blob/a3b7c4e48a08ac625cf7564304c83e56d6b93821/lib/index.js#L31 mongo.GridStore.DEFAULT_ROOT_COLLECTION = req.bucketName; var gfs = new GridFSStream(req.db, mongo); gfs.remove({ _id: req.fileID }, function(err) { if (err) { req.session.error = "Error: " + err; return res.redirect("back"); } req.session.success = 'File _id: "' + req.fileID + '" deleted! '; setTimeout(function() { // short delay to allow Mongo to finish syncing return res.redirect("back"); }, 500); }); }; // add bucket exp.addBucket = function(req, res) { req.session.error("addBucket not implemented yet"); res.redirect("back"); // req.session.success = 'Bucket created!'; }; // delete bucket exp.deleteBucket = function(req, res) { req.session.error("deleteBucket not implemented yet"); res.redirect("back"); // req.session.success = 'Bucket deleted!'; }; exp.renameBucket = function(req, res) { req.session.error("renameBucket not implemented yet"); res.redirect("back"); }; return exp; }; module.exports = routes;