From 9134fa7b4c5bc414a0e8cc96250e898b499852b0 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Mon, 7 Apr 2014 13:47:10 +0100 Subject: [PATCH] moved deleteProject to the project deleter --- .../Features/Editor/EditorController.coffee | 4 +- .../Features/Project/ProjectDeleter.coffee | 40 +++++++++++++++-- .../controllers/ProjectController.coffee | 3 +- .../app/coffee/handlers/ProjectHandler.coffee | 21 +-------- .../coffee/Project/ProjectDeleterTests.coffee | 44 +++++++++++++++++++ 5 files changed, 87 insertions(+), 25 deletions(-) diff --git a/services/web/app/coffee/Features/Editor/EditorController.coffee b/services/web/app/coffee/Features/Editor/EditorController.coffee index 80f6280ffe..135f3a8c5c 100644 --- a/services/web/app/coffee/Features/Editor/EditorController.coffee +++ b/services/web/app/coffee/Features/Editor/EditorController.coffee @@ -5,6 +5,7 @@ ProjectEditorHandler = require('../Project/ProjectEditorHandler') ProjectEntityHandler = require('../Project/ProjectEntityHandler') ProjectOptionsHandler = require('../Project/ProjectOptionsHandler') ProjectDetailsHandler = require('../Project/ProjectDetailsHandler') +ProjectDeleter = require("../Project/ProjectDeleter") ProjectGetter = require('../Project/ProjectGetter') ProjectHandler = new (require('../../handlers/ProjectHandler'))() DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') @@ -240,7 +241,8 @@ module.exports = EditorController = deleteProject: (project_id, callback)-> Metrics.inc "editor.delete-project" logger.log project_id:project_id, "recived message to delete project" - ProjectHandler.deleteProject project_id, callback + console.log ProjectDeleter + ProjectDeleter.deleteProject project_id, callback renameEntity: (project_id, entity_id, entityType, newName, callback)-> newName = sanitize.escape(newName) diff --git a/services/web/app/coffee/Features/Project/ProjectDeleter.coffee b/services/web/app/coffee/Features/Project/ProjectDeleter.coffee index 69b9289552..0465959f2f 100644 --- a/services/web/app/coffee/Features/Project/ProjectDeleter.coffee +++ b/services/web/app/coffee/Features/Project/ProjectDeleter.coffee @@ -1,7 +1,10 @@ Project = require('../../models/Project').Project logger = require('logger-sharelatex') -editorController = require('../Editor/EditorController') - +documentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') +tagsHandler = require("../Tags/TagsHandler") +async = require("async") +AutomaticSnapshotManager = require('../Versioning/AutomaticSnapshotManager') +FileStoreHandler = require("../FileStore/FileStoreHandler") module.exports = @@ -11,9 +14,40 @@ module.exports = update = {deletedByExternalDataSource:true} Project.update conditions, update, {}, (err)-> - editorController.notifyUsersProjectHasBeenDeletedOrRenamed project_id, -> + require('../Editor/EditorController').notifyUsersProjectHasBeenDeletedOrRenamed project_id, -> callback() deleteUsersProjects: (owner_id, callback)-> logger.log owner_id:owner_id, "deleting users projects" Project.remove owner_ref:owner_id, callback + + + deleteProject: (project_id, callback = (error) ->)-> + logger.log project_id:project_id, "deleting project" + Project.findById project_id, (err, project)=> + if err? or !project? + logger.err err:err, project_id:project_id, "error getting project to delete it" + callback(err) + else + async.series [ + (cb)-> + documentUpdaterHandler.flushProjectToMongoAndDelete project_id, cb + (cb)-> + Project.applyToAllFilesRecursivly project.rootFolder[0], (file)=> + FileStoreHandler.deleteFile project_id, file._id, -> + cb() + (cb)-> + AutomaticSnapshotManager.unmarkProjectAsUpdated project_id, cb + (cb)-> + tagsHandler.removeProjectFromAllTags project.owner_ref, project_id, cb + (cb)-> + project.collaberator_refs.forEach (collaberator_ref)-> + tagsHandler.removeProjectFromAllTags collaberator_ref, project_id, -> + cb() + (cb)-> + project.readOnly_refs.forEach (readOnly_ref)-> + tagsHandler.removeProjectFromAllTags readOnly_ref, project_id, -> + cb() + (cb)-> + Project.remove {_id:project_id}, cb + ], callback diff --git a/services/web/app/coffee/controllers/ProjectController.coffee b/services/web/app/coffee/controllers/ProjectController.coffee index 3b98193f4e..40084cfe0b 100755 --- a/services/web/app/coffee/controllers/ProjectController.coffee +++ b/services/web/app/coffee/controllers/ProjectController.coffee @@ -10,6 +10,7 @@ SecurityManager = require '../managers/SecurityManager' Settings = require('settings-sharelatex') projectCreationHandler = require '../Features/Project/ProjectCreationHandler' projectDuplicator = require('../Features/Project/ProjectDuplicator') +projectDeleter = require("../Features/Project/ProjectDeleter") ProjectZipStreamManager = require '../Features/Downloads/ProjectZipStreamManager' metrics = require('../infrastructure/Metrics') TagsHandler = require('../Features/Tags/TagsHandler') @@ -198,7 +199,7 @@ module.exports = class ProjectController deleteProject: (req, res)-> project_id = req.params.Project_id logger.log project_id:project_id, "deleting project" - ProjectHandler.deleteProject project_id, (err)-> + projectDeleter.deleteProject project_id, (err)-> if err? res.send 500 else diff --git a/services/web/app/coffee/handlers/ProjectHandler.coffee b/services/web/app/coffee/handlers/ProjectHandler.coffee index 9ba0a9c015..3c42fef479 100755 --- a/services/web/app/coffee/handlers/ProjectHandler.coffee +++ b/services/web/app/coffee/handlers/ProjectHandler.coffee @@ -31,26 +31,7 @@ module.exports = class ProjectHandler if callback? callback err - deleteProject: (project_id, callback = (error) ->)-> - logger.log project_id:project_id, "deleting project" - Project.findById project_id, (err, project)=> - if project? - require('../Features/DocumentUpdater/DocumentUpdaterHandler').flushProjectToMongoAndDelete project_id, (error) -> - return callback(error) if error? - Project.applyToAllFilesRecursivly project.rootFolder[0], (file)=> - FileStoreHandler.deleteFile project_id, file._id, -> - Project.remove {_id:project_id}, (err)-> - if callback? - callback(err) - require('../Features/Versioning/AutomaticSnapshotManager').unmarkProjectAsUpdated project_id, -> - tagsHandler.removeProjectFromAllTags project.owner_ref, project_id,-> - project.collaberator_refs.forEach (collaberator_ref)-> - tagsHandler.removeProjectFromAllTags collaberator_ref, project_id, -> - project.readOnly_refs.forEach (readOnly_ref)-> - tagsHandler.removeProjectFromAllTags readOnly_ref, project_id,-> - else - if callback? - callback(err) + setPublicAccessLevel : (project_id, newAccessLevel, callback)-> logger.log project_id: project_id, level: newAccessLevel, "set public access level" diff --git a/services/web/test/UnitTests/coffee/Project/ProjectDeleterTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectDeleterTests.coffee index e059f9f30a..0cb4105bbf 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectDeleterTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectDeleterTests.coffee @@ -7,14 +7,32 @@ sinon = require('sinon') describe 'Project deleter', -> beforeEach -> + @project_id = "12312" + @project = + _id: @project_id + rootFolder:[] + collaberator_refs:["collab1", "collab2"] + readOnly_refs:["readOnly1", "readOnly2"] + owner_ref:"owner ref here" @Project = update: sinon.stub().callsArgWith(3) remove: sinon.stub().callsArgWith(1) + findById: sinon.stub().callsArgWith(1, null, @project) + applyToAllFilesRecursivly: sinon.stub() + @documentUpdaterHandler = + flushProjectToMongoAndDelete:sinon.stub().callsArgWith(1) + @AutomaticSnapshotManager = + unmarkProjectAsUpdated:sinon.stub().callsArgWith(1) @editorController = notifyUsersProjectHasBeenDeletedOrRenamed : sinon.stub().callsArgWith(1) + @TagsHandler = + removeProjectFromAllTags: sinon.stub().callsArgWith(2) @deleter = SandboxedModule.require modulePath, requires: "../Editor/EditorController": @editorController '../../models/Project':{Project:@Project} + '../DocumentUpdater/DocumentUpdaterHandler': @documentUpdaterHandler + '../Versioning/AutomaticSnapshotManager':@AutomaticSnapshotManager + "../Tags/TagsHandler":@TagsHandler 'logger-sharelatex': log:-> @@ -39,3 +57,29 @@ describe 'Project deleter', -> @deleter.deleteUsersProjects user_id, => @Project.remove.calledWith(owner_ref:user_id).should.equal true done() + + + describe "deleteProject", -> + beforeEach -> + @Project.remove.callsArgWith(1) + + it "should flushProjectToMongoAndDelete in doc updater", (done)-> + @deleter.deleteProject @project_id, => + @documentUpdaterHandler.flushProjectToMongoAndDelete.calledWith(@project_id).should.equal true + done() + + it "should remove the project", (done)-> + @deleter.deleteProject @project_id, => + @Project.remove.calledWith(_id:@project_id).should.equal true + done() + + it "should removeProjectFromAllTags", (done)-> + @deleter.deleteProject @project_id, => + @TagsHandler.removeProjectFromAllTags.calledWith(@project.owner_ref, @project_id).should.equal true + @TagsHandler.removeProjectFromAllTags.calledWith(@project.collaberator_refs[0], @project_id).should.equal true + @TagsHandler.removeProjectFromAllTags.calledWith(@project.collaberator_refs[1], @project_id).should.equal true + @TagsHandler.removeProjectFromAllTags.calledWith(@project.readOnly_refs[0], @project_id).should.equal true + @TagsHandler.removeProjectFromAllTags.calledWith(@project.readOnly_refs[1], @project_id).should.equal true + + done() +