const shared_consts = require('../tools/shared_nodejs'); const express = require('express'); const router = express.Router(); const sendemail = require('../sendemail'); const tools = require('../tools/general'); var server_constants = require('../tools/server_constants'); var { Project } = require('../models/project'); var { authenticate, auth_default } = require('../middleware/authenticate'); const _ = require('lodash'); const Product = require('../models/product'); const Order = require('../models/order'); const Variant = require('../models/variant'); /*const Department = require('../models/Department') const Category = require('../models/Category') const TypedError = require('../modules/ErrorHandler') const paypal_config = require('../configs/paypal-config') const paypal = require('paypal-rest-sdk') */ const CartClass = require('../modules/Cart') const Cart = require('../models/cart'); const OrdersCart = require('../models/orderscart'); //GET cart router.get('/:userId', authenticate, async function (req, res, next) { let userId = req.params.userId let idapp = req.user.idapp return await Cart.getCartByUserId(userId, idapp) .then((cart) => { if (cart) return res.send({ code: server_constants.RIS_CODE_OK, cart }); else return res.send({ code: server_constants.RIS_CODE_OK, cart: null }); }).catch((err) => { console.error('Err', err); return res.send({ code: server_constants.RIS_CODE_ERR, cart: null }); }); }) //POST cart router.post('/:userId', authenticate, async function (req, res, next) { let idapp = req.body.idapp; let userId = req.params.userId; let addqty = req.body.addqty; let subqty = req.body.subqty; let order = req.body.order; try { const mycart = await Cart.getCartByUserId(userId, idapp); // const myorder = Order.getOrderByID(order._id); if (!addqty && !subqty) order._id = await Order.createOrder(order); let cart = null; // no cart save empty cart to database then return response let myqty = 0; if (!mycart) { let oldCart = new CartClass(order) cart = await Cart.createCart(oldCart.generateModel()); } else { let newCart = CartClass.constructByCart(mycart); if (addqty) { myqty = await newCart.addqty(order); } else if (subqty) { myqty = await newCart.subqty(order); } else { const ind = newCart.addItem(order); } cart = await Cart.updateCartByCartId(mycart._id, newCart.generateModel()); } if (cart) { const carttot = await Cart.getCartByUserId(userId, idapp); return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot, qty: myqty }); } else { return res.send({ code: server_constants.RIS_CODE_ERR, cart: null }); } /* Cart.updateCartByUserId( userId, newCart, function (err, result) { if (err) return next(err) return res.status(200).json({ cart: result }) }) */ } catch (e) { console.error('Err:', e); return res.send({ code: server_constants.RIS_CODE_ERR, cart: 0 }); } }) router.delete('/:userId', authenticate, async function (req, res) { console.log('DELETE Item'); let idapp = req.query.idapp; let userId = req.params.userId; let orderId = req.query.orderId; const mycart = await Cart.getCartByUserId(userId, idapp); // Rimuovere l'Ordine const recremoved = await Order.findByIdAndRemove(orderId); if (recremoved) { // Rimuovere l'id sul Carrello let newCart = CartClass.constructByCart(mycart); newCart.removeItem(orderId); let carttot = null; const cart = await Cart.updateCartByCartId(mycart._id, newCart.generateModel()); carttot = await Cart.getCartByUserId(userId, idapp); console.log('carttot', carttot) return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot }); } return res.send({ code: server_constants.RIS_CODE_ERR, cart: null }); }); //PUT cart router.put('/:userId', authenticate, async function (req, res, next) { let userId = req.params.userId let requestProduct = req.body let { productId, color, size } = requestProduct.product try { await Cart.getCartByUserId(userId, function (err, c) { if (err) return next(err) let oldCart = new CartClass(c[0] || {}) Product.getProductByID(productId, function (err, p) { if (err) return next(err) let newCart = oldCart.add(p, productId, { color, size }) //exist cart in databse if (c.length > 0) { Cart.updateCartByUserId( userId, { items: newCart.items, totalQty: newCart.totalQty, totalPrice: newCart.totalPrice, userId: userId }, function (err, result) { if (err) return next(err) res.json(result) }) } else { //no cart in database newCart = new Cart({ items: newCart.items, totalQty: newCart.totalQty, totalPrice: newCart.totalPrice, userId: userId }) Cart.createCart(newCart, function (err, resultCart) { if (err) return next(err) res.status(201).json(resultCart) }) } }) }) return res.send({ code: server_constants.RIS_CODE_OK }); } catch (e) { return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 }); } }) //POST cart router.post('/:userId/cartstatus', authenticate, async function (req, res, next) { let idapp = req.body.idapp; let userId = req.params.userId; let cart_id = req.body.cart_id; const user = req.user; let status = req.body.status; const mycart = await Cart.getCartByUserId(userId, idapp); const numorder = await OrdersCart.getNewNumOrder(userId, idapp); let statusOrderCart = await OrdersCart.getStatusCartByUserId(userId, idapp, numorder); try { if (!!mycart) { if (status === shared_consts.OrderStatus.CHECKOUT_SENT) { // Porta tutto il Cart nell'Ordine const newOrderCart = new OrdersCart({ idapp, items: mycart.items, totalQty: mycart.totalQty, totalPrice: mycart.totalPrice, userId, status, note: mycart.note, numorder, created_at: new Date(), modify_at: new Date(), }) return await OrdersCart.updateOrdersCartById(-1, newOrderCart, function (err, ris) { //if (err) return next(err) if (err) return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 }); else { const myris = ris; // Cancella il Cart appena salvato in OrdersCart return Cart.deleteCartByCartId(mycart.id) .then((ris) => { const orders = OrdersCart.getOrdersCartByUserId(userId, idapp, numorder) .then((orders) => { if (!!orders) { sendemail.sendEmail_OrderProduct(user.lang, idapp, orders[0], user) .then((ris) => { return res.send({ code: server_constants.RIS_CODE_OK, status: myris.status, orders: orders }); }); } }); }) } }) // mycart.numorder = await Cart.getNewNumOrder(userId, idapp); // mycart.status = shared_consts.OrderStatus.CHECKOUT_CONFIRMED /* const status = await Cart.findOneAndUpdate( { userId }, { $set: { status: mycart.status, numorder: mycart.numorder } }, { new: false }) .then((rec) => { return rec.status }) */ } } return res.send({ code: server_constants.RIS_CODE_OK, status: statusOrderCart }); } catch (e) { return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 }); } }); //POST cart router.post('/:userId/orderstatus', authenticate, async function (req, res, next) { let idapp = req.body.idapp; let userId = req.params.userId; let order_id = req.body.order_id; const user = req.user; let status = req.body.status; const orderCart = await OrdersCart.find({ idapp, _id: order_id }); if ((userId !== String(req.user._id)) && !User.isManager(req.user.perm)) { // I'm trying to write something not mine! return res.status(404).send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER }); } try { if (!!orderCart) { let fields_to_update = { status }; if (status === shared_consts.OrderStatus.RECEIVED) { fields_to_update = { status, completed_at: new Date() } } await OrdersCart.findOneAndUpdate({ _id: order_id }, { $set: fields_to_update } , { new: false }) .then((ris) => { if (ris) { let ordertype = ''; if (status === shared_consts.OrderStatus.ORDER_CONFIRMED) { ordertype = 'order_confirmed'; } else if (status === shared_consts.OrderStatus.RECEIVED) { ordertype = 'order_completed'; } else if (status === shared_consts.OrderStatus.CANCELED) { ordertype = 'order_canceled'; } if (ordertype !== '') { sendemail.sendEmail_Order(user.lang, idapp, orderCart[0], user, ordertype) .then((ris) => { }) } } }) return res.send({ code: server_constants.RIS_CODE_OK, status }); } } catch (e) { return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 }); } }); module.exports = router;