Project.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. const mongoose = require('../infrastructure/Mongoose')
  2. const _ = require('underscore')
  3. const { FolderSchema } = require('./Folder')
  4. const Errors = require('../Features/Errors/Errors')
  5. const concreteObjectId = mongoose.Types.ObjectId
  6. const { Schema } = mongoose
  7. const { ObjectId } = Schema
  8. const DeletedDocSchema = new Schema({
  9. name: String,
  10. deletedAt: { type: Date },
  11. })
  12. const DeletedFileSchema = new Schema({
  13. name: String,
  14. created: {
  15. type: Date,
  16. },
  17. linkedFileData: { type: Schema.Types.Mixed },
  18. hash: {
  19. type: String,
  20. },
  21. deletedAt: { type: Date },
  22. })
  23. const ProjectSchema = new Schema({
  24. name: { type: String, default: 'new project' },
  25. lastUpdated: {
  26. type: Date,
  27. default() {
  28. return new Date()
  29. },
  30. },
  31. lastUpdatedBy: { type: ObjectId, ref: 'User' },
  32. lastOpened: { type: Date },
  33. active: { type: Boolean, default: true },
  34. owner_ref: { type: ObjectId, ref: 'User' },
  35. collaberator_refs: [{ type: ObjectId, ref: 'User' }],
  36. readOnly_refs: [{ type: ObjectId, ref: 'User' }],
  37. rootDoc_id: { type: ObjectId },
  38. rootFolder: [FolderSchema],
  39. version: { type: Number }, // incremented for every change in the project structure (folders and filenames)
  40. publicAccesLevel: { type: String, default: 'private' },
  41. compiler: { type: String, default: 'pdflatex' },
  42. spellCheckLanguage: { type: String, default: 'en' },
  43. deletedByExternalDataSource: { type: Boolean, default: false },
  44. description: { type: String, default: '' },
  45. archived: { type: Schema.Types.Mixed },
  46. trashed: [{ type: ObjectId, ref: 'User' }],
  47. deletedDocs: [DeletedDocSchema],
  48. deletedFiles: [DeletedFileSchema],
  49. imageName: { type: String },
  50. brandVariationId: { type: String },
  51. track_changes: { type: Object },
  52. tokens: {
  53. readOnly: {
  54. type: String,
  55. index: {
  56. unique: true,
  57. partialFilterExpression: { 'tokens.readOnly': { $exists: true } },
  58. },
  59. },
  60. readAndWrite: {
  61. type: String,
  62. index: {
  63. unique: true,
  64. partialFilterExpression: { 'tokens.readAndWrite': { $exists: true } },
  65. },
  66. },
  67. readAndWritePrefix: {
  68. type: String,
  69. index: {
  70. unique: true,
  71. partialFilterExpression: {
  72. 'tokens.readAndWritePrefix': { $exists: true },
  73. },
  74. },
  75. },
  76. },
  77. tokenAccessReadOnly_refs: [{ type: ObjectId, ref: 'User' }],
  78. tokenAccessReadAndWrite_refs: [{ type: ObjectId, ref: 'User' }],
  79. fromV1TemplateId: { type: Number },
  80. fromV1TemplateVersionId: { type: Number },
  81. overleaf: {
  82. id: { type: Number },
  83. imported_at_ver_id: { type: Number },
  84. token: { type: String },
  85. read_token: { type: String },
  86. history: {
  87. id: { type: Schema.Types.Mixed },
  88. display: { type: Boolean },
  89. upgradedAt: { type: Date },
  90. allowDowngrade: { type: Boolean },
  91. zipFileArchivedInProject: { type: Boolean },
  92. },
  93. },
  94. collabratecUsers: [
  95. {
  96. user_id: { type: ObjectId, ref: 'User' },
  97. collabratec_document_id: { type: String },
  98. collabratec_privategroup_id: { type: String },
  99. added_at: {
  100. type: Date,
  101. default() {
  102. return new Date()
  103. },
  104. },
  105. },
  106. ],
  107. deferredTpdsFlushCounter: { type: Number },
  108. })
  109. ProjectSchema.statics.getProject = function (projectOrId, fields, callback) {
  110. if (projectOrId._id != null) {
  111. callback(null, projectOrId)
  112. } else {
  113. try {
  114. concreteObjectId(projectOrId.toString())
  115. } catch (e) {
  116. return callback(new Errors.NotFoundError(e.message))
  117. }
  118. this.findById(projectOrId, fields, callback)
  119. }
  120. }
  121. function applyToAllFilesRecursivly(folder, fun) {
  122. _.each(folder.fileRefs, file => fun(file))
  123. _.each(folder.folders, folder => applyToAllFilesRecursivly(folder, fun))
  124. }
  125. ProjectSchema.statics.applyToAllFilesRecursivly = applyToAllFilesRecursivly
  126. exports.Project = mongoose.model('Project', ProjectSchema)
  127. exports.ProjectSchema = ProjectSchema