user.js•1.89 kB
/**
* User model
* Stores Facebook user information and tokens
*/
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
// Facebook user information
facebookId: {
type: String,
required: true,
unique: true,
index: true
},
name: {
type: String,
required: true
},
email: {
type: String,
trim: true,
lowercase: true,
index: true
},
picture: {
type: String
},
// Facebook tokens (encrypted)
accessToken: {
type: String,
required: true
},
refreshToken: {
type: String
},
tokenExpiry: {
type: Date
},
// Account status
isActive: {
type: Boolean,
default: true
},
lastLogin: {
type: Date,
default: Date.now
},
// Timestamps
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
}, {
timestamps: true,
toJSON: {
transform: (doc, ret) => {
delete ret.accessToken;
delete ret.refreshToken;
delete ret.__v;
return ret;
}
}
});
// Index for faster queries
userSchema.index({ facebookId: 1 });
userSchema.index({ email: 1 });
userSchema.index({ createdAt: -1 });
/**
* Update last login timestamp
*/
userSchema.methods.updateLastLogin = async function() {
this.lastLogin = Date.now();
return this.save();
};
/**
* Check if user has valid Facebook token
*/
userSchema.methods.hasValidToken = function() {
return this.tokenExpiry && new Date(this.tokenExpiry) > new Date();
};
/**
* Find user by Facebook ID
*/
userSchema.statics.findByFacebookId = function(facebookId) {
return this.findOne({ facebookId });
};
/**
* Find active users
*/
userSchema.statics.findActive = function() {
return this.find({ isActive: true });
};
const User = mongoose.model('User', userSchema);
module.exports = User;