const mongoose = require("mongoose"); const bcrypt = require('bcryptjs'); const userSchema = mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, isActive: { type: Boolean, default: true }, lastLogin: { type: Date }, createdAt: { type: Date, default: Date.now }, dateOfBirth: { type: String}, gender: { type: String }, country: { type: String }, wishlist: [ { productId: { type: mongoose.Schema.Types.ObjectId, ref: "Product" }, name: String, price: Number, category: String, seller: String, stock: Number, image: String, ratings: Number, createdAt: { type: Date, default: Date.now } } ], orders: [ { createdAt: { type: Date, default: Date.now }, amount: Number, subtotal: Number, shipping: Number, tax: Number, discount: Number, status: String, estimatedDelivery: Date, shippingAddress: { fullName: String, email: String, phone: String, address: String, city: String, state: String, zipCode: String, country: String }, paymentMethod: String, preferences: { giftWrapping: Boolean, expressDelivery: Boolean, specialInstructions: String }, orderItems: [ { productId: { type: mongoose.Schema.Types.ObjectId, ref: "Product" }, name: String, price: Number, qty: Number, category: String, seller: String, stock: Number, image: String, ratings: Number } ], } ], reviews: [ { product: { type: mongoose.Schema.Types.ObjectId, ref: "Product" }, rating: { type: Number }, comment: { type: String }, createdAt: { type: Date, default: Date.now } } ], carts: [ { createdAt: { type: Date, default: Date.now }, amount: Number, status: String, cartItems: [ { productId: { type: mongoose.Schema.Types.ObjectId, ref: "Product" }, name: String, price: Number, qty: Number, category: String, seller: String, stock: Number, image: String, ratings: Number } ], } ], }); userSchema.pre('save', async function(next) { if (!this.isModified('password')) { next(); } const salt = await bcrypt.genSalt(10); this.password = await bcrypt.hash(this.password, salt); }); userSchema.methods.checkPassword = async function(givenPassword) { return await bcrypt.compare(givenPassword, this.password); }; const User = mongoose.model("User", userSchema); module.exports = User;