User.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. // when auto-merged from SL and must-reconfirm is set, we may end up using
  93. // `sharelatexHashedPassword` to recover accounts...
  94. sharelatexHashedPassword: String,
  95. must_reconfirm: { type: Boolean, default: false },
  96. referal_id: {
  97. type: String,
  98. default() {
  99. return uuid.v4().split('-')[0]
  100. }
  101. },
  102. refered_users: [{ type: ObjectId, ref: 'User' }],
  103. refered_user_count: { type: Number, default: 0 },
  104. refProviders: {
  105. mendeley: Boolean, // coerce the refProviders values to Booleans
  106. zotero: Boolean
  107. },
  108. betaProgram: { type: Boolean, default: false },
  109. overleaf: {
  110. id: { type: Number },
  111. accessToken: { type: String },
  112. refreshToken: { type: String }
  113. },
  114. awareOfV2: { type: Boolean, default: false },
  115. samlIdentifiers: { type: Array, default: [] },
  116. thirdPartyIdentifiers: { type: Array, default: [] },
  117. migratedAt: { type: Date }
  118. })
  119. exports.User = mongoose.model('User', UserSchema)
  120. exports.UserSchema = UserSchema