Skip to content

Commit 6a47816

Browse files
committed
fix: rewrite old files in GridFS
1 parent 692665a commit 6a47816

File tree

1 file changed

+53
-25
lines changed

1 file changed

+53
-25
lines changed

lab.js

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -400,40 +400,68 @@ app.put("/api/v1/experiments/:id/finished", (req, res, next) => {
400400

401401
// Processess files for an experiment
402402
app.put("/api/v1/experiments/:id/files", upload.array("_files"), (req, res, next) => {
403-
delete req.body._id; // Delete ID (will not update otherwise)
404-
var filesP = Array(req.files.length);
405-
406-
var saveGFSFile = function(fileObj) {
407-
var fileId = new db.ObjectID(); // Create file ID
408-
// Open new file
409-
var gfs = new db.GridStore(db, fileId, fileObj.originalname, "w", {metadata: {contentType: fileObj.mimetype}, promiseLibrary: Promise});
410-
gfs.open((err, gfs) => {
411-
if (err) {
412-
console.log(err);
413-
} else {
414-
// Write from buffer and flush to db
415-
gfs.write(fileObj.buffer, true)
416-
.then((gfs) => {
417-
// Save file reference
418-
filesP[i] = db.experiments.updateByIdAsync(req.params.id, {$push: {_files: {_id: gfs.fileId, filename: gfs.filename, mimetype: gfs.metadata.contentType}}});
403+
// Retrieve list of files for experiment
404+
db.experiments.findByIdAsync(req.params.id, {_files: 1})
405+
.then((experiment) => {
406+
407+
var filesP = Array(req.files.length);
408+
409+
var _saveGFSFile = function(fileId, fileObj, replace) {
410+
// Open new file
411+
var gfs = new db.GridStore(db, fileId, fileObj.originalname, "w", {metadata: {contentType: fileObj.mimetype}, promiseLibrary: Promise});
412+
gfs.open((err, gfs) => {
413+
if (err) {
414+
console.log(err);
415+
} else {
416+
// Write from buffer and flush to db
417+
gfs.write(fileObj.buffer, true)
418+
.then((gfs) => {
419+
if (!replace) {
420+
// Save file reference
421+
filesP[i] = db.experiments.updateByIdAsync(req.params.id, {$push: {_files: {_id: gfs.fileId, filename: gfs.filename, mimetype: gfs.metadata.contentType}}});
422+
}
423+
})
424+
.catch((err) => {
425+
console.log(err);
426+
});
427+
}
428+
});
429+
};
430+
431+
var saveGFSFile = function(fileObj) {
432+
// Check if file needs to be replaced
433+
var oldFile = _.find(experiment._files, {filename: fileObj.originalname});
434+
if (oldFile) {
435+
// Delete old file
436+
var gfs = new db.GridStore(db, oldFile._id, "w", {promiseLibrary: Promise});
437+
gfs.unlinkAsync()
438+
.then(() => {
439+
_saveGFSFile(oldFile._id, fileObj, true);
419440
})
420441
.catch((err) => {
421442
console.log(err);
422443
});
444+
} else {
445+
// Save new file with new ID
446+
_saveGFSFile(new db.ObjectID(), fileObj, false);
423447
}
424-
});
425-
};
448+
};
426449

427-
for (var i = 0; i < req.files.length; i++) {
428-
saveGFSFile(req.files[i]); // Save file in function closure
429-
}
450+
for (var i = 0; i < req.files.length; i++) {
451+
saveGFSFile(req.files[i]); // Save file in function closure
452+
}
430453

431-
// Check file promises
432-
Promise.all(filesP)
433-
.then(() => {
434-
res.send({message: "Files uploaded"});
454+
// Check file promises
455+
Promise.all(filesP)
456+
.then(() => {
457+
res.send({message: "Files uploaded"});
458+
})
459+
.catch((err) => {
460+
next(err);
461+
});
435462
})
436463
.catch((err) => {
464+
console.log(err);
437465
next(err);
438466
});
439467
});

0 commit comments

Comments
 (0)