/* ============================================================================ *\
|| ########################################################################## ||
|| # 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!',
})
}
},
}