=====удаление из корзины=====
**routes/card.js**
const {Router} = require('express');//или const express.Router = require('express'); - модуль express
//const Card = require('../models/card');
const Course = require('../models/course');
const router = Router();
/**
* Преоброзовать массив
* @param cart
* @returns {{count: *}[]}
*/
function mapCartItems(cart){
return cart.items.map(c => ({//Обежим массив и вернем его в нужном виде
...c.courseId._doc, count:c.count
}));
}
//посчитать итоговую стоимость
function computePrice(courses){
return courses.reduce((total, course) => {//обежим массив и вернем итоговую стоимость
return total += course.price* course.count;
}, 0);//изначально total ставим в 0(параметр метода reduce)
}
/**
* Удалить позицию в заказе
* первый параметр адрес страницы, в данном случае используется префикс при регистрации ройтера,
* с динамическим параметром id
* второй параметр callback - обработчик запроса req - request , запрос от браузера
*/
router.delete('/remove/:id', async (req, res)=>{
await req.user.removeFromCart(req.params.id);//Обращаемся к модели и удаляем позицию
const user = await req.user.populate('cart.items.courseId').execPopulate();//Получить данные корзины, из таблицы user
const courses = mapCartItems(user.cart);
const cart = {
courses, price: computePrice(courses)
};
res.status(200).json(cart);//возвращаем статус 200 и json строку
});
module.exports = router;//Экспортирум роутер
**models/user.js**
const {Schema, model} = require('mongoose');//подключаем из библиотеки монго,модульсоздания схемы - Schema,
// и модуль регистрации моделей - model
/**
* Схема пользователя
*
* В табличке пользователя сразу встраиваем корзину
* @type {*|Mongoose.Schema}
*/
const userSchema = new Schema({
email: {//email
type: String,
required: true
},
name: { //Имя пользователя
type: String, //строка
required: true //поле обязательное
},
cart: { //Корзина
items: [ //Позиции
{
count: { //колличество заказанных одинаковых курсов
type: Number, //тип число
required: true, //поле обязательно
default: 1
},
courseId: {
type: Schema.Types.ObjectId, //тип ObjectId
ref: 'Course', //связка с models/course.js
required: true //поле обязательно
}
}
]
}
});
/**
* Удалить позицию в заказе
* @param id - идентификатор позиции
* @returns {*}
*/
userSchema.methods.removeFromCart= function(id){
let items = [...this.cart.items];//Вернет склонированный массив es6, равносильно this.cart.items,
// метод позволяет избавится от мутаций
//const items = this.card.items.concat();//Вернет склонированный массив, равносильно this.cart.items,
// метод позволяет избавится от мутаций
const idx = items.findIndex(c => {//Ищем нужный курс по id
return c.courseId.toString() === id.toString();
});
if(items[idx].count === 1) {//если кооличество одинаковых курсов в еденичном экземпляре
items = items.filter( c => c.courseId.toString() !== id.toString() );//Удаляем нужный курс
}
else{
items[idx].count--;//Уменьшаем колличество заказанных курсов
}
this.cart = {items};//переопределяем корзину
return this.save()//сохраняем изменения
};
module.exports = model('User', userSchema); //Возврощаем схему, на нее можно вешать различные методы ,
// в частности update, save, delete и т.д.