nbd-app
Version:
🚀 CLI tool to scaffold full-stack authentication starter projects with React, Node.js, and multiple auth providers (Email, Google, and more)
36 lines (31 loc) • 1.44 kB
JavaScript
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const config = require('../config');
const userSchema = new mongoose.Schema({
username: { type: String, required: [true, 'Username is required'], unique: true, trim: true, minlength: 3, maxlength: 20 },
email: { type: String, required: [true, 'Email is required'], unique: true, trim: true, lowercase: true, match: [/^\S+@\S+\.\S+$/, 'Please provide a valid email address'] },
password: { type: String, required: [true, 'Password is required'], minlength: 6, select: false },
avatar: { type: String, default: "" }, // <-- avatar field for image URL
createdAt: { type: Date, default: Date.now },
// Email verification fields:
isVerified: { type: Boolean, default: false },
emailVerificationToken: { type: String },
emailVerificationExpires: { type: Date },
resetPasswordToken: { type: String },
resetPasswordExpires: { type: Date },
});
userSchema.pre('save', async function (next) {
if (!this.isModified('password')) return next();
try {
const salt = await bcrypt.genSalt(config.bcrypt.saltRounds);
this.password = await bcrypt.hash(this.password, salt);
next();
} catch (error) {
next(error);
}
});
userSchema.methods.comparePassword = async function (candidatePassword) {
return await bcrypt.compare(candidatePassword, this.password);
};
const User = mongoose.model('User', userSchema);
module.exports = User;