| import mongoose, { Schema, Document } from 'mongoose'; | |
| import bcrypt from 'bcryptjs'; | |
| export interface IUser extends Document { | |
| email: string; | |
| password: string; | |
| subscription: 'free' | 'starter' | 'creator' | 'studio' | 'custom'; | |
| videosGenerated: number; | |
| presets: mongoose.Types.ObjectId[]; | |
| role: 'user' | 'admin'; | |
| createdAt: Date; | |
| comparePassword(candidatePassword: string): Promise<boolean>; | |
| } | |
| const UserSchema = new Schema<IUser>({ | |
| email: { | |
| type: String, | |
| required: true, | |
| unique: true, | |
| lowercase: true, | |
| trim: true, | |
| }, | |
| password: { | |
| type: String, | |
| required: true, | |
| minlength: 8, | |
| }, | |
| subscription: { | |
| type: String, | |
| enum: ['free', 'starter', 'creator', 'studio', 'custom'], | |
| default: 'free', | |
| }, | |
| videosGenerated: { | |
| type: Number, | |
| default: 0, | |
| }, | |
| presets: [{ | |
| type: Schema.Types.ObjectId, | |
| ref: 'Preset', | |
| }], | |
| role: { | |
| type: String, | |
| enum: ['user', 'admin'], | |
| default: 'user', | |
| }, | |
| createdAt: { | |
| type: Date, | |
| default: Date.now, | |
| }, | |
| }); | |
| UserSchema.pre('save', async function (next) { | |
| if (!this.isModified('password')) return next(); | |
| const salt = await bcrypt.genSalt(12); | |
| this.password = await bcrypt.hash(this.password, salt); | |
| next(); | |
| }); | |
| UserSchema.methods.comparePassword = async function ( | |
| candidatePassword: string | |
| ): Promise<boolean> { | |
| return bcrypt.compare(candidatePassword, this.password); | |
| }; | |
| export const User = mongoose.model<IUser>('User', UserSchema); | |