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; } const UserSchema = new Schema({ 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 { return bcrypt.compare(candidatePassword, this.password); }; export const User = mongoose.model('User', UserSchema);