const mongoose = require('mongoose'); const Schema = mongoose.Schema; const userSchema = new Schema({ name: { type: String, required: true }, email: { type: String, required: true }, cart: { items: [ { productId: { type: Schema.Types.ObjectId, ref: 'Product', required: true }, quantity: { type: Number, required: true } } ] } }); userSchema.methods.addToCart = function(product) { const cartProductIndex = this.cart.items.findIndex(cp => { return cp.productId.toString() === product._id.toString(); }); let newQuantity = 1; const updatedCartItems = [...this.cart.items]; if (cartProductIndex >= 0) { newQuantity = this.cart.items[cartProductIndex].quantity + 1; updatedCartItems[cartProductIndex].quantity = newQuantity; } else { updatedCartItems.push({ productId: product._id, quantity: newQuantity }); } const updatedCart = { items: updatedCartItems }; this.cart = updatedCart; return this.save(); }; userSchema.methods.removeFromCart = function(productId) { const updatedCartItems = this.cart.items.filter(item => { return item.productId.toString() !== productId.toString(); }); this.cart.items = updatedCartItems; return this.save(); }; userSchema.methods.clearCart = function() { this.cart = { items: [] }; return this.save(); }; module.exports = mongoose.model('User', userSchema); // const mongodb = require('mongodb'); // const getDb = require('../util/database').getDb; // const ObjectId = mongodb.ObjectId; // class User { // constructor(username, email, cart, id) { // this.name = username; // this.email = email; // this.cart = cart; // {items: []} // this._id = id; // } // save() { // const db = getDb(); // return db.collection('users').insertOne(this); // } // addToCart(product) { // const cartProductIndex = this.cart.items.findIndex(cp => { // return cp.productId.toString() === product._id.toString(); // }); // let newQuantity = 1; // const updatedCartItems = [...this.cart.items]; // if (cartProductIndex >= 0) { // newQuantity = this.cart.items[cartProductIndex].quantity + 1; // updatedCartItems[cartProductIndex].quantity = newQuantity; // } else { // updatedCartItems.push({ // productId: new ObjectId(product._id), // quantity: newQuantity // }); // } // const updatedCart = { // items: updatedCartItems // }; // const db = getDb(); // return db // .collection('users') // .updateOne( // { _id: new ObjectId(this._id) }, // { $set: { cart: updatedCart } } // ); // } // getCart() { // const db = getDb(); // const productIds = this.cart.items.map(i => { // return i.productId; // }); // return db // .collection('products') // .find({ _id: { $in: productIds } }) // .toArray() // .then(products => { // return products.map(p => { // return { // ...p, // quantity: this.cart.items.find(i => { // return i.productId.toString() === p._id.toString(); // }).quantity // }; // }); // }); // } // deleteItemFromCart(productId) { // const updatedCartItems = this.cart.items.filter(item => { // return item.productId.toString() !== productId.toString(); // }); // const db = getDb(); // return db // .collection('users') // .updateOne( // { _id: new ObjectId(this._id) }, // { $set: { cart: { items: updatedCartItems } } } // ); // } // addOrder() { // const db = getDb(); // return this.getCart() // .then(products => { // const order = { // items: products, // user: { // _id: new ObjectId(this._id), // name: this.name // } // }; // return db.collection('orders').insertOne(order); // }) // .then(result => { // this.cart = { items: [] }; // return db // .collection('users') // .updateOne( // { _id: new ObjectId(this._id) }, // { $set: { cart: { items: [] } } } // ); // }); // } // getOrders() { // const db = getDb(); // return db // .collection('orders') // .find({ 'user._id': new ObjectId(this._id) }) // .toArray(); // } // static findById(userId) { // const db = getDb(); // return db // .collection('users') // .findOne({ _id: new ObjectId(userId) }) // .then(user => { // console.log(user); // return user; // }) // .catch(err => { // console.log(err); // }); // } // } // module.exports = User;