summaryrefslogtreecommitdiff
path: root/src/pages/api
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2022-11-11 18:02:11 +0700
committerIT Fixcomart <it@fixcomart.co.id>2022-11-11 18:02:11 +0700
commit8ee5432961a5b73e8e5c42af2eda05621723c9e7 (patch)
tree12b7e0628328f6f10f03b464ad0717a729e2ede0 /src/pages/api
parentdf04a3504e61f3c1257b5a46310e39c51bf23bea (diff)
Connect to solr (search product), header component with title, fix product card layout, show product search result
Diffstat (limited to 'src/pages/api')
-rw-r--r--src/pages/api/shop/search.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js
new file mode 100644
index 00000000..3c3a1766
--- /dev/null
+++ b/src/pages/api/shop/search.js
@@ -0,0 +1,71 @@
+import axios from "axios";
+
+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] : '',
+ lowest_price: {
+ price: product.price ? product.price[0] : 0,
+ price_discount: product.price_discount ? product.price_discount[0] : 0,
+ discount_percentage: product.discount ? product.discount[0] : 0,
+ },
+ variant_total: product.variant_total ? product.variant_total[0] : 0,
+ stock_total: 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
+ } = req.query;
+
+ let limit = 30;
+ let offset = (page - 1) * limit;
+
+ let parameter = [
+ `facet.query=${q}`,
+ 'facet=true',
+ 'indent=true',
+ 'q.op=AND',
+ `q=${q}`,
+ 'facet.field=brand_str',
+ 'facet.field=category_name_str',
+ `start=${offset}`,
+ `rows=${limit}`,
+ ].join('&');
+
+ let result = await axios(process.env.SOLR_HOST + '/solr/products/select?' + parameter);
+ 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;
+ res.status(200).json(result.data);
+ } catch (error) {
+ res.status(400).json({ error: error.message });
+ }
+} \ No newline at end of file