User.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. const Settings = require('settings-sharelatex')
  2. const mongoose = require('../infrastructure/Mongoose')
  3. const uuid = require('uuid')
  4. const { Schema } = mongoose
  5. const { ObjectId } = Schema
  6. // See https://stackoverflow.com/questions/386294/what-is-the-maximum-length-of-a-valid-email-address/574698#574698
  7. const MAX_EMAIL_LENGTH = 254
  8. const UserSchema = new Schema({
  9. email: { type: String, default: '', maxlength: MAX_EMAIL_LENGTH },
  10. emails: [
  11. {
  12. email: { type: String, default: '', maxlength: MAX_EMAIL_LENGTH },
  13. reversedHostname: { type: String, default: '' },
  14. createdAt: {
  15. type: Date,
  16. default() {
  17. return new Date()
  18. }
  19. },
  20. confirmedAt: { type: Date },
  21. samlProviderId: { type: String }
  22. }
  23. ],
  24. first_name: { type: String, default: '' },
  25. last_name: { type: String, default: '' },
  26. role: { type: String, default: '' },
  27. institution: { type: String, default: '' },
  28. hashedPassword: String,
  29. isAdmin: { type: Boolean, default: false },
  30. staffAccess: {
  31. publisherMetrics: { type: Boolean, default: false },
  32. publisherManagement: { type: Boolean, default: false },
  33. institutionMetrics: { type: Boolean, default: false },
  34. institutionManagement: { type: Boolean, default: false },
  35. groupMetrics: { type: Boolean, default: false },
  36. groupManagement: { type: Boolean, default: false },
  37. adminMetrics: { type: Boolean, default: false }
  38. },
  39. signUpDate: {
  40. type: Date,
  41. default() {
  42. return new Date()
  43. }
  44. },
  45. lastLoggedIn: { type: Date },
  46. lastLoginIp: { type: String, default: '' },
  47. loginCount: { type: Number, default: 0 },
  48. holdingAccount: { type: Boolean, default: false },
  49. ace: {
  50. mode: { type: String, default: 'none' },
  51. theme: { type: String, default: 'textmate' },
  52. overallTheme: { type: String, default: '' },
  53. fontSize: { type: Number, default: '12' },
  54. autoComplete: { type: Boolean, default: true },
  55. autoPairDelimiters: { type: Boolean, default: true },
  56. spellCheckLanguage: { type: String, default: 'en' },
  57. pdfViewer: { type: String, default: 'pdfjs' },
  58. syntaxValidation: { type: Boolean },
  59. fontFamily: { type: String },
  60. lineHeight: { type: String }
  61. },
  62. features: {
  63. collaborators: {
  64. type: Number,
  65. default: Settings.defaultFeatures.collaborators
  66. },
  67. versioning: { type: Boolean, default: Settings.defaultFeatures.versioning },
  68. dropbox: { type: Boolean, default: Settings.defaultFeatures.dropbox },
  69. github: { type: Boolean, default: Settings.defaultFeatures.github },
  70. gitBridge: { type: Boolean, default: Settings.defaultFeatures.gitBridge },
  71. compileTimeout: {
  72. type: Number,
  73. default: Settings.defaultFeatures.compileTimeout
  74. },
  75. compileGroup: {
  76. type: String,
  77. default: Settings.defaultFeatures.compileGroup
  78. },
  79. templates: { type: Boolean, default: Settings.defaultFeatures.templates },
  80. references: { type: Boolean, default: Settings.defaultFeatures.references },
  81. trackChanges: {
  82. type: Boolean,
  83. default: Settings.defaultFeatures.trackChanges
  84. },
  85. mendeley: { type: Boolean, default: Settings.defaultFeatures.mendeley },
  86. zotero: { type: Boolean, default: Settings.defaultFeatures.zotero },
  87. referencesSearch: {
  88. type: Boolean,
  89. default: Settings.defaultFeatures.referencesSearch
  90. }
  91. },
  92. featuresOverrides: [
  93. {
  94. createdAt: {
  95. type: Date,
  96. default() {
  97. return new Date()
  98. }
  99. },
  100. expiresAt: { type: Date },
  101. note: { type: String },
  102. features: {
  103. collaborators: { type: Number },
  104. versioning: { type: Boolean },
  105. dropbox: { type: Boolean },
  106. github: { type: Boolean },
  107. gitBridge: { type: Boolean },
  108. compileTimeout: { type: Number },
  109. compileGroup: { type: String },
  110. templates: { type: Boolean },
  111. trackChanges: { type: Boolean },
  112. mendeley: { type: Boolean },
  113. zotero: { type: Boolean },
  114. referencesSearch: { type: Boolean }
  115. }
  116. }
  117. ],
  118. // when auto-merged from SL and must-reconfirm is set, we may end up using
  119. // `sharelatexHashedPassword` to recover accounts...
  120. sharelatexHashedPassword: String,
  121. must_reconfirm: { type: Boolean, default: false },
  122. referal_id: {
  123. type: String,
  124. default() {
  125. return uuid.v4().split('-')[0]
  126. }
  127. },
  128. refered_users: [{ type: ObjectId, ref: 'User' }],
  129. refered_user_count: { type: Number, default: 0 },
  130. refProviders: {
  131. mendeley: Boolean, // coerce the refProviders values to Booleans
  132. zotero: Boolean
  133. },
  134. betaProgram: { type: Boolean, default: false },
  135. overleaf: {
  136. id: { type: Number },
  137. accessToken: { type: String },
  138. refreshToken: { type: String }
  139. },
  140. awareOfV2: { type: Boolean, default: false },
  141. samlIdentifiers: { type: Array, default: [] },
  142. thirdPartyIdentifiers: { type: Array, default: [] },
  143. migratedAt: { type: Date }
  144. })
  145. exports.User = mongoose.model('User', UserSchema)
  146. exports.UserSchema = UserSchema