Project.coffee 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. mongoose = require('mongoose')
  2. Settings = require 'settings-sharelatex'
  3. _ = require('underscore')
  4. FolderSchema = require('./Folder.js').FolderSchema
  5. logger = require('logger-sharelatex')
  6. sanitize = require('sanitizer')
  7. concreteObjectId = require('mongoose').Types.ObjectId
  8. Errors = require "../errors"
  9. Schema = mongoose.Schema
  10. ObjectId = Schema.ObjectId
  11. DeletedDocSchema = new Schema
  12. name: String
  13. ProjectSchema = new Schema
  14. name : {type:String, default:'new project'}
  15. lastUpdated : {type:Date, default: () -> new Date()}
  16. owner_ref : {type:ObjectId, ref:'User'}
  17. collaberator_refs : [ type:ObjectId, ref:'User' ]
  18. readOnly_refs : [ type:ObjectId, ref:'User' ]
  19. rootDoc_id : {type: ObjectId}
  20. rootFolder : [FolderSchema]
  21. publicAccesLevel : {type: String, default: 'private'}
  22. compiler : {type:String, default:'pdflatex'}
  23. spellCheckLanguage : {type:String, default:'en'}
  24. existsInVersioningApi : {type: Boolean, default: false}
  25. deletedByExternalDataSource : {type: Boolean, default: false}
  26. useClsi2 : {type:Boolean, default: true}
  27. description : {type:String, default:''}
  28. archived : { type: Boolean }
  29. deletedDocs : [DeletedDocSchema]
  30. ProjectSchema.statics.getProject = (project_or_id, fields, callback)->
  31. if project_or_id._id?
  32. callback null, project_or_id
  33. else
  34. try
  35. concreteObjectId(project_or_id.toString())
  36. catch e
  37. return callback(new Errors.NotFoundError(e.message))
  38. this.findById project_or_id, fields, callback
  39. ProjectSchema.statics.findPopulatedById = (project_id, callback)->
  40. this.find(_id: project_id )
  41. .populate('collaberator_refs')
  42. .populate('readOnly_refs')
  43. .populate('owner_ref')
  44. .exec (err, projects)->
  45. if err?
  46. logger.err err:err, project_id:project_id, "something went wrong looking for project findPopulatedById"
  47. callback(err)
  48. else if !projects? || projects.length == 0
  49. logger.err project_id:project_id, "something went wrong looking for project findPopulatedById, no project could be found"
  50. callback "not found"
  51. else
  52. callback(null, projects[0])
  53. ProjectSchema.statics.findAllUsersProjects = (user_id, requiredFields, callback)->
  54. this.find {owner_ref:user_id, archived: { $exists: false }}, requiredFields, (err, projects)=>
  55. this.find {collaberator_refs:user_id, archived: { $exists: false }}, requiredFields, (err, collabertions)=>
  56. this.find {readOnly_refs:user_id, archived: { $exists: false }}, requiredFields, (err, readOnlyProjects)=>
  57. callback(err, projects, collabertions, readOnlyProjects)
  58. sanitizeTypeOfElement = (elementType)->
  59. lastChar = elementType.slice -1
  60. if lastChar != "s"
  61. elementType +="s"
  62. if elementType == "files"
  63. elementType = "fileRefs"
  64. return elementType
  65. ProjectSchema.statics.putElement = (project_id, folder_id, element, type, callback)->
  66. type = sanitizeTypeOfElement type
  67. this.findById project_id, (err, project)=>
  68. if err?
  69. callback(err)
  70. if !folder_id?
  71. folder_id = project.rootFolder[0]._id
  72. require('../Features/Project/ProjectLocator').findElement {project:project, element_id:folder_id, type:"folders"}, (err, folder, path)=>
  73. newPath =
  74. fileSystem: "#{path.fileSystem}/#{element.name}"
  75. mongo: path.mongo # TODO: This is not correct
  76. if err?
  77. callback(err)
  78. logger.log project_id: project_id, element_id: element._id, type: type, folder_id: folder_id,
  79. "adding element to project"
  80. id = element._id+''
  81. element._id = concreteObjectId(id)
  82. conditions = _id:project_id
  83. mongopath = "#{path.mongo}.#{type}"
  84. update = "$push":{}
  85. update["$push"][mongopath] = element
  86. this.update conditions, update, {}, (err)->
  87. if(err)
  88. logger.err err: err, project: project, 'error saving in putElement project'
  89. if callback?
  90. callback(err, {path:newPath})
  91. getIndexOf = (searchEntity, id)->
  92. length = searchEntity.length
  93. count = 0
  94. while(count < length)
  95. if searchEntity[count]._id+"" == id+""
  96. return count
  97. count++
  98. applyToAllFilesRecursivly = ProjectSchema.statics.applyToAllFilesRecursivly = (folder, fun)->
  99. _.each folder.fileRefs, (file)->
  100. fun(file)
  101. _.each folder.folders, (folder)->
  102. applyToAllFilesRecursivly(folder, fun)
  103. ProjectSchema.methods.getSafeProjectName = ->
  104. safeProjectName = this.name.replace(new RegExp("\\W", "g"), '_')
  105. return sanitize.escape(safeProjectName)
  106. conn = mongoose.createConnection(Settings.mongo.url, server: poolSize: Settings.mongo.poolSize || 10)
  107. Project = conn.model('Project', ProjectSchema)
  108. mongoose.model 'Project', ProjectSchema
  109. exports.Project = Project
  110. exports.ProjectSchema = ProjectSchema