Project = require('./Project').Project Settings = require 'settings-sharelatex' _ = require('underscore') mongoose = require('mongoose') uuid = require('uuid') Schema = mongoose.Schema ObjectId = Schema.ObjectId UserSchema = new Schema email : {type : String, default : ''} emails: [{ email: { type : String, default : '' }, reversedHostname: { type : String, default : '' }, createdAt: { type : Date, default: () -> new Date() }, confirmedAt: { type: Date } }], first_name : {type : String, default : ''} last_name : {type : String, default : ''} role : {type : String, default : ''} institution : {type : String, default : ''} hashedPassword : String isAdmin : {type : Boolean, default : false} signUpDate : {type : Date, default: () -> new Date() } lastLoggedIn : {type : Date} lastLoginIp : {type : String, default : ''} loginCount : {type : Number, default: 0} holdingAccount : {type : Boolean, default: false} ace : { mode : {type : String, default: 'none'} theme : {type : String, default: 'textmate'} overallTheme : {type: String, default: "" } fontSize : {type : Number, default:'12'} autoComplete : {type : Boolean, default: true} autoPairDelimiters : {type : Boolean, default: true} spellCheckLanguage : {type : String, default: "en"} pdfViewer : {type : String, default: "pdfjs"} syntaxValidation : {type : Boolean} fontFamily : {type : String} lineHeight : {type : String} } features : { collaborators: { type:Number, default: Settings.defaultFeatures.collaborators } versioning: { type:Boolean, default: Settings.defaultFeatures.versioning } dropbox: { type:Boolean, default: Settings.defaultFeatures.dropbox } github: { type:Boolean, default: Settings.defaultFeatures.github } compileTimeout: { type:Number, default: Settings.defaultFeatures.compileTimeout } compileGroup: { type:String, default: Settings.defaultFeatures.compileGroup } templates: { type:Boolean, default: Settings.defaultFeatures.templates } references: { type:Boolean, default: Settings.defaultFeatures.references } trackChanges: { type:Boolean, default: Settings.defaultFeatures.trackChanges } mendeley: { type:Boolean, default: Settings.defaultFeatures.mendeley } referencesSearch: { type:Boolean, default: Settings.defaultFeatures.referencesSearch } } referal_id : {type:String, default:() -> uuid.v4().split("-")[0]} refered_users: [ type:ObjectId, ref:'User' ] refered_user_count: { type:Number, default: 0 } subscription: recurlyToken : String freeTrialExpiresAt: Date freeTrialDowngraded: Boolean freeTrialPlanCode: String # This is poorly named. It does not directly correspond # to whether the user has has a free trial, but rather # whether they should be allowed one in the future. # For example, a user signing up directly for a paid plan # has this set to true, despite never having had a free trial hadFreeTrial: {type: Boolean, default: false} refProviders: { mendeley: Boolean # coerce the refProviders values to Booleans zotero: Boolean } betaProgram: { type:Boolean, default: false} overleaf: id: { type: Number } accessToken: { type: String } refreshToken: { type: String } awareOfV2: { type:Boolean, default: false } conn = mongoose.createConnection(Settings.mongo.url, { server: {poolSize: Settings.mongo.poolSize || 10}, config: {autoIndex: false} }) User = conn.model('User', UserSchema) model = mongoose.model 'User', UserSchema exports.User = User