Merge pull request #1024 from sharelatex/bg-avoid-duplicate-project-names

avoid duplicate project names for templates and zips
This commit is contained in:
Brian Gough 2018-10-18 13:51:05 +01:00 committed by GitHub
commit c6ec31c773
4 changed files with 23 additions and 11 deletions

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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)