ProjectEditorHandler.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /* eslint-disable
  2. max-len,
  3. */
  4. // TODO: This file was created by bulk-decaffeinate.
  5. // Fix any style issues and re-enable lint.
  6. /*
  7. * decaffeinate suggestions:
  8. * DS101: Remove unnecessary use of Array.from
  9. * DS102: Remove unnecessary code created because of implicit returns
  10. * DS205: Consider reworking code to avoid use of IIFEs
  11. * DS207: Consider shorter variations of null checks
  12. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  13. */
  14. let ProjectEditorHandler
  15. const _ = require('underscore')
  16. const Path = require('path')
  17. module.exports = ProjectEditorHandler = {
  18. trackChangesAvailable: false,
  19. buildProjectModelView(project, members, invites) {
  20. let owner, ownerFeatures
  21. if (!Array.isArray(project.deletedDocs)) {
  22. project.deletedDocs = []
  23. }
  24. project.deletedDocs.forEach(doc => {
  25. // The frontend does not use this field.
  26. delete doc.deletedAt
  27. })
  28. const result = {
  29. _id: project._id,
  30. name: project.name,
  31. rootDoc_id: project.rootDoc_id,
  32. rootFolder: [this.buildFolderModelView(project.rootFolder[0])],
  33. publicAccesLevel: project.publicAccesLevel,
  34. dropboxEnabled: !!project.existsInDropbox,
  35. compiler: project.compiler,
  36. description: project.description,
  37. spellCheckLanguage: project.spellCheckLanguage,
  38. deletedByExternalDataSource: project.deletedByExternalDataSource || false,
  39. deletedDocs: project.deletedDocs,
  40. members: [],
  41. invites,
  42. tokens: project.tokens,
  43. imageName:
  44. project.imageName != null ? Path.basename(project.imageName) : undefined
  45. }
  46. if (result.invites == null) {
  47. result.invites = []
  48. }
  49. ;({ owner, ownerFeatures, members } = this.buildOwnerAndMembersViews(
  50. members
  51. ))
  52. result.owner = owner
  53. result.members = members
  54. result.features = _.defaults(ownerFeatures || {}, {
  55. collaborators: -1, // Infinite
  56. versioning: false,
  57. dropbox: false,
  58. compileTimeout: 60,
  59. compileGroup: 'standard',
  60. templates: false,
  61. references: false,
  62. referencesSearch: false,
  63. mendeley: false,
  64. trackChanges: false,
  65. trackChangesVisible: ProjectEditorHandler.trackChangesAvailable
  66. })
  67. // Originally these two feature flags were both signalled by the now-deprecated `references` flag.
  68. // For older users, the presence of the `references` feature flag should still turn on these features.
  69. result.features.referencesSearch =
  70. result.features.referencesSearch || result.features.references
  71. result.features.mendeley =
  72. result.features.mendeley || result.features.references
  73. return result
  74. },
  75. buildOwnerAndMembersViews(members) {
  76. let owner = null
  77. let ownerFeatures = null
  78. const filteredMembers = []
  79. for (let member of Array.from(members || [])) {
  80. if (member.privilegeLevel === 'owner') {
  81. ownerFeatures = member.user.features
  82. owner = this.buildUserModelView(member.user, 'owner')
  83. } else {
  84. filteredMembers.push(
  85. this.buildUserModelView(member.user, member.privilegeLevel)
  86. )
  87. }
  88. }
  89. return {
  90. owner,
  91. ownerFeatures,
  92. members: filteredMembers
  93. }
  94. },
  95. buildUserModelView(user, privileges) {
  96. return {
  97. _id: user._id,
  98. first_name: user.first_name,
  99. last_name: user.last_name,
  100. email: user.email,
  101. privileges,
  102. signUpDate: user.signUpDate
  103. }
  104. },
  105. buildFolderModelView(folder) {
  106. let file
  107. const fileRefs = _.filter(folder.fileRefs || [], file => file != null)
  108. return {
  109. _id: folder._id,
  110. name: folder.name,
  111. folders: Array.from(folder.folders || []).map(childFolder =>
  112. this.buildFolderModelView(childFolder)
  113. ),
  114. fileRefs: (() => {
  115. const result = []
  116. for (file of Array.from(fileRefs)) {
  117. result.push(this.buildFileModelView(file))
  118. }
  119. return result
  120. })(),
  121. docs: Array.from(folder.docs || []).map(doc =>
  122. this.buildDocModelView(doc)
  123. )
  124. }
  125. },
  126. buildFileModelView(file) {
  127. return {
  128. _id: file._id,
  129. name: file.name,
  130. linkedFileData: file.linkedFileData,
  131. created: file.created
  132. }
  133. },
  134. buildDocModelView(doc) {
  135. return {
  136. _id: doc._id,
  137. name: doc.name
  138. }
  139. }
  140. }