@@ -400,40 +400,68 @@ app.put("/api/v1/experiments/:id/finished", (req, res, next) => {
400
400
401
401
// Processess files for an experiment
402
402
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 ) ;
419
440
} )
420
441
. catch ( ( err ) => {
421
442
console . log ( err ) ;
422
443
} ) ;
444
+ } else {
445
+ // Save new file with new ID
446
+ _saveGFSFile ( new db . ObjectID ( ) , fileObj , false ) ;
423
447
}
424
- } ) ;
425
- } ;
448
+ } ;
426
449
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
+ }
430
453
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
+ } ) ;
435
462
} )
436
463
. catch ( ( err ) => {
464
+ console . log ( err ) ;
437
465
next ( err ) ;
438
466
} ) ;
439
467
} ) ;
0 commit comments