diff --git a/services/web/app/coffee/Features/ThirdPartyDataStore/UpdateMerger.coffee b/services/web/app/coffee/Features/ThirdPartyDataStore/UpdateMerger.coffee index ecb1536fb1..3196458817 100644 --- a/services/web/app/coffee/Features/ThirdPartyDataStore/UpdateMerger.coffee +++ b/services/web/app/coffee/Features/ThirdPartyDataStore/UpdateMerger.coffee @@ -11,31 +11,26 @@ LockManager = require("../../infrastructure/LockManager") module.exports = UpdateMerger = mergeUpdate: (user_id, project_id, path, updateRequest, source, callback = (error) ->)-> logger.log project_id:project_id, path:path, "merging update from tpds" - LockManager.runWithLock project_id, - (cb) => UpdateMerger.mergeUpdateWithoutLock(user_id, project_id, path, updateRequest, source, cb) - callback - - mergeUpdateWithoutLock: (user_id, project_id, path, updateRequest, source, callback = (error) ->)-> - projectLocator.findElementByPath project_id, path, (err, element)=> - # Returns an error if the element is not found - #return callback(err) if err? - logger.log project_id:project_id, path:path, "found element by path for merging update from tpds" - elementId = undefined - if element? - elementId = element._id - UpdateMerger.p.writeStreamToDisk project_id, elementId, updateRequest, (err, fsPath)-> - callback = _.wrap callback, (cb, arg) -> - fs.unlink fsPath, (err) -> - if err? + UpdateMerger.p.writeStreamToDisk project_id, updateRequest, (err, fsPath)-> + return callback(err) if err? + LockManager.runWithLock project_id, + (cb) => UpdateMerger.mergeUpdateWithoutLock user_id, project_id, path, fsPath, source, cb + (mergeErr) -> + fs.unlink fsPath, (deleteErr) -> + if deleteErr? logger.err project_id:project_id, fsPath:fsPath, "error deleting file" - cb(arg) + callback mergeErr + + mergeUpdateWithoutLock: (user_id, project_id, path, fsPath, source, callback = (error) ->)-> + projectLocator.findElementByPath project_id, path, (err, element)=> + logger.log {project_id, path, fsPath}, "found element by path for merging update from tpds" + elementId = element?._id + FileTypeManager.isBinary path, fsPath, (err, isFile)-> return callback(err) if err? - FileTypeManager.isBinary path, fsPath, (err, isFile)-> - return callback(err) if err? - if isFile - UpdateMerger.p.processFile project_id, elementId, fsPath, path, source, user_id, callback - else - UpdateMerger.p.processDoc project_id, elementId, user_id, fsPath, path, source, callback + if isFile + UpdateMerger.p.processFile project_id, elementId, fsPath, path, source, user_id, callback + else + UpdateMerger.p.processDoc project_id, elementId, user_id, fsPath, path, source, callback deleteUpdate: (user_id, project_id, path, source, callback)-> LockManager.runWithLock project_id, @@ -83,27 +78,25 @@ module.exports = UpdateMerger = else editorController.addFileWithoutLock project_id, folder?._id, fileName, fsPath, source, user_id, finish - writeStreamToDisk: (project_id, file_id, stream, callback = (err, fsPath)->)-> - if !file_id? - file_id = uuid.v4() - dumpPath = "#{Settings.path.dumpFolder}/#{project_id}_#{file_id}" + writeStreamToDisk: (project_id, stream, callback = (err, fsPath)->)-> + dumpPath = "#{Settings.path.dumpFolder}/#{project_id}_#{uuid.v4()}" writeStream = fs.createWriteStream(dumpPath) stream.pipe(writeStream) stream.on 'error', (err)-> - logger.err err:err, project_id:project_id, file_id:file_id, dumpPath:dumpPath, + logger.err {err, project_id, dumpPath}, "something went wrong with incoming tpds update stream" writeStream.on 'error', (err)-> - logger.err err:err, project_id:project_id, file_id:file_id, dumpPath:dumpPath, + logger.err {err, project_id, dumpPath}, "something went wrong with writing tpds update to disk" stream.on 'end', -> - logger.log project_id:project_id, file_id:file_id, dumpPath:dumpPath, "incoming tpds update stream ended" + logger.log {project_id, dumpPath}, "incoming tpds update stream ended" writeStream.on "finish", -> - logger.log project_id:project_id, file_id:file_id, dumpPath:dumpPath, "tpds update write stream finished" + logger.log {project_id, dumpPath}, "tpds update write stream finished" callback null, dumpPath - + readFileIntoTextArray = (path, callback)-> fs.readFile path, "utf8", (error, content = "") -> if error? diff --git a/services/web/test/unit/coffee/ThirdPartyDataStore/UpdateMergerTests.coffee b/services/web/test/unit/coffee/ThirdPartyDataStore/UpdateMergerTests.coffee index de7c50ac58..5054a30f10 100644 --- a/services/web/test/unit/coffee/ThirdPartyDataStore/UpdateMergerTests.coffee +++ b/services/web/test/unit/coffee/ThirdPartyDataStore/UpdateMergerTests.coffee @@ -40,7 +40,7 @@ describe 'UpdateMerger :', -> beforeEach -> @path = "/doc1" @fsPath = "file/system/path.tex" - @updateMerger.p.writeStreamToDisk = sinon.stub().callsArgWith(3, null, @fsPath) + @updateMerger.p.writeStreamToDisk = sinon.stub().callsArgWith(2, null, @fsPath) @FileTypeManager.isBinary = sinon.stub() describe "doc updates", () -> @@ -159,7 +159,6 @@ describe 'UpdateMerger :', -> @editorController.replaceFileWithoutLock = sinon.stub().callsArg(5) @editorController.deleteEntityWithoutLock = sinon.stub() @editorController.mkdirpWithoutLock = sinon.stub().withArgs(@project_id).callsArgWith(2, null, [@folder], @folder) - @updateMerger.p.writeStreamToDisk = sinon.stub().withArgs(@project_id, @file_id, @update).callsArgWith(3, null, @fsPath) it 'should replace file if the file already exists', (done)-> @updateMerger.p.processFile @project_id, @file_id, @fsPath, @path, @source, @user_id, =>