summaryrefslogtreecommitdiff
path: root/src/pages/api/shop/search.js
blob: 72db04fd5094a338f951e6a8f05ec7cb758f83c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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}`,
    'sort=product_rating desc'
  ].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 });
  }
}