diff --git a/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee index c4992a29f8..750924beb3 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee @@ -170,7 +170,8 @@ module.exports = ProjectEntityHandler = if project_or_id._id? # project return cb(null, project_or_id) else # id - return ProjectGetter.getProjectWithOnlyFolders project_or_id, cb + # need to retrieve full project structure to check for duplicates + return ProjectGetter.getProject project_or_id, {}, cb getProject (error, project) -> if err? logger.err project_id:project_id, err:err, "error getting project for add doc" @@ -207,7 +208,7 @@ module.exports = ProjectEntityHandler = ProjectEntityHandler.addDoc project_id, null, name, lines, callback addFileWithoutUpdatingHistory: (project_id, folder_id, fileName, path, userId, callback = (error, fileRef, folder_id, path, fileStoreUrl) ->)-> - ProjectGetter.getProjectWithOnlyFolders project_id, (err, project) -> + ProjectGetter.getProject project_id, {}, (err, project) -> if err? logger.err project_id:project_id, err:err, "error getting project for add file" return callback(err) @@ -606,19 +607,32 @@ module.exports = ProjectEntityHandler = newPath = fileSystem: "#{path.fileSystem}/#{element.name}" mongo: path.mongo - id = element._id+'' - element._id = require('mongoose').Types.ObjectId(id) - conditions = _id:project._id - mongopath = "#{path.mongo}.#{type}" - update = "$push":{} - update["$push"][mongopath] = element - logger.log project_id: project._id, element_id: element._id, fileType: type, folder_id: folder_id, mongopath:mongopath, "adding element to project" - Project.findOneAndUpdate conditions, update, {"new": true}, (err, project)-> - if err? - logger.err err: err, project_id: project._id, 'error saving in putElement project' - return callback(err) - callback(err, {path:newPath}, project) + ProjectEntityHandler.checkElementName folder, element.name, (err) => + return callback(err) if err? + id = element._id+'' + element._id = require('mongoose').Types.ObjectId(id) + conditions = _id:project._id + mongopath = "#{path.mongo}.#{type}" + update = "$push":{} + update["$push"][mongopath] = element + logger.log project_id: project._id, element_id: element._id, fileType: type, folder_id: folder_id, mongopath:mongopath, "adding element to project" + Project.findOneAndUpdate conditions, update, {"new": true}, (err, project)-> + if err? + logger.err err: err, project_id: project._id, 'error saving in putElement project' + return callback(err) + callback(err, {path:newPath}, project) + checkElementName: (folder, name, callback = (err) ->) -> + # check if the name is already taken by a doc, file or + # folder. If so, return an error "file already exists". + err = new Errors.InvalidNameError("file already exists") + for doc in folder?.docs or [] + return callback(err) if doc.name is name + for file in folder?.fileRefs or [] + return callback(err) if file.name is name + for folder in folder?.folders or [] + return callback(err) if folder.name is name + callback() confirmFolder = (project, folder_id, callback)-> logger.log folder_id:folder_id, project_id:project._id, "confirming folder in project"