Project.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. const mongoose = require('../infrastructure/Mongoose')
  2. const _ = require('lodash')
  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. {
  25. name: { type: String, default: 'new project' },
  26. lastUpdated: {
  27. type: Date,
  28. default() {
  29. return new Date()
  30. },
  31. },
  32. lastUpdatedBy: { type: ObjectId, ref: 'User' },
  33. lastOpened: { type: Date },
  34. active: { type: Boolean, default: true },
  35. owner_ref: { type: ObjectId, ref: 'User' },
  36. collaberator_refs: [{ type: ObjectId, ref: 'User' }],
  37. reviewer_refs: [{ type: ObjectId, ref: 'User' }],
  38. readOnly_refs: [{ type: ObjectId, ref: 'User' }],
  39. pendingEditor_refs: [{ type: ObjectId, ref: 'User' }],
  40. pendingReviewer_refs: [{ type: ObjectId, ref: 'User' }],
  41. rootDoc_id: { type: ObjectId },
  42. rootFolder: [FolderSchema],
  43. mainBibliographyDoc_id: { type: ObjectId },
  44. version: { type: Number }, // incremented for every change in the project structure (folders and filenames)
  45. publicAccesLevel: { type: String, default: 'private' },
  46. compiler: { type: String, default: 'pdflatex' },
  47. spellCheckLanguage: { type: String, default: 'en' },
  48. deletedByExternalDataSource: { type: Boolean, default: false },
  49. description: { type: String, default: '' },
  50. archived: { type: Schema.Types.Mixed },
  51. trashed: [{ type: ObjectId, ref: 'User' }],
  52. deletedDocs: [DeletedDocSchema],
  53. deletedFiles: [DeletedFileSchema],
  54. imageName: { type: String },
  55. brandVariationId: { type: String },
  56. track_changes: { type: Object },
  57. tokens: {
  58. readOnly: {
  59. type: String,
  60. index: {
  61. unique: true,
  62. partialFilterExpression: { 'tokens.readOnly': { $exists: true } },
  63. },
  64. },
  65. readAndWrite: {
  66. type: String,
  67. index: {
  68. unique: true,
  69. partialFilterExpression: { 'tokens.readAndWrite': { $exists: true } },
  70. },
  71. },
  72. readAndWritePrefix: {
  73. type: String,
  74. index: {
  75. unique: true,
  76. partialFilterExpression: {
  77. 'tokens.readAndWritePrefix': { $exists: true },
  78. },
  79. },
  80. },
  81. },
  82. tokenAccessReadOnly_refs: [{ type: ObjectId, ref: 'User' }],
  83. tokenAccessReadAndWrite_refs: [{ type: ObjectId, ref: 'User' }],
  84. fromV1TemplateId: { type: Number },
  85. fromV1TemplateVersionId: { type: Number },
  86. overleaf: {
  87. id: { type: Number },
  88. imported_at_ver_id: { type: Number },
  89. token: { type: String },
  90. read_token: { type: String },
  91. history: {
  92. id: { type: Schema.Types.Mixed },
  93. display: { type: Boolean },
  94. upgradedAt: { type: Date },
  95. allowDowngrade: { type: Boolean },
  96. zipFileArchivedInProject: { type: Boolean },
  97. rangesSupportEnabled: { type: Boolean },
  98. },
  99. },
  100. collabratecUsers: [
  101. {
  102. user_id: { type: ObjectId, ref: 'User' },
  103. collabratec_document_id: { type: String },
  104. collabratec_privategroup_id: { type: String },
  105. added_at: {
  106. type: Date,
  107. default() {
  108. return new Date()
  109. },
  110. },
  111. },
  112. ],
  113. deferredTpdsFlushCounter: { type: Number },
  114. },
  115. { minimize: false }
  116. )
  117. ProjectSchema.statics.getProject = function (projectOrId, fields, callback) {
  118. if (projectOrId._id != null) {
  119. callback(null, projectOrId)
  120. } else {
  121. try {
  122. // eslint-disable-next-line no-new
  123. new ConcreteObjectId(projectOrId.toString())
  124. } catch (e) {
  125. return callback(new Errors.NotFoundError(e.message))
  126. }
  127. this.findById(projectOrId, fields, callback)
  128. }
  129. }
  130. function applyToAllFilesRecursivly(folder, fun) {
  131. _.forEach(folder.fileRefs, file => fun(file))
  132. _.forEach(folder.folders, folder => applyToAllFilesRecursivly(folder, fun))
  133. }
  134. ProjectSchema.statics.applyToAllFilesRecursivly = applyToAllFilesRecursivly
  135. exports.Project = mongoose.model('Project', ProjectSchema)
  136. exports.ProjectSchema = ProjectSchema