front/controllers/cart/index.js

/* ============================================================================ *\
|| ########################################################################## ||
|| # Auction Software Marketplace          Release: 0.6   Build 0.7         # ||
|| # ---------------------------------------------------------------------- # ||
|| # License # 35YAHCNR9344X6O666C123AB                                     # ||
|| # ---------------------------------------------------------------------- # ||
|| # Copyright ©2014–2021 Develop Scripts LLC. All Rights Reserved          # ||
|| # This file may not be redistributed in whole or significant part.       # ||
|| # ------------- AUCTION SOFTWARE IS NOT FREE SOFTWARE ------------------ # ||
|| # http://www.auctionsoftwaremarketplace.com|support@auctionsoftware.com  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

/* eslint-disable prefer-destructuring */
/* eslint-disable no-param-reassign */
const cartModule = require('../../modules/cart').default

const commonFunction = require('../../../common/function').default
const userModule = require('../../modules/user').default
const Avalara = require('../../modules/tax/avalara').default

const cartCommonCtrl = require('./common')

const returnCtrl = require('../return')
const buynowCommonCtrl = require('../buynow/common')

const schemaModule = require('./schema').default
const { jsonResponse } = require('../logger')

const avalara = new Avalara()

const shortDescribeSCH = async (items) => {
    function changingdata(item) {
        item.avatarorg =
            item.file_name === '' || item.file_name === null
                ? `${global.s3_static_image_url}images/pics-coming.jpg`
                : `${global.s3_static_image_url}uploads/product/${item.file_name}`
        return item
    }
    const promises = items.map(changingdata)
    items = await Promise.all(promises)
    return items
}

/**
 * check and add to cart
 * @memberOf frontend.cart
 * @param {object} req request object
 * @param {object} res response object
 * @param {cartModule.checkUserProductExists} modules
 * @param {cartModule.changeCartStatus} modules
 */
const checkAndAddtoCart = async (req) => {
    let success = false
    const resultuser = await Promise.all([cartModule.checkUserProductExists(req, req.body.id)])
    if (resultuser[0].length > 0) {
        req.body.buynow_id = resultuser[0][0].id
        const cartChange = req.body.cart === 1 ? 1 : 0
        await Promise.all([cartModule.changeCartStatus(req, cartChange, req.body.buynow_id)])
        success = true
    } else {
        success = false
    }
    const responseData = { success }
    return responseData
}

/**
 * check and add to cart
 * @memberOf frontend.cart
 * @param {object} req request object
 * @param {cartModule.allCartItems} modules
 */
const getNonCartItems = async (req) => {
    const [nonCartItems] = await Promise.all([cartModule.allCartItems(req, req.body, 0)])
    const responseData = nonCartItems
    return responseData
}

module.exports = {
    checkAndAddtoCart,
    /**
     * Get Single Cart Details
     *
     * @memberOf frontend.cart
     * @param {frontend.cart.getSingleCartDetails} modules
     */
    singleCart: async (req, res) => {
        try {
            await schemaModule.search().validateSync(req.body)
            const [responseData] = await Promise.all([
                cartCommonCtrl.getSingleCartDetails(
                    req,
                    req.body.cart_id,
                    null,
                    req.body.invoice_id,
                ),
            ])

            // only cart user allowed to access
            if (responseData.cartValues && responseData.cartValues.user_id !== req.user.id) {
                jsonResponse(res, 'error', {
                    responseType: 3,
                    message: 'Access Denied!',
                })
                return
            }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * Search Cart Items
     *
     * @memberOf frontend.cart
     * @param {frontend.cart.getSingleCartDetails} modules
     * @param {cartModule.getAllCarts} modules
     */
    search: async (req, res) => {
        try {
            await schemaModule.search().validateSync(req.body)
            const allCarts = []
            const getallCartsFunction = async (cartID) => {
                const [responseData] = await Promise.all([
                    cartCommonCtrl.getSingleCartDetails(req, cartID),
                ])
                allCarts.push(responseData)
            }

            const [allCartsUsers, nonCartItems] = await Promise.all([
                cartModule.getAllCarts(req),
                getNonCartItems(req),
            ])

            await commonFunction.asyncForEach(allCartsUsers, async (carts) => {
                await getallCartsFunction(carts.id)
            })

            const responseData = {
                nonCartItems,
                cartItems: allCarts,
            }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * Get Pending Cart Items
     *
     * @memberOf frontend.cart
     * @param {cartModule.getAllPendingCartItems} modules
     * @param {cartModule.getAllPendingCartID} modules
     */
    pendingCount: async (req, res) => {
        try {
            const baseTableUsed = global.configColumns[req.body.table]
            req.body.filters = req.body.filters ? req.body.filters : {}
            req.body.filters.user_id = { value: req.user.id, field: 'user_id', type: 'in' }

            const [allPendingProducts] = await Promise.all([
                cartModule.getAllPendingCartItems(req, baseTableUsed),
            ])
            const responseData = {
                records: allPendingProducts,
                totalRecords: allPendingProducts.length,
            }

            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * Change Status of the cart
     *
     * @memberOf frontend.cart
     * @param {frontend.cart.checkAndAddtoCart} modules
     */
    changeStatus: async (req, res) => {
        try {
            await schemaModule.changeStatus().validateSync(req.body)
            const [response] = await Promise.all([checkAndAddtoCart(req)])
            if (response.success) {
                jsonResponse(res, 'success', {
                    responseType: 1,
                    message:
                        req.body.cart === 1
                            ? 'Successfully added to cart!'
                            : 'Successfully removed from cart!',
                })
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'Cart action failed!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * Cancel Item from one cart
     *
     * @memberOf frontend.cart
     * @param {frontend.cart.checkAndAddtoCart} modules
     * @param {frontend.return.relistProduct} modules
     */
    cancelItem: async (req, res) => {
        try {
            await schemaModule.changeStatus().validateSync(req.body)
            const [response] = await Promise.all([checkAndAddtoCart(req)])
            if (response.success) {
                await Promise.all([returnCtrl.relistProduct(req.body.id, 'relisted')])
                jsonResponse(res, 'success', {
                    responseType: 1,
                    message:
                        req.body.cart === 1
                            ? 'Successfully added to cart!'
                            : 'Successfully removed from cart!',
                })
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'Cart action failed!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * Save Address for the cart
     *
     * @memberOf frontend.cart
     * @param {cartModule.updateCartData} modules
     */
    saveAddress: async (req, res) => {
        try {
            await schemaModule.saveAddress().validateSync(req.body)
            await Promise.all([cartModule.updateCartData(req.body, req.body.cart_id)])
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Billing Address Updated!',
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },

    updateCheckout: async (req, res) => {
        try {
            const response = {}
            await Promise.all([cartModule.updateCheckout(req.body)])
            const [cartData] = await Promise.all([
                cartCommonCtrl.getSingleCartDetails(
                    req,
                    req.body.cart_id,
                    null,
                    req.body.invoice_id,
                    req.body.invoice_address_id,
                ),
            ])

            await commonFunction.asyncForEach(cartData.cartItems, async (singleItem) => {
                const cartItemDetails = singleItem

                cartItemDetails.product_type = 'live'
                const cartValues = await buynowCommonCtrl.cartItemsCalculations(cartItemDetails)
                await Promise.all([
                    buynowCommonCtrl.updateBuyNowCalculations(
                        cartValues,
                        cartItemDetails.id,
                        cartItemDetails.user_id,
                    ),
                ])
            })
            jsonResponse(res, 'success', {
                responseType: 1,
                message: ' Successfully Updated!',
                responseData: response,
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
}