ProjectEditorHandler.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. let ProjectEditorHandler
  2. const _ = require('lodash')
  3. const Path = require('path')
  4. const Features = require('../../infrastructure/Features')
  5. module.exports = ProjectEditorHandler = {
  6. trackChangesAvailable: false,
  7. buildProjectModelView(
  8. project,
  9. ownerMember,
  10. members,
  11. invites,
  12. isRestrictedUser
  13. ) {
  14. const result = {
  15. _id: project._id,
  16. name: project.name,
  17. rootDoc_id: project.rootDoc_id,
  18. mainBibliographyDoc_id: project.mainBibliographyDoc_id,
  19. rootFolder: [this.buildFolderModelView(project.rootFolder[0])],
  20. publicAccesLevel: project.publicAccesLevel,
  21. dropboxEnabled: !!project.existsInDropbox,
  22. compiler: project.compiler,
  23. description: project.description,
  24. spellCheckLanguage: project.spellCheckLanguage,
  25. deletedByExternalDataSource: project.deletedByExternalDataSource || false,
  26. imageName:
  27. project.imageName != null
  28. ? Path.basename(project.imageName)
  29. : undefined,
  30. }
  31. if (isRestrictedUser) {
  32. result.owner = { _id: project.owner_ref }
  33. result.members = []
  34. result.invites = []
  35. } else {
  36. result.owner = this.buildUserModelView(ownerMember)
  37. result.members = members.map(this.buildUserModelView)
  38. result.invites = this.buildInvitesView(invites)
  39. }
  40. result.features = _.defaults(ownerMember?.user?.features || {}, {
  41. collaborators: -1, // Infinite
  42. versioning: false,
  43. dropbox: false,
  44. compileTimeout: 60,
  45. compileGroup: 'standard',
  46. templates: false,
  47. references: false,
  48. referencesSearch: false,
  49. mendeley: false,
  50. trackChanges: false,
  51. trackChangesVisible: ProjectEditorHandler.trackChangesAvailable,
  52. symbolPalette: false,
  53. })
  54. if (result.features.trackChanges) {
  55. result.trackChangesState = project.track_changes || false
  56. }
  57. // Originally these two feature flags were both signalled by the now-deprecated `references` flag.
  58. // For older users, the presence of the `references` feature flag should still turn on these features.
  59. result.features.referencesSearch =
  60. result.features.referencesSearch || result.features.references
  61. result.features.mendeley =
  62. result.features.mendeley || result.features.references
  63. return result
  64. },
  65. buildUserModelView(member) {
  66. const user = member.user
  67. return {
  68. _id: user._id,
  69. first_name: user.first_name,
  70. last_name: user.last_name,
  71. email: user.email,
  72. privileges: member.privilegeLevel,
  73. signUpDate: user.signUpDate,
  74. pendingEditor: member.pendingEditor,
  75. pendingReviewer: member.pendingReviewer,
  76. }
  77. },
  78. buildFolderModelView(folder) {
  79. const fileRefs = _.filter(folder.fileRefs || [], file => file != null)
  80. return {
  81. _id: folder._id,
  82. name: folder.name,
  83. folders: (folder.folders || []).map(childFolder =>
  84. this.buildFolderModelView(childFolder)
  85. ),
  86. fileRefs: fileRefs.map(file => this.buildFileModelView(file)),
  87. docs: (folder.docs || []).map(doc => this.buildDocModelView(doc)),
  88. }
  89. },
  90. buildFileModelView(file) {
  91. const additionalFileProperties = {}
  92. if (Features.hasFeature('project-history-blobs')) {
  93. additionalFileProperties.hash = file.hash
  94. }
  95. return {
  96. _id: file._id,
  97. name: file.name,
  98. linkedFileData: file.linkedFileData,
  99. created: file.created,
  100. ...additionalFileProperties,
  101. }
  102. },
  103. buildDocModelView(doc) {
  104. return {
  105. _id: doc._id,
  106. name: doc.name,
  107. }
  108. },
  109. buildInvitesView(invites) {
  110. if (invites == null) {
  111. return []
  112. }
  113. return invites.map(invite => _.pick(invite, ['_id', 'email', 'privileges']))
  114. },
  115. }