get-express-starter
Version:
Get production ready express boilerplate with a single command
62 lines (57 loc) • 1.44 kB
text/typescript
import type { IUser, PaginatedModel } from '@/types';
import { hashPassword } from '@/utils/passwordHash';
import { Schema, model } from 'mongoose';
import validator from 'validator';
import paginate from './plugins/paginate';
import toJSON from './plugins/toJSON';
const userSchema = new Schema<IUser>(
{
name: {
type: String,
trim: true,
required: true,
},
email: {
type: String,
unique: true,
sparse: true,
trim: true,
lowercase: true,
validate(value: string) {
if (!validator.isEmail(value)) {
throw new Error('Invalid email');
}
},
},
password: {
type: String,
trim: true,
required: true,
minlength: 8,
validate: {
validator: (value: string) => /\d/.test(value) && /[a-zA-Z]/.test(value),
message: 'Password must contain at least one letter and one number',
},
},
role: {
type: String,
enum: ['user', 'admin'],
default: 'user',
},
isEmailVerified: {
type: Boolean,
default: false,
},
},
{ timestamps: true },
);
userSchema.plugin(paginate);
userSchema.plugin(toJSON);
userSchema.pre('save', async function (next) {
if (this.isModified('password')) {
this.password = await hashPassword(this.password);
}
next();
});
const User = model<IUser, PaginatedModel<IUser>>('User', userSchema);
export default User;