summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2024-04-05 02:09:16 +0000
committerIT Fixcomart <it@fixcomart.co.id>2024-04-05 02:09:16 +0000
commit8eb374869c950c3879d0b463729d1f078b38325a (patch)
tree120648da9742d21ba1a6d25aadb7bd08a78132b1
parenta44ddf0ff093e09a0c70c61c0f65287bb7fdcbf3 (diff)
parent1da58744fde2ef65a5cf24c8bf5d7d933c6d510b (diff)
Merged in feature/request-by-abl (pull request #132)
Add feature search only ready stock product
-rw-r--r--src/pages/api/shop/search.js118
1 files changed, 71 insertions, 47 deletions
diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js
index adb23511..10575d37 100644
--- a/src/pages/api/shop/search.js
+++ b/src/pages/api/shop/search.js
@@ -1,6 +1,6 @@
-import { productMappingSolr } from '@/utils/solrMapping'
-import axios from 'axios'
-import camelcaseObjectDeep from 'camelcase-object-deep'
+import { productMappingSolr } from '@/utils/solrMapping';
+import axios from 'axios';
+import camelcaseObjectDeep from 'camelcase-object-deep';
export default async function handler(req, res) {
const {
@@ -14,35 +14,36 @@ export default async function handler(req, res) {
operation = 'AND',
fq = '',
limit = 30,
- stock = ''
- } = req.query
+ } = req.query;
- let paramOrderBy = ''
+ let { stock = '' } = req.query;
+
+ let paramOrderBy = '';
switch (orderBy) {
case 'price-asc':
- paramOrderBy += 'price_tier1_v2_f ASC'
- break
+ paramOrderBy += 'price_tier1_v2_f ASC';
+ break;
case 'price-desc':
- paramOrderBy += 'price_tier1_v2_f DESC'
- break
+ paramOrderBy += 'price_tier1_v2_f DESC';
+ break;
case 'popular':
- paramOrderBy += 'product_rating_f DESC, search_rank_i DESC,'
- break
+ paramOrderBy += 'product_rating_f DESC, search_rank_i DESC,';
+ break;
case 'popular-weekly':
- paramOrderBy += 'search_rank_weekly_i DESC'
- break
+ paramOrderBy += 'search_rank_weekly_i DESC';
+ break;
case 'stock':
- paramOrderBy += 'product_rating_f DESC, stock_total_f DESC'
- break
+ paramOrderBy += 'product_rating_f DESC, stock_total_f DESC';
+ break;
case 'flashsale-price-asc':
- paramOrderBy += 'flashsale_price_f ASC'
- break
+ paramOrderBy += 'flashsale_price_f ASC';
+ break;
default:
- paramOrderBy += 'product_rating_f DESC, price_discount_f DESC'
- break
+ paramOrderBy += 'product_rating_f DESC, price_discount_f DESC';
+ break;
}
- let offset = (page - 1) * limit
+ let offset = (page - 1) * limit;
let parameter = [
'facet.field=manufacture_name_s',
'facet.field=category_name',
@@ -55,59 +56,82 @@ export default async function handler(req, res) {
`start=${parseInt(offset)}`,
`rows=${limit}`,
`sort=${paramOrderBy}`,
- `fq=-publish_b:false`
- ]
+ `fq=-publish_b:false`,
+ ];
if (priceFrom > 0 || priceTo > 0) {
parameter.push(
`fq=price_tier1_v2_f:[${priceFrom == '' ? '*' : priceFrom} TO ${
priceTo == '' ? '*' : priceTo
}]`
- )
+ );
+ }
+
+ let { auth } = req.cookies;
+ if (auth) {
+ auth = JSON.parse(auth);
+ if (auth.feature.onlyReadyStock) stock = true;
}
- if (brand) parameter.push(`fq=${brand.split(',').map(manufacturer => `manufacture_name:"${manufacturer}"`).join(" OR ")}`)
- if (category) parameter.push(`fq=${category.split(',').map(cat => `category_name:"${cat}"`).join(' OR ')}`)
+ if (brand)
+ parameter.push(
+ `fq=${brand
+ .split(',')
+ .map((manufacturer) => `manufacture_name:"${manufacturer}"`)
+ .join(' OR ')}`
+ );
+ if (category)
+ parameter.push(
+ `fq=${category
+ .split(',')
+ .map((cat) => `category_name:"${cat}"`)
+ .join(' OR ')}`
+ );
// if (category) parameter.push(`fq=category_name:${capitalizeFirstLetter(category.replace(/,/g, ' OR '))}`)
- if (stock) parameter.push(`fq=stock_total_f:{1 TO *}`)
+ if (stock) parameter.push(`fq=stock_total_f:{1 TO *}`);
// Single fq in url params
- if (typeof fq === 'string') parameter.push(`fq=${fq}`)
+ 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}`))
+ if (Array.isArray(fq))
+ parameter = parameter.concat(fq.map((val) => `fq=${val}`));
- let result = await axios(process.env.SOLR_HOST + '/solr/product/select?' + parameter.join('&'))
+ let result = await axios(
+ process.env.SOLR_HOST + '/solr/product/select?' + parameter.join('&')
+ );
try {
- let { auth } = req.cookies
- if (auth) auth = JSON.parse(auth)
result.data.response.products = productMappingSolr(
result.data.response.docs,
auth?.pricelist || false
- )
- 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)
+ );
+ 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 })
+ res.status(400).json({ error: error.message });
}
}
const escapeSolrQuery = (query) => {
- if (query == '*') return query
+ if (query == '*') return query;
- const specialChars = /([\+\-\!\(\)\{\}\[\]\^"~\*\?:\\\/])/g
- const words = query.split(/\s+/)
+ const specialChars = /([\+\-\!\(\)\{\}\[\]\^"~\*\?:\\\/])/g;
+ const words = query.split(/\s+/);
const escapedWords = words.map((word) => {
if (specialChars.test(word)) {
- return `"${word.replace(specialChars, '\\$1')}"`
+ return `"${word.replace(specialChars, '\\$1')}"`;
}
- return word
- })
+ return word;
+ });
- return escapedWords.join(' ')
-}
+ return escapedWords.join(' ');
+};
/*const productResponseMap = (products, pricelist) => {
return products.map((product) => {