import axios from 'axios' import camelcaseObjectDeep from 'camelcase-object-deep' const productResponseMap = (products) => { return products.map((product) => { let productMapped = { id: product.product_id ? product.product_id[0] : '', image: product.image ? product.image[0] : '', code: product.default_code ? product.default_code[0] : '', name: product.product_name ? product.product_name[0] : '', lowestPrice: { price: product.price ? product.price[0] : 0, priceDiscount: product.price_discount ? product.price_discount[0] : 0, discountPercentage: product.discount ? product.discount[0] : 0 }, variantTotal: product.variant_total ? product.variant_total[0] : 0, stockTotal: product.stock_total ? product.stock_total[0] : 0, weight: product.weight ? product.weight[0] : 0, manufacture: {}, categories: [] } if (product.manufacture_id && product.brand) { productMapped.manufacture = { id: product.manufacture_id ? product.manufacture_id[0] : '', name: product.brand ? product.brand[0] : '' } } productMapped.categories = [ { id: product.category_id ? product.category_id[0] : '', name: product.category_name ? product.category_name[0] : '' } ] return productMapped }) } export default async function handler(req, res) { const { q = '*', page = 1, brand = '', category = '', priceFrom = 0, priceTo = 0, orderBy = '', operation = 'AND', fq = '' } = req.query let paramOrderBy = '' switch (orderBy) { case 'price-asc': paramOrderBy = ', price_discount ASC' break case 'price-desc': paramOrderBy = ', price_discount DESC' break case 'popular': paramOrderBy = ', search_rank DESC' break case 'stock': paramOrderBy = ', stock_total DESC' break } let limit = 30 let offset = (page - 1) * limit let parameter = [ 'facet.field=brand_str', 'facet.field=category_name_str', 'facet=true', 'indent=true', `facet.query=${q}`, `q.op=${operation}`, `q=${q}`, `start=${offset}`, `rows=${limit}`, `sort=product_rating DESC ${paramOrderBy}`, `fq=price_discount:[${priceFrom == '' ? '*' : priceFrom} TO ${priceTo == '' ? '*' : priceTo}]` ] if (brand) parameter.push(`fq=brand:${brand}`) if (category) parameter.push(`fq=category_name:${category}`) // Single fq in url params if (typeof fq === 'string') parameter.push(`fq=${fq}`) // Multi fq in url params if (Array.isArray(fq)) parameter = parameter.concat(fq.map((val) => `fq=${val}`)) let result = await axios(process.env.SOLR_HOST + '/solr/products/select?' + parameter.join('&')) try { result.data.response.products = productResponseMap(result.data.response.docs) result.data.responseHeader.params.start = parseInt(result.data.responseHeader.params.start) result.data.responseHeader.params.rows = parseInt(result.data.responseHeader.params.rows) delete result.data.response.docs result.data = camelcaseObjectDeep(result.data) res.status(200).json(result.data) } catch (error) { res.status(400).json({ error: error.message }) } }