Explorar o código

Merge pull request #1220 from sharelatex/spd-open-in-overleaf-file-arrays

Open in Overleaf: Add support for arrays of files

GitOrigin-RevId: 5ef6d1ace6b7c6c041f2846f2f433b39fb137372
Simon Detheridge %!s(int64=7) %!d(string=hai) anos
pai
achega
0097564754

+ 2 - 46
services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee

@@ -8,6 +8,7 @@ _ = require("underscore")
 PublicAccessLevels = require("../Authorization/PublicAccessLevels")
 Errors = require("../Errors/Errors")
 ProjectTokenGenerator = require('./ProjectTokenGenerator')
+ProjectHelper = require('./ProjectHelper')
 
 module.exports = ProjectDetailsHandler =
 	getDetails: (project_id, callback)->
@@ -87,25 +88,7 @@ module.exports = ProjectDetailsHandler =
 			# allUsersProjectNames is returned as a hash {owned: [name1, name2, ...], readOnly: [....]}
 			# collect all of the names and flatten them into a single array
 			projectNameList = _.pluck(_.flatten(_.values(allUsersProjectNames)),'name')
-			# create a set of all project names
-			allProjectNames = new Set()
-			for projectName in projectNameList
-				allProjectNames.add(projectName)
-			isUnique = (x) -> !allProjectNames.has(x)
-			# check if the supplied name is already unique
-			if isUnique(name)
-				return callback(null, name, false)
-			# the name already exists, try adding the user-supplied suffixes to generate a unique name
-			for suffix in suffixes
-				candidateName = ProjectDetailsHandler._addSuffixToProjectName(name, suffix)
-				if isUnique(candidateName)
-					return callback(null, candidateName, true)
-			# if there are no (more) suffixes, use a numeric one
-			uniqueName = ProjectDetailsHandler._addNumericSuffixToProjectName(name, allProjectNames)
-			if uniqueName?
-				callback(null, uniqueName, true)
-			else
-				callback(new Error("Failed to generate a unique name for file: #{name}"))
+			ProjectHelper.ensureNameIsUnique projectNameList, name, suffixes, ProjectDetailsHandler.MAX_PROJECT_NAME_LENGTH, callback
 	
 	fixProjectName: (name) ->
 		if name == "" || !name
@@ -154,30 +137,3 @@ module.exports = ProjectDetailsHandler =
 				Project.update {_id: project_id}, {$set: {tokens: tokens}}, (err) ->
 					return callback(err) if err?
 					callback(null, tokens)
-
-	_addSuffixToProjectName: (name, suffix = '') ->
-		# append the suffix and truncate the project title if needed
-		truncatedLength = ProjectDetailsHandler.MAX_PROJECT_NAME_LENGTH - suffix.length
-		return name.substr(0, truncatedLength) + suffix
-
-	_addNumericSuffixToProjectName: (name, allProjectNames) ->
-		NUMERIC_SUFFIX_MATCH = / \((\d+)\)$/
-		suffixedName = (basename, number) ->
-			suffix = " (#{number})"
-			return basename.substr(0, ProjectDetailsHandler.MAX_PROJECT_NAME_LENGTH - suffix.length) + suffix
-
-		match = name.match(NUMERIC_SUFFIX_MATCH)
-		basename = name
-		n = 1
-		last = allProjectNames.size + n
-
-		if match?
-			basename = name.replace(NUMERIC_SUFFIX_MATCH, '')
-			n = parseInt(match[1])
-
-		while n <= last
-			candidate = suffixedName(basename, n)
-			return candidate unless allProjectNames.has(candidate)
-			n += 1
-
-		return null

+ 47 - 1
services/web/app/coffee/Features/Project/ProjectHelper.coffee

@@ -5,6 +5,52 @@ ENGINE_TO_COMPILER_MAP = {
 	lualatex:     "lualatex"
 }
 
-module.exports =
+module.exports = ProjectHelper =
 	compilerFromV1Engine: (engine) ->
 		return ENGINE_TO_COMPILER_MAP[engine]
+
+	ensureNameIsUnique: (nameList, name, suffixes = [], maxLength, callback = (error, name, changed)->) ->
+		# create a set of all project names
+		allNames = new Set(nameList)
+		isUnique = (x) -> !allNames.has(x)
+		# check if the supplied name is already unique
+		if isUnique(name)
+			return callback(null, name, false)
+		# the name already exists, try adding the user-supplied suffixes to generate a unique name
+		for suffix in suffixes
+			candidateName = ProjectHelper._addSuffixToProjectName(name, suffix, maxLength)
+			if isUnique(candidateName)
+				return callback(null, candidateName, true)
+		# if there are no (more) suffixes, use a numeric one
+		uniqueName = ProjectHelper._addNumericSuffixToProjectName(name, allNames, maxLength)
+		if uniqueName?
+			callback(null, uniqueName, true)
+		else
+			callback(new Error("Failed to generate a unique name for: #{name}"))
+
+	_addSuffixToProjectName: (name, suffix = '', maxLength) ->
+		# append the suffix and truncate the project title if needed
+		truncatedLength = maxLength - suffix.length
+		return name.substr(0, truncatedLength) + suffix
+
+	_addNumericSuffixToProjectName: (name, allProjectNames, maxLength) ->
+		NUMERIC_SUFFIX_MATCH = / \((\d+)\)$/
+		suffixedName = (basename, number) ->
+			suffix = " (#{number})"
+			return basename.substr(0, maxLength - suffix.length) + suffix
+
+		match = name.match(NUMERIC_SUFFIX_MATCH)
+		basename = name
+		n = 1
+		last = allProjectNames.size + n
+
+		if match?
+			basename = name.replace(NUMERIC_SUFFIX_MATCH, '')
+			n = parseInt(match[1])
+
+		while n <= last
+			candidate = suffixedName(basename, n)
+			return candidate unless allProjectNames.has(candidate)
+			n += 1
+
+		return null

+ 0 - 2
services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee

@@ -102,8 +102,6 @@ describe 'ProjectDetailsHandler', ->
 				@ProjectModel.update.calledWith({_id:@project_id}, {description:@description}).should.equal true
 				done()
 
-
-
 	describe "renameProject", ->
 		beforeEach ->
 			@handler.validateProjectName = sinon.stub().yields()

+ 3 - 0
services/web/test/unit/coffee/Project/ProjectHelperTests.coffee

@@ -21,3 +21,6 @@ describe "ProjectHelper", ->
 
 		it "returns the correct engine for lualatex", ->
 			expect(@ProjectHelper.compilerFromV1Engine('lualatex')).to.equal 'lualatex'
+
+	# describe "ensureNameIsUnique", ->
+		# see tests for: ProjectDetailsHandler.ensureProjectNameIsUnique, which calls here.