diff --git a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee index 4f3f9b6b1e..c1178dc766 100644 --- a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee @@ -67,6 +67,13 @@ module.exports = ProjectDetailsHandler = else return callback() + generateUniqueName: (user_id, name, suffixes = [], callback = (error, newName) -> ) -> + if arguments.length is 3 && typeof suffixes is 'function' # make suffixes an optional argument + callback = suffixes + suffixes = [] + timestamp = new Date().toISOString().replace(/T(\d+):(\d+):(\d+)\..*/,' $1$2$3') # strip out unwanted characters + ProjectDetailsHandler.ensureProjectNameIsUnique user_id, name, suffixes.concat(" (#{timestamp})"), callback + _addSuffixToProjectName: (name, suffix = '') -> # append the suffix and truncate the project title if needed truncatedLength = ProjectDetailsHandler.MAX_PROJECT_NAME_LENGTH - suffix.length @@ -82,7 +89,7 @@ module.exports = ProjectDetailsHandler = return callback(error) if error? # allUsersProjectNames is returned as a hash {owned: [name1, name2, ...], readOnly: [....]} # collect all of the names and flatten them into a single array - projectNameList = _.flatten(_.values(allUsersProjectNames)) + projectNameList = _.pluck(_.flatten(_.values(allUsersProjectNames)),'name') # create a set of all project names allProjectNames = new Set() for projectName in projectNameList diff --git a/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee b/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee index 127c6bc94f..4a1dee2d9b 100644 --- a/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee +++ b/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee @@ -4,16 +4,19 @@ ArchiveManager = require "./ArchiveManager" FileSystemImportManager = require "./FileSystemImportManager" ProjectCreationHandler = require "../Project/ProjectCreationHandler" ProjectRootDocManager = require "../Project/ProjectRootDocManager" +ProjectDetailsHandler = require "../Project/ProjectDetailsHandler" module.exports = ProjectUploadHandler = - createProjectFromZipArchive: (owner_id, name, zipPath, callback = (error, project) ->) -> - ProjectCreationHandler.createBlankProject owner_id, name, (error, project) => + createProjectFromZipArchive: (owner_id, proposedName, zipPath, callback = (error, project) ->) -> + ProjectDetailsHandler.generateUniqueName owner_id, proposedName, (error, name) => return callback(error) if error? - @insertZipArchiveIntoFolder owner_id, project._id, project.rootFolder[0]._id, zipPath, (error) -> + ProjectCreationHandler.createBlankProject owner_id, name, (error, project) => return callback(error) if error? - ProjectRootDocManager.setRootDocAutomatically project._id, (error) -> + @insertZipArchiveIntoFolder owner_id, project._id, project.rootFolder[0]._id, zipPath, (error) -> return callback(error) if error? - callback(error, project) + ProjectRootDocManager.setRootDocAutomatically project._id, (error) -> + return callback(error) if error? + callback(error, project) insertZipArchiveIntoFolder: (owner_id, project_id, folder_id, path, callback = (error) ->) -> destination = @_getDestinationDirectory path diff --git a/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee b/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee index 0dd7d11ac8..2ccad8ae94 100644 --- a/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee @@ -158,11 +158,11 @@ describe 'ProjectDetailsHandler', -> describe "ensureProjectNameIsUnique", -> beforeEach -> @result = { - owned: ["name", "name1", "name11"] - readAndWrite: ["name2", "name22"] - readOnly: ["name3", "name33"] - tokenReadAndWrite: ["name4", "name44"] - tokenReadOnly: ["name5", "name55", "x".repeat(15)] + owned: [{_id: 1, name:"name"}, {_id: 2, name: "name1"}, {_id: 3, name: "name11"}] + readAndWrite: [{_id: 4, name:"name2"}, {_id: 5, name:"name22"}] + readOnly: [{_id:6, name:"name3"}, {_id:7, name: "name33"}] + tokenReadAndWrite: [{_id:8, name:"name4"}, {_id:9, name:"name44"}] + tokenReadOnly: [{_id:10, name:"name5"}, {_id:11, name:"name55"}, {_id:12, name:"x".repeat(15)}] } @ProjectGetter.findAllUsersProjects = sinon.stub().callsArgWith(2, null, @result) diff --git a/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee b/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee index d4571f0474..8edf700252 100644 --- a/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee +++ b/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee @@ -15,6 +15,7 @@ describe "ProjectUploadManager", -> "./ArchiveManager" : @ArchiveManager = {} "../Project/ProjectCreationHandler" : @ProjectCreationHandler = {} "../Project/ProjectRootDocManager" : @ProjectRootDocManager = {} + "../Project/ProjectDetailsHandler" : @ProjectDetailsHandler = {} "rimraf" : @rimraf = sinon.stub().callsArg(1) describe "createProjectFromZipArchive", -> @@ -26,6 +27,7 @@ describe "ProjectUploadManager", -> @project = _id: @project_id rootFolder: [ _id: @root_folder_id ] + @ProjectDetailsHandler.generateUniqueName = sinon.stub().callsArgWith(2, null, @name) @ProjectCreationHandler.createBlankProject = sinon.stub().callsArgWith(2, null, @project) @ProjectUploadManager.insertZipArchiveIntoFolder = sinon.stub().callsArg(4) @ProjectRootDocManager.setRootDocAutomatically = sinon.stub().callsArg(1)