| 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; |